MySQL에서 INSERT와 SELECT 문 결합하기
MySQL에서는 INSERT 문과 SELECT 문을 결합하여 한 테이블의 데이터를 다른 테이블로 손쉽게 복사할 수 있습니다. 이 방법은 VALUES 절에 값을 일일이 나열하는 대신, 기존 테이블에서 조회한 결과를 그대로 새 테이블에 삽입할 때 매우 유용합니다.
기본 문법은 다음과 같습니다.
INSERT INTO 첫번째테이블명(컬럼명1, 컬럼명2, ...컬럼명N) SELECT 컬럼명1, 컬럼명2, ...컬럼명N FROM 두번째테이블명 WHERE 조건;
위 문법을 실제로 이해하기 위해 두 개의 테이블을 만들어 보겠습니다. 첫 번째 테이블은 두 번째 테이블의 레코드를 받아오는 역할을 합니다.
1단계: 데이터를 받을 첫 번째 테이블 생성
먼저 레코드가 없는 빈 테이블을 생성합니다. 테이블 생성 쿼리는 다음과 같습니다.
mysql> create table CombiningInsertValuesSelect -> ( -> EmployeeId varchar(10), -> EmployeeName varchar(100), -> EmployeeAge int -> ); Query OK, 0 rows affected (6.95 sec)
2단계: 원본 데이터가 있는 두 번째 테이블 생성
이제 실제 데이터를 담고 있을 두 번째 테이블을 생성합니다.
mysql> create table getAllValues -> ( -> Id varchar(100), -> Name varchar(100), -> Age int -> ); Query OK, 0 rows affected (1.12 sec)
3단계: 두 번째 테이블에 레코드 삽입
'getAllValues' 테이블에 INSERT 명령어를 사용해 레코드를 추가합니다.
mysql> insert into getAllValues values('EMP-1','John',26);
Query OK, 1 row affected (0.86 sec)
mysql> insert into getAllValues values('EMP-2','Carol',22);
Query OK, 1 row affected (0.36 sec)
mysql> insert into getAllValues values('EMP-3','Sam',24);
Query OK, 1 row affected (0.28 sec)
mysql> insert into getAllValues values('EMP-4','David',27);
Query OK, 1 row affected (0.25 sec)
mysql> insert into getAllValues values('EMP-5','Bob',21);
Query OK, 1 row affected (0.75 sec)4단계: 삽입된 데이터 확인
SELECT 문을 사용해 테이블의 모든 레코드를 조회합니다.
mysql> select *from getAllValues;
실행 결과는 다음과 같습니다.
+-------+-------+------+ | Id | Name | Age | +-------+-------+------+ | EMP-1 | John | 26 | | EMP-2 | Carol | 22 | | EMP-3 | Sam | 24 | | EMP-4 | David | 27 | | EMP-5 | Bob | 21 | +-------+-------+------+ 5 rows in set (0.00 sec)
5단계: INSERT와 SELECT 문 결합 실행
이제 핵심인 INSERT와 SELECT 문의 결합을 살펴보겠습니다. 'getAllValues' 테이블에서 조건에 맞는 레코드만 골라 'CombiningInsertValuesSelect' 테이블에 삽입합니다.
mysql> insert into CombiningInsertValuesSelect(EmployeeId,EmployeeName,EmployeeAge) -> select Id,Name,Age from getAllValues where Id='EMP-4'; Query OK, 1 row affected (0.23 sec) Records: 1 Duplicates: 0 Warnings: 0
WHERE 절에 Id='EMP-4' 조건을 지정했기 때문에 해당 직원의 데이터만 선택되어 새 테이블에 삽입됩니다. 조건을 생략하면 모든 레코드가 한 번에 복사됩니다.
6단계: 결과 확인
SELECT 문으로 레코드가 정상적으로 삽입되었는지 확인합니다.
mysql> select *from CombiningInsertValuesSelect;
실행 결과는 다음과 같습니다.
+------------+--------------+-------------+ | EmployeeId | EmployeeName | EmployeeAge | +------------+--------------+-------------+ | EMP-4 | David | 27 | +------------+--------------+-------------+ 1 row in set (0.00 sec)
정리
이처럼 MySQL에서는 INSERT INTO ... SELECT 구문을 활용하면 한 테이블의 데이터를 조건에 따라 다른 테이블로 효율적으로 복사할 수 있습니다. 대량의 데이터를 이전하거나 백업 테이블을 만들 때 특히 유용한 기법이므로 꼭 익혀두시기 바랍니다.