MySQL에서 하나의 쿼리로 SELECT와 INSERT 동시에 처리하기
MySQL에서는 INSERT INTO ... SELECT 문과 UNION ALL을 조합하면 단일 쿼리만으로 다른 테이블의 데이터를 조회하면서 새로운 테이블에 삽입할 수 있습니다. 이번 글에서는 실제 예제를 통해 그 과정을 단계별로 살펴보겠습니다.
1단계: 첫 번째 테이블 생성
먼저 학생 이름과 점수를 저장할 첫 번째 테이블을 생성합니다.
mysql> create table DemoTable1 -> ( -> StudentName varchar(20), -> StudentMarks int -> ); Query OK, 0 rows affected (0.67 sec)
2단계: 두 번째 테이블 생성
개념을 이해하기 위해 이름만 저장하는 두 번째 테이블도 만들어 보겠습니다.
mysql> create table DemoTable2 -> ( -> Name varchar(20) -> ); Query OK, 0 rows affected (0.61 sec)
3단계: 두 번째 테이블에 레코드 삽입
INSERT 명령을 사용해 두 번째 테이블에 샘플 데이터를 추가합니다.
mysql> insert into DemoTable2 values('Chris');
Query OK, 1 row affected (0.12 sec)4단계: 삽입된 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 봅니다.
mysql> select * from DemoTable2;
실행 결과는 다음과 같습니다.
+-------+ | Name | +-------+ | Chris | +-------+ 1 row in set (0.00 sec)
5단계: 단일 쿼리로 선택과 삽입 동시에 수행
이제 핵심 부분입니다. 아래 쿼리처럼 INSERT INTO와 SELECT, 그리고 UNION ALL을 함께 사용하면 하나의 MySQL 쿼리로 레코드를 선택하고 삽입할 수 있습니다.
mysql> insert into DemoTable1 -> select Name,89 from DemoTable2 -> union all -> select Name,98 from DemoTable2; Query OK, 2 rows affected (0.15 sec) Records: 2 Duplicates: 0 Warnings: 0
위 쿼리는 DemoTable2에서 'Chris'라는 이름을 조회한 뒤, 각각 89점과 98점이라는 서로 다른 점수를 붙여 두 개의 행으로 DemoTable1에 삽입합니다.
6단계: 결과 확인
첫 번째 테이블에서 레코드를 조회해 삽입이 정상적으로 이루어졌는지 확인합니다.
mysql> select * from DemoTable1;
실행 결과는 다음과 같습니다.
+-------------+--------------+ | StudentName | StudentMarks | +-------------+--------------+ | Chris | 89 | | Chris | 98 | +-------------+--------------+ 2 rows in set (0.00 sec)
정리
이처럼 INSERT INTO ... SELECT ... UNION ALL 구문을 활용하면 별도의 여러 쿼리를 실행하지 않고도 한 번의 요청으로 데이터를 조회하고 변형하여 다른 테이블에 삽입할 수 있습니다. 대량의 데이터를 복사하거나 점수처럼 고정된 값을 추가하며 데이터를 이관할 때 특히 유용한 기법입니다.