네, MySQL에서는 INSERT INTO ... SELECT 구문을 사용하여 SELECT 쿼리 결과를 다른 테이블에 바로 삽입하는 중첩 INSERT를 구현할 수 있습니다.
기본 문법
INSERT INTO 테이블명2(컬럼1, 컬럼2, .....N) SELECT 컬럼1, 컬럼2, ....N FROM 테이블명1 WHERE 조건;
아래 예제를 통해 실제 동작 과정을 단계별로 살펴보겠습니다.
1단계: 첫 번째 테이블 생성
mysql> CREATE TABLE DemoTable1
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name varchar(40)
);
Query OK, 0 rows affected (0.88 sec)2단계: 첫 번째 테이블에 데이터 삽입
mysql> INSERT INTO DemoTable1(Name) VALUES('Chris');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO DemoTable1(Name) VALUES('David');
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO DemoTable1(Name) VALUES('Bob');
Query OK, 1 row affected (0.12 sec)3단계: 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> SELECT * FROM DemoTable1;
실행 결과는 다음과 같습니다.
+----+-------+ | Id | Name | +----+-------+ | 1 | Chris | | 2 | David | | 3 | Bob | +----+-------+ 3 rows in set (0.00 sec)
4단계: 두 번째 테이블 생성
mysql> CREATE TABLE DemoTable2
(
ClientId int,
ClientFirstName varchar(20)
);
Query OK, 0 rows affected (0.60 sec)5단계: INSERT INTO ... SELECT로 중첩 삽입 실행
이제 SELECT 문을 활용해 DemoTable1의 데이터를 DemoTable2로 삽입합니다. 이때 WHERE 절을 사용해 특정 조건에 맞는 레코드만 선택할 수도 있습니다.
mysql> INSERT INTO DemoTable2(ClientId, ClientFirstName) SELECT Id, Name FROM DemoTable1 WHERE Id != 2; Query OK, 2 rows affected (0.17 sec) Records : 2 Duplicates: 0 Warnings : 0
6단계: 결과 확인
mysql> SELECT * FROM DemoTable2;
실행 결과는 다음과 같습니다.
+----------+-----------------+ | ClientId | ClientFirstName | +----------+-----------------+ | 1 | Chris | | 3 | Bob | +----------+-----------------+ 2 rows in set (0.00 sec)
정리
위 예제에서 볼 수 있듯이, INSERT INTO ... SELECT 구문은 원본 테이블(DemoTable1)에서 Id가 2가 아닌 레코드만 골라 대상 테이블(DemoTable2)에 성공적으로 삽입했습니다. 이 방식은 테이블 간 데이터 복사, 백업 테이블 생성, 조건에 맞는 데이터 이관 등 다양한 상황에서 유용하게 활용할 수 있습니다.