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

MySQL에서 UNION ALL을 활용해 단일 쿼리로 두 테이블에 레코드 삽입하는 방법

MySQL에서 UNION ALL로 두 테이블에 레코드 한 번에 삽입하기

MySQL에서는 INSERT INTO ... SELECT 문과 UNION ALL을 결합하면 하나의 쿼리만으로 여러 테이블에 레코드를 동시에 삽입할 수 있습니다. 이 방식은 SELECT 문으로 기존 테이블의 데이터를 조회한 뒤, 그 결과를 다른 테이블에 그대로 저장하는 원리로 동작합니다. 아래 예제를 통해 실제 사용 방법을 단계별로 살펴보겠습니다.

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단계: UNION ALL을 활용한 단일 쿼리 삽입

아래는 단 하나의 MySQL 쿼리로 레코드를 조회하고 동시에 삽입하는 핵심 쿼리입니다. UNION ALL을 사용하면 동일한 이름 'Chris'에 서로 다른 점수(89점, 98점)를 가진 두 개의 행이 생성되어 첫 번째 테이블에 한꺼번에 들어갑니다.

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

6단계: 최종 결과 확인

이제 첫 번째 테이블에서 레코드를 조회해 삽입이 정상적으로 이루어졌는지 확인할 수 있습니다.

mysql> select * from DemoTable1;

실행 결과는 다음과 같습니다.

+-------------+--------------+
| StudentName | StudentMarks |
+-------------+--------------+
| Chris       |           89 |
| Chris       |           98 |
+-------------+--------------+
2 rows in set (0.00 sec)

UNION ALL과 UNION의 차이점

참고로 UNION ALL은 중복된 행까지 모두 포함하여 결과를 반환하는 반면, 일반 UNION은 중복 행을 자동으로 제거합니다. 위 예제처럼 의도적으로 중복 데이터를 유지하고 싶다면 UNION ALL을 사용하는 것이 적합하며, 성능 면에서도 중복 검사를 생략하는 UNION ALL이 더 빠르게 동작한다는 장점이 있습니다.