MySQL UNION으로 두 테이블 데이터를 단일 쿼리로 조회하기
MySQL에서는 UNION 연산자를 사용하면 여러 SELECT 문의 결과를 하나의 결과 집합으로 합쳐서 반환할 수 있습니다. 이번 글에서는 두 개의 테이블을 생성한 뒤, 단일 쿼리로 두 테이블의 데이터를 동시에 조회하는 방법을 단계별로 살펴보겠습니다.
1. 첫 번째 테이블 생성
먼저 DemoTable1이라는 이름의 테이블을 생성합니다.
mysql> create table DemoTable1
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
FirstName varchar(20)
);
Query OK, 0 rows affected (0.90 sec)2. 첫 번째 테이블에 데이터 삽입
INSERT 명령어를 사용해 샘플 레코드를 추가합니다.
mysql> insert into DemoTable1(FirstName) values('Chris');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable1(FirstName) values('Adam');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable1(FirstName) values('Sam');
Query OK, 1 row affected (0.16 sec)3. 첫 번째 테이블 데이터 확인
SELECT 문으로 저장된 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable1;
실행 결과는 다음과 같습니다.
+----+-----------+ | Id | FirstName | +----+-----------+ | 1 | Chris | | 2 | Adam | | 3 | Sam | +----+-----------+ 3 rows in set (0.00 sec)
4. 두 번째 테이블 생성 및 데이터 삽입
같은 구조로 DemoTable2를 생성하고 레코드를 삽입합니다.
mysql> create table DemoTable2(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
FirstName varchar(20)
);
Query OK, 0 rows affected (1.75 sec)
mysql> insert into DemoTable2(FirstName) values('John');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable2(FirstName) values('Tom');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable2(FirstName) values('Bob');
Query OK, 1 row affected (0.50 sec)DemoTable2의 데이터도 확인해 보겠습니다.
+----+-----------+ | Id | FirstName | +----+-----------+ | 1 | John | | 2 | Tom | | 3 | Bob | +----+-----------+ 3 rows in set (0.00 sec)
5. UNION으로 두 테이블 한 번에 조회하기
이제 UNION 연산자를 사용해 두 테이블의 데이터를 하나의 쿼리로 조회하고, ORDER BY 절로 FirstName 기준 오름차순 정렬까지 적용해 보겠습니다.
mysql> (select *from DemoTable1)
union
(select *from DemoTable2)
order by FirstName;실행하면 두 테이블의 모든 레코드가 하나의 결과 집합으로 합쳐져 출력됩니다.
+----+-----------+ | Id | FirstName | +----+-----------+ | 2 | Adam | | 3 | Bob | | 1 | Chris | | 1 | John | | 3 | Sam | | 2 | Tom | +----+-----------+ 6 rows in set (0.00 sec)
정리
UNION은 각 SELECT 문의 컬럼 수와 데이터 타입이 일치할 때 사용할 수 있으며, 기본적으로 중복된 행을 제거한 결과를 반환합니다. 중복 행까지 모두 포함하고 싶다면 UNION ALL을 사용하면 됩니다. 또한 ORDER BY 절은 전체 UNION 결과에 대해 마지막에 한 번만 적용한다는 점도 기억해 두면 좋습니다.