MySQL에서 SELECT 결과를 그대로 INSERT 할 수 있을까?
결론부터 말하면 가능합니다. MySQL에서는 INSERT INTO ... SELECT 구문을 사용하면 다른 테이블의 조회(SELECT) 결과를 그대로 새 테이블에 삽입할 수 있습니다. 이때 일반적인 INSERT 문처럼 VALUES 절을 사용할 필요가 전혀 없다는 점이 핵심입니다.
실제 동작 과정을 확인하기 위해 두 개의 테이블을 만들고, 두 번째 테이블의 데이터를 첫 번째 테이블로 복사해 보겠습니다.
1단계: 첫 번째 테이블 생성
먼저 데이터를 받아올 대상 테이블(FirstTableDemo)을 생성합니다.
mysql> create table FirstTableDemo
-> (
-> StudentId int,
-> StudentName varchar(100)
-> );
Query OK, 0 rows affected (0.41 sec)2단계: 두 번째 테이블 생성
이어서 원본 데이터가 들어 있을 테이블(SecondTableDemo)을 만듭니다.
mysql> create table SecondTableDemo
-> (
-> Id int,
-> Name varchar(100)
-> );
Query OK, 0 rows affected (0.47 sec)3단계: 두 번째 테이블에 레코드 삽입
일반적인 INSERT 문으로 샘플 데이터를 입력합니다.
mysql> insert into SecondTableDemo values(1,'John'); Query OK, 1 row affected (0.14 sec) mysql> insert into SecondTableDemo values(2,'Sam'); Query OK, 1 row affected (0.27 sec)
4단계: 저장된 데이터 확인
SELECT 문으로 두 번째 테이블의 전체 레코드를 조회합니다.
mysql> select *from SecondTableDemo;
실행 결과는 다음과 같습니다.
+------+------+ | Id | Name | +------+------+ | 1 | John | | 2 | Sam | +------+------+ 2 rows in set (0.00 sec)
5단계: INSERT ... SELECT 문으로 데이터 복사
이제 INSERT INTO ... SELECT 구문을 사용해 두 번째 테이블의 모든 레코드를 첫 번째 테이블에 삽입합니다. 아래 쿼리에는 NOT IN 서브쿼리가 포함되어 있는데, 이는 이미 존재하는 StudentId와 중복되는 데이터가 삽입되지 않도록 방지하는 역할을 합니다.
mysql> insert into FirstTableDemo(StudentId,StudentName)
-> select Id,Name from SecondTableDemo as tbl1
-> where tbl1.Id not in (select StudentId from FirstTableDemo);
Query OK, 2 rows affected (0.57 sec)
Records: 2 Duplicates: 0 Warnings: 0실행 결과를 보면 2개의 레코드가 성공적으로 삽입되었고, 중복(Duplicates)은 0건입니다.
6단계: 최종 결과 교차 검증
첫 번째 테이블을 다시 조회하여 데이터가 정상적으로 복사되었는지 확인합니다.
mysql> select *from FirstTableDemo;
실행 결과는 다음과 같습니다.
+-----------+-------------+ | StudentId | StudentName | +-----------+-------------+ | 1 | John | | 2 | Sam | +-----------+-------------+ 2 rows in set (0.00 sec)
INSERT ... SELECT 활용 팁
- 테이블 간 데이터 복사: 백업 테이블을 만들거나, 운영 데이터를 통계용 테이블로 옮길 때 유용합니다.
- 컬럼 개수 일치: SELECT 절에서 반환하는 컬럼의 개수와 순서는 INSERT 대상 컬럼 목록과 반드시 일치해야 하며, 데이터 타입도 호환되어야 합니다.
- 중복 방지: 위 예제처럼
NOT IN,NOT EXISTS또는ON DUPLICATE KEY UPDATE등을 함께 사용하면 중복 삽입을 효과적으로 막을 수 있습니다. - 대량 데이터 처리: VALUES 절로 한 건씩 넣는 것보다 INSERT ... SELECT가 서버 왕복 횟수가 적어 대량 데이터 처리 시 성능상 유리합니다.
이처럼 MySQL에서는 VALUES 절 없이도 SELECT 문의 결과를 그대로 다른 테이블에 삽입할 수 있습니다. 조건(WHERE), 정렬(ORDER BY), 조인(JOIN) 등 SELECT 문에서 사용할 수 있는 모든 기능을 그대로 활용할 수 있다는 점도 큰 장점입니다.