MySQL에서 두 개의 열에 걸쳐 중복되지 않는(DISTINCT) 값을 선택하려면 least()와 greatest() 함수를 함께 사용하면 됩니다. 이 방법은 두 열의 값을 서로 비교하여 작은 값과 큰 값을 각각 정렬한 뒤, 그 결과를 기준으로 고유한 조합만 추출하는 방식입니다.
1. 테스트용 테이블 생성하기
먼저 두 개의 열을 가진 테이블을 생성해 보겠습니다.
mysql> create table SelectDistinctTwoColumns -> ( -> StudentId int, -> EmployeeId int -> ); Query OK, 0 rows affected (0.60 sec)
2. 레코드 삽입하기
이제 테이블에 데이터를 삽입합니다. 일부러 중복된 값과 순서가 뒤바뀐 값(예: 105,104)도 함께 넣어 DISTINCT 처리 과정을 확인해 보겠습니다.
mysql> insert into SelectDistinctTwoColumns values(100,101); Query OK, 1 row affected (0.39 sec) mysql> insert into SelectDistinctTwoColumns values(102,103); Query OK, 1 row affected (0.13 sec) mysql> insert into SelectDistinctTwoColumns values(104,105); Query OK, 1 row affected (0.18 sec) mysql> insert into SelectDistinctTwoColumns values(100,101); Query OK, 1 row affected (0.14 sec) mysql> insert into SelectDistinctTwoColumns values(102,103); Query OK, 1 row affected (0.12 sec) mysql> insert into SelectDistinctTwoColumns values(106,107); Query OK, 1 row affected (0.36 sec) mysql> insert into SelectDistinctTwoColumns values(104,105); Query OK, 1 row affected (0.17 sec) mysql> insert into SelectDistinctTwoColumns values(105,104); Query OK, 1 row affected (0.35 sec)
3. 전체 데이터 확인하기
SELECT 문을 사용해 테이블의 모든 레코드를 조회합니다.
mysql> select *from SelectDistinctTwoColumns;
실행 결과는 다음과 같습니다.
+-----------+------------+ | StudentId | EmployeeId | +-----------+------------+ | 100 | 101 | | 102 | 103 | | 104 | 105 | | 100 | 101 | | 102 | 103 | | 106 | 107 | | 104 | 105 | | 105 | 104 | +-----------+------------+ 8 rows in set (0.00 sec)
위 출력 결과를 보면 (100,101), (102,103), (104,105)처럼 중복된 행이 여러 개 존재하고, 마지막 행은 열 순서만 뒤바뀐 (105,104) 값임을 알 수 있습니다.
4. least()와 greatest()로 DISTINCT 값 추출하기
두 열의 고유한 값 조합을 구하려면 아래 쿼리를 실행합니다. least()는 두 값 중 작은 값을, greatest()는 큰 값을 반환하므로, 열 순서가 뒤바뀐 중복 데이터까지 하나의 조합으로 통일됩니다.
mysql> select distinct least(StudentId, EmployeeId) as FirstColumn, -> greatest(StudentId, EmployeeId) as SecondColumn from SelectDistinctTwoColumns;
실행 결과는 다음과 같습니다.
+-------------+--------------+ | FirstColumn | SecondColumn | +-------------+--------------+ | 100 | 101 | | 102 | 103 | | 104 | 105 | | 106 | 107 | +-------------+--------------+ 4 rows in set (0.00 sec)
결과 정리
원래 8개의 행이 있었지만, least()와 greatest() 함수를 적용한 결과 중복이 모두 제거되어 단 4개의 고유한 값 조합만 남았습니다. 특히 (104,105)와 (105,104)처럼 순서만 다른 데이터도 동일한 조합으로 인식되어 하나로 병합된 점이 핵심입니다. 이처럼 least()와 greatest()를 DISTINCT와 함께 활용하면 두 열 간의 중복 데이터를 손쉽게 정리할 수 있습니다.