MySQL에서 한 테이블의 데이터를 조회한 결과를 그대로 다른 테이블에 삽입해야 하는 경우가 자주 있습니다. 이럴 때 INSERT ... SELECT 구문을 활용하면 별도의 중간 과정 없이 쿼리 결과만으로 새 테이블을 손쉽게 채울 수 있습니다.
INSERT ... SELECT 기본 문법
쿼리 결과로 테이블을 채우려면 아래와 같은 구문을 사용합니다.
INSERT yourTableName(yourColumnName1,yourColumnName2,yourColumnName3,..........N) SELECT yourColumnName1,yourColumnName2,yourColumnName3,..........N FROM yourAnotherTableName;
즉, 대상 테이블에 삽입할 컬럼 목록을 지정하고, SELECT 절에서 원본 테이블의 컬럼들을 순서대로 매핑하면 됩니다.
예제용 첫 번째 테이블 생성
문법을 실제로 이해하기 위해 먼저 예제 테이블을 만들어 보겠습니다. 아래 쿼리로 PopulateTableDemo 테이블을 생성합니다.
mysql> create table PopulateTableDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> Name varchar(20),
-> Amount int,
-> ArrivalDateTime datetime,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.68 sec)샘플 데이터 삽입
이제 INSERT 명령으로 몇 개의 레코드를 추가합니다.
mysql> insert into PopulateTableDemo(Name,Amount,ArrivalDateTime) values('John',456,'2018-02-4');
Query OK, 1 row affected (0.17 sec)
mysql> insert into PopulateTableDemo(Name,Amount,ArrivalDateTime) values('Carol',1000,'2019-10-21');
Query OK, 1 row affected (0.17 sec)
mysql> insert into PopulateTableDemo(Name,Amount,ArrivalDateTime) values('Sam',970,'2019-07-25');
Query OK, 1 row affected (0.14 sec)
mysql> insert into PopulateTableDemo(Name,Amount,ArrivalDateTime) values('Larry',1050,'2015-10-28');
Query OK, 1 row affected (0.16 sec)저장된 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from PopulateTableDemo;
실행 결과는 다음과 같습니다.
+----+-------+--------+---------------------+ | Id | Name | Amount | ArrivalDateTime | +----+-------+--------+---------------------+ | 1 | John | 456 | 2018-02-04 00:00:00 | | 2 | Carol | 1000 | 2019-10-21 00:00:00 | | 3 | Sam | 970 | 2019-07-25 00:00:00 | | 4 | Larry | 1050 | 2015-10-28 00:00:00 | +----+-------+--------+---------------------+ 4 rows in set (0.00 sec)
두 번째 테이블 생성
이번에는 위 테이블의 값을 가져올 두 번째 테이블을 만듭니다. 컬럼명은 다르지만 데이터 타입은 호환되도록 구성했습니다.
mysql> create table PopulateQueryFromAnotherTable -> ( -> Id int NOT NULL AUTO_INCREMENT, -> UserName varchar(20), -> Salary int, -> DepartureDateTime datetime, -> PRIMARY KEY(Id) -> ); Query OK, 0 rows affected (1.30 sec)
쿼리 결과로 새 테이블 채우기
이제 첫 번째 테이블인 PopulateTableDemo의 데이터를 PopulateQueryFromAnotherTable로 옮겨 담습니다. 원본의 Name, Amount, ArrivalDateTime 컬럼이 각각 UserName, Salary, DepartureDateTime 컬럼에 순서대로 매핑됩니다.
mysql> insert PopulateQueryFromAnotherTable(UserName,Salary,DepartureDateTime) -> select Name,Amount,ArrivalDateTime from PopulateTableDemo; Query OK, 4 rows affected (0.15 sec) Records: 4 Duplicates: 0 Warnings: 0
실행 결과를 보면 4개의 레코드가 성공적으로 삽입되었고, 중복이나 경고 없이 처리된 것을 확인할 수 있습니다.
결과 검증
마지막으로 SELECT 문으로 두 번째 테이블의 레코드를 확인합니다.
mysql> select *from PopulateQueryFromAnotherTable;
실행 결과는 다음과 같습니다.
+----+----------+--------+---------------------+ | Id | UserName | Salary | DepartureDateTime | +----+----------+--------+---------------------+ | 1 | John | 456 | 2018-02-04 00:00:00 | | 2 | Carol | 1000 | 2019-10-21 00:00:00 | | 3 | Sam | 970 | 2019-07-25 00:00:00 | | 4 | Larry | 1050 | 2015-10-28 00:00:00 | +----+----------+--------+---------------------+ 4 rows in set (0.00 sec)
정리 및 참고 사항
이처럼 INSERT ... SELECT 구문을 사용하면 한 테이블의 데이터를 다른 테이블로 간편하게 복사할 수 있습니다. 실무에서 활용할 때는 다음 사항을 함께 고려하면 좋습니다.
- 컬럼 순서 일치: INSERT 절의 컬럼 목록과 SELECT 절의 컬럼 목록은 개수와 순서가 서로 대응되어야 합니다.
- 데이터 타입 호환성: 양쪽 테이블의 컬럼 타입이 호환되지 않으면 암시적 형변환 오류나 데이터 손실이 발생할 수 있습니다.
- WHERE 조건 활용: SELECT 절에 WHERE 조건을 추가하면 전체 데이터가 아닌 필요한 행만 선택적으로 복사할 수 있습니다.
- AUTO_INCREMENT 처리: 위 예제처럼 Id 컬럼을 제외하고 삽입하면 새 테이블의 AUTO_INCREMENT 값이 자동으로 부여됩니다.