MySQL에서 여러 열에 흩어져 있는 값들을 중복 없이 하나의 열로 모아서 조회해야 하는 경우가 있습니다. 이럴 때는 UNION을 단일 쿼리 안에서 여러 번 사용하면 간단하게 해결할 수 있습니다. UNION은 기본적으로 중복된 값을 제거하고 결과를 반환하기 때문에, 각 열의 값을 합치면서 자동으로 고유한(distinct) 값만 남길 수 있습니다.
1. 테이블 생성하기
먼저 예제로 사용할 테이블을 만들어 보겠습니다.
mysql> create table DemoTable
-> (
-> Value1 int,
-> Value2 int,
-> Value3 int
-> );
Query OK, 0 rows affected (0.69 sec)2. 샘플 데이터 삽입하기
INSERT 명령을 사용해 몇 개의 레코드를 추가합니다. 일부 행에는 NULL 값이 포함되어 있고, 일부 행에는 여러 열에 값이 들어 있습니다.
mysql> insert into DemoTable values(20,null,null); Query OK, 1 row affected (0.19 sec) mysql> insert into DemoTable values(20,null,null); Query OK, 1 row affected (0.11 sec) mysql> insert into DemoTable values(20,null,null); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable values(10,null,null); Query OK, 1 row affected (0.10 sec) mysql> insert into DemoTable values(80,20,100); Query OK, 1 row affected (0.09 sec) mysql> insert into DemoTable values(10,null,null); Query OK, 1 row affected (0.16 sec)
3. 저장된 데이터 확인하기
SELECT 문으로 테이블의 전체 레코드를 조회해 봅니다.
mysql> select *from DemoTable;
실행 결과는 다음과 같습니다.
+--------+--------+--------+ | Value1 | Value2 | Value3 | +--------+--------+--------+ | 20 | NULL | NULL | | 20 | NULL | NULL | | 20 | NULL | NULL | | 10 | NULL | NULL | | 80 | 20 | 100 | | 10 | NULL | NULL | +--------+--------+--------+ 6 rows in set (0.00 sec)
4. 세 개의 열을 하나로 합쳐 고유한 값만 조회하기
아래 쿼리는 세 개의 열(Value1, Value2, Value3)에서 고유한 값을 추출하여 하나의 열로 표시합니다. 각 SELECT 결과를 UNION으로 결합한 뒤, 서브쿼리에서 NULL이 아닌 값만 필터링하고 오름차순으로 정렬했습니다.
mysql> select *from
-> (
-> select Value1 as AllValue from DemoTable
-> union
-> select Value2 as AllValue from DemoTable
-> union
-> select Value3 as AllValue from DemoTable
-> ) tbl where AllValue IS NOT NULL
-> order by AllValue;실행 결과는 다음과 같습니다.
+----------+ | AllValue | +----------+ | 10 | | 20 | | 80 | | 100 | +----------+ 4 rows in set (0.00 sec)
핵심 정리
이 방식의 핵심 포인트는 다음과 같습니다.
- UNION 활용: UNION은 중복을 자동으로 제거하므로, 별도의 DISTINCT 처리 없이 고유한 값만 얻을 수 있습니다.
- NULL 필터링: 빈 열이 많은 테이블에서는 NULL 값이 함께 반환되므로, WHERE 절에서 IS NOT NULL 조건으로 걸러주는 것이 좋습니다.
- 별칭(Alias) 지정: 각 SELECT 문에서 동일한 별칭(AllValue)을 사용하면 최종 결과의 열 이름이 깔끔하게 유지됩니다.
이처럼 UNION을 여러 번 조합하면 여러 열에 분산된 데이터를 손쉽게 하나의 고유한 값 목록으로 변환할 수 있습니다.