Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 쿼리 결과로 테이블 채우기: INSERT INTO SELECT 완벽 가이드

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 값이 자동으로 부여됩니다.