MySQL에서는 UNION 연산자와 CREATE TABLE 문을 함께 사용하면 두 개의 테이블 데이터를 하나로 병합한 새로운 테이블을 손쉽게 만들 수 있습니다.
기본 문법
두 테이블을 병합하여 새 테이블을 생성하는 기본 문법은 다음과 같습니다.
create table yourTableName ( select *from yourTableName1 ) UNION ( select *from yourTableName2 );
UNION은 두 SELECT 결과를 합치면서 중복된 행을 자동으로 제거합니다. 중복을 유지하고 싶다면 UNION 대신 UNION ALL을 사용하면 됩니다. 단, 병합하려는 두 테이블은 컬럼의 개수와 순서가 일치해야 합니다.
예제 테이블 생성하기
먼저 첫 번째 테이블을 생성하는 쿼리입니다.
mysql> create table Old_TableDemo -> ( -> UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY, -> UserName varchar(20) -> ); Query OK, 0 rows affected (0.63 sec)
이어서 두 번째 테이블을 생성합니다.
mysql> create table Old_TableDemo2 -> ( -> UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY, -> UserName varchar(20) -> ); Query OK, 0 rows affected (0.60 sec)
데이터 삽입 및 확인
INSERT 명령으로 첫 번째 테이블에 레코드를 추가합니다.
mysql> insert into Old_TableDemo(UserName) values('John');
Query OK, 1 row affected (0.22 sec)
mysql> insert into Old_TableDemo(UserName) values('Carol');
Query OK, 1 row affected (0.15 sec)SELECT 문으로 첫 번째 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from Old_TableDemo;
실행 결과는 다음과 같습니다.
+--------+----------+ | UserId | UserName | +--------+----------+ | 1 | John | | 2 | Carol | +--------+----------+ 2 rows in set (0.00 sec)
같은 방식으로 두 번째 테이블에도 레코드를 삽입합니다.
mysql> insert into Old_TableDemo2(UserName) values('Larry');
Query OK, 1 row affected (0.22 sec)
mysql> insert into Old_TableDemo2(UserName) values('Sam');
Query OK, 1 row affected (0.10 sec)두 번째 테이블의 전체 레코드를 확인합니다.
mysql> select *from Old_TableDemo2;
실행 결과는 다음과 같습니다.
+--------+----------+ | UserId | UserName | +--------+----------+ | 1 | Larry | | 2 | Sam | +--------+----------+ 2 rows in set (0.00 sec)
UNION으로 병합된 새 테이블 생성
이제 UNION을 사용해 두 테이블을 병합한 새 테이블을 생성하는 쿼리입니다.
mysql> create table UserTableDemo -> ( -> select *from Old_TableDemo -> ) -> UNION -> ( -> select *from Old_TableDemo2 -> ); Query OK, 4 rows affected (1.18 sec) Records: 4 Duplicates: 0 Warnings: 0
새로 생성된 테이블의 레코드를 조회해 보겠습니다.
mysql> select *from UserTableDemo;
실행 결과는 다음과 같습니다.
+--------+----------+ | UserId | UserName | +--------+----------+ | 1 | John | | 2 | Carol | | 1 | Larry | | 2 | Sam | +--------+----------+ 4 rows in set (0.00 sec)
위 결과에서 볼 수 있듯이, 두 테이블의 데이터가 모두 새 테이블에 병합되었습니다. 참고로 이 방식으로 생성된 테이블에는 원본 테이블의 PRIMARY KEY나 AUTO_INCREMENT 속성이 그대로 이전되지 않으므로, 필요하다면 ALTER TABLE로 인덱스와 제약 조건을 별도로 추가하는 것이 좋습니다.