INSERT 문과 서브쿼리의 활용
MySQL에서는 INSERT 문 안에 SELECT 서브쿼리(하위 쿼리)를 사용하여 한 테이블의 데이터를 다른 테이블로 손쉽게 복사할 수 있습니다. 이해를 돕기 위해 'cars' 테이블의 데이터를 'copy_cars' 테이블로 복사하는 예제를 살펴보겠습니다.
1단계: 복사 대상 테이블 생성
먼저 원본 테이블인 'cars'와 동일한 구조를 가진 'copy_cars' 테이블을 생성합니다.
mysql> CREATE TABLE copy_cars LIKE cars;
Query OK, 0 rows affected (0.86 sec)
mysql> SELECT * from copy_cars;
Empty set (0.08 sec)
'CREATE TABLE ... LIKE' 구문을 사용하면 기존 테이블과 똑같은 구조(컬럼, 데이터 타입 등)를 가진 새 테이블을 만들 수 있습니다. 위 결과에서 볼 수 있듯이, 아직 데이터가 없으므로 조회 결과는 비어 있습니다(Empty set).
2단계: 서브쿼리를 활용한 데이터 삽입
이제 INSERT 문에 SELECT 서브쿼리를 결합하여 'cars' 테이블의 모든 데이터를 'copy_cars' 테이블에 그대로 삽입합니다.
mysql> INSERT INTO Copy_cars Select * from Cars;
Query OK, 8 rows affected (0.07 sec)
위 쿼리는 'cars' 테이블에서 조회된 8개 행 전체를 'copy_cars' 테이블에 한 번에 삽입합니다. 별도의 VALUES 절 없이 SELECT 결과가 곧바로 삽입되는 방식입니다.
3단계: 결과 확인
데이터가 정상적으로 복사되었는지 확인해 보겠습니다.
mysql> SELECT * from copy_cars;
+------+--------------+---------+
| ID | Name | Price |
+------+--------------+---------+
| 1 | Nexa | 750000 |
| 2 | Maruti Swift | 450000 |
| 3 | BMW | 4450000 |
| 4 | VOLVO | 2250000 |
| 5 | Alto | 250000 |
| 6 | Skoda | 1250000 |
| 7 | Toyota | 2400000 |
| 8 | Ford | 1100000 |
+------+--------------+---------+
8 rows in set (0.00 sec)
'cars' 테이블의 모든 데이터가 'copy_cars' 테이블에 동일하게 복사된 것을 확인할 수 있습니다.
정리
이처럼 INSERT INTO 대상테이블 SELECT ... FROM 원본테이블 형태의 서브쿼리를 사용하면, VALUES 절에 값을 일일이 나열하지 않고도 테이블 간 데이터를 빠르고 간편하게 복사할 수 있습니다. 또한 WHERE 절을 추가하면 특정 조건에 맞는 데이터만 선택적으로 삽입하는 것도 가능하므로, 백업 테이블 생성이나 데이터 마이그레이션 작업 시 매우 유용하게 활용됩니다.