UNION으로 여러 개의 MySQL SELECT 쿼리 결합하기
MySQL에서 여러 개의 복잡한 SELECT 쿼리 결과를 하나로 합쳐야 할 때 가장 좋은 방법은 UNION을 사용하는 것입니다. UNION은 각 쿼리의 컬럼 수와 데이터 타입이 서로 호환되기만 하면, 서로 다른 테이블에서 조회한 결과도 손쉽게 하나의 결과 집합으로 묶어 줍니다.
실제 예제를 통해 확인해 보겠습니다.
1. 첫 번째 테이블 생성
mysql> create table DemoTable1 (Value1 int, Value2 int);
Query OK, 0 rows affected (0.62 sec)
2. 첫 번째 테이블에 데이터 삽입
mysql> insert into DemoTable1 values(10,29);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1 values(100,190);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable1 values(40,101);
Query OK, 1 row affected (0.12 sec)
3. 첫 번째 테이블 조회
mysql> select * from DemoTable1;
실행 결과는 다음과 같습니다.
+--------+--------+
| Value1 | Value2 |
+--------+--------+
| 10 | 29 |
| 100 | 190 |
| 40 | 101 |
+--------+--------+
3 rows in set (0.00 sec)
4. 두 번째 테이블 생성 및 데이터 삽입
mysql> create table DemoTable2 (Number1 int, Number2 int);
Query OK, 0 rows affected (0.49 sec)
mysql> insert into DemoTable2 values(100,290);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable2 values(200,390);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable2 values(50,170);
Query OK, 1 row affected (0.12 sec)
5. 두 번째 테이블 조회
mysql> select * from DemoTable2;
실행 결과는 다음과 같습니다.
+---------+---------+
| Number1 | Number2 |
+---------+---------+
| 100 | 290 |
| 200 | 390 |
| 50 | 170 |
+---------+---------+
3 rows in set (0.00 sec)
6. UNION으로 두 쿼리 결합하기
이제 UNION을 사용해 두 테이블의 SELECT 결과를 하나로 합쳐 보겠습니다. 주목할 점은 두 번째 쿼리에서 AS를 이용해 컬럼 이름을 Value1, Value2로 맞춰 주었다는 것입니다. UNION으로 결합된 결과는 첫 번째 SELECT 문의 컬럼 이름을 따르므로, 컬럼명을 일치시켜 주면 결과를 해석하기가 훨씬 명확해집니다.
mysql> (select Value1, Value2 from DemoTable1)
union
(select Number1 AS Value1, Number2 AS Value2 from DemoTable2)
order by Value1 DESC;
위 쿼리의 실행 결과는 다음과 같습니다.
+--------+--------+
| Value1 | Value2 |
+--------+--------+
| 200 | 390 |
| 100 | 290 |
| 100 | 190 |
| 50 | 170 |
| 40 | 101 |
| 10 | 29 |
+--------+--------+
6 rows in set (0.04 sec)
UNION 사용 시 알아두면 좋은 점
- 중복 제거: 기본 UNION은 결과에서 중복된 행을 자동으로 제거합니다. 위 예제에서 Value1이 100인 행이 두 개 존재하지만 Value2 값이 달라(290, 190) 모두 출력되었습니다.
- 중복 허용: 중복 행까지 모두 포함하고 싶다면
UNION ALL을 사용하세요. 성능 면에서도 중복 검사를 생략하므로 UNION보다 빠른 경우가 많습니다. - 정렬 위치: ORDER BY는 마지막에 한 번만 작성하며, 전체 결합 결과에 적용됩니다. 개별 SELECT 문 안에 넣으면 오류가 발생할 수 있습니다.
- 컬럼 조건: 결합하려는 각 SELECT 문은 컬럼 수가 같아야 하며, 대응되는 컬럼의 데이터 타입도 호환되어야 합니다.
이처럼 UNION을 활용하면 구조가 비슷한 여러 테이블의 조회 결과를 하나의 흐름으로 처리할 수 있어, 리포트 작성이나 데이터 통합 작업에서 매우 유용합니다.