제34장. INSERT (2)
"조회한 결과를 그대로 저장할 수 있을까요?"
학습 목표
이번 장을 학습하면 다음 내용을 할 수 있습니다.
- 여러 개의 데이터를 한 번에 추가할 수 있다.
- SELECT 문의 결과를 다른 테이블에 저장할 수 있다.
- INSERT ... SELECT 문을 작성할 수 있다.
- 실제 업무에서 INSERT ... SELECT가 어떻게 활용되는지 설명할 수 있다.
지난 시간을 떠올려 봅시다.
지난 시간에는 새로운 데이터를 직접 입력하는 방법을 배웠습니다.
예를 들어 새로운 고객을 추가하려면 다음과 같이 작성했습니다.
INSERT INTO Customers
(
CustomerID,
CustomerName,
Country
)
VALUES
(
100,
'홍길동',
'Korea'
);
이 방법은 입력할 데이터가 적을 때는 매우 편리합니다.
그런데 이런 상황이라면 어떨까요?
"독일 고객만 따로 모아서 새로운 테이블에 저장하고 싶어요."
한 명씩 다시 입력해야 할까요?
그럴 필요는 없습니다.
SELECT의 결과도 저장할 수 있습니다.
우리는 지금까지
SELECT
를 이용하여 데이터를 조회했습니다.
그런데 조회한 결과를
바로 다른 테이블에 저장할 수도 있습니다.
이때 사용하는 문장이
INSERT ... SELECT입니다.
기본 문법
INSERT INTO 테이블이름
(
컬럼1,
컬럼2,
...
)
SELECT
컬럼1,
컬럼2,
...
FROM 원본테이블;
VALUES 대신
SELECT가 들어간다는 점이 가장 큰 특징입니다.
먼저 새로운 테이블을 준비합니다.
실습을 위해 다음과 같은 테이블이 있다고 가정합니다.
KoreaCustomers
| CustomerID | CustomerName | Country |
이제 Customers 테이블에서
대한민국 고객만 저장해 보겠습니다.
예제 1
INSERT INTO KoreaCustomers
(
CustomerID,
CustomerName,
Country
)
SELECT
CustomerID,
CustomerName,
Country
FROM Customers
WHERE Country = 'Korea';
실행 결과
Customers
↓
대한민국 고객만 선택
↓
KoreaCustomers에 저장
대한민국 고객이 모두
새로운 테이블에 추가됩니다.
한 명씩 입력하지 않아도 됩니다.
SQL를 한 줄씩 살펴보기
INSERT INTO KoreaCustomers
데이터를 저장할 테이블입니다.
(CustomerID,
CustomerName,
Country)
저장할 컬럼을 지정합니다.
SELECT
복사할 데이터를 조회합니다.
WHERE Country = 'Korea'
대한민국 고객만 선택합니다.
그림으로 이해하기
Customers
SELECT
──────────────▶
대한민국 고객
──────────────▶
INSERT
──────────────▶
KoreaCustomers
즉,
조회한 결과가
그대로 저장됩니다.
여러 행도 한 번에 저장됩니다.
조회 결과가
1명이든
10명이든
1,000명이든
모두 한 번에 저장됩니다.
이것이
INSERT ... SELECT의 가장 큰 장점입니다.
실제 업무에서는?
실무에서는 다음과 같은 작업에 자주 사용됩니다.
- 올해 가입한 회원만 별도로 저장하기
- 퇴사한 직원 정보를 보관용 테이블로 이동하기
- 판매가 완료된 주문을 백업 테이블에 저장하기
- 특정 지역 고객만 마케팅 대상 테이블로 복사하기
수천 건의 데이터를 한 번에 처리할 수 있기 때문에
매우 자주 사용됩니다.
많이 하는 실수
실수 ①
컬럼 개수가 다르다.
INSERT INTO KoreaCustomers
(
CustomerID,
CustomerName
)
SELECT
CustomerID
FROM Customers;
컬럼 수가 서로 같아야 합니다.
실수 ②
컬럼의 자료형이 다르다.
예를 들어
숫자를 저장하는 컬럼에
문자를 넣으려고 하면 오류가 발생할 수 있습니다.
실수 ③
WHERE 조건을 작성하지 않는다.
INSERT INTO KoreaCustomers
SELECT *
FROM Customers;
원하지 않는 데이터까지
모두 저장될 수 있습니다.
실무에서는 특히 주의해야 합니다.
실무 습관
INSERT ... SELECT를 실행하기 전에 SELECT만 먼저 실행해 보세요.
예를 들어
SELECT
CustomerID,
CustomerName,
Country
FROM Customers
WHERE Country='Korea';
결과가 원하는 데이터인지 확인한 후
앞에
INSERT INTO KoreaCustomers
만 추가하면
실수를 크게 줄일 수 있습니다.
실무에서는 거의 모든 개발자가 사용하는 습관입니다.
한눈에 정리
| 목적 | SQL |
| 직접 값을 입력한다. | INSERT ... VALUES |
| 조회한 결과를 저장한다. | INSERT ... SELECT |
이번 장 핵심 정리
✅ 여러 행을 한 번에 저장할 수 있다.
✅ SELECT 결과를 다른 테이블에 저장할 수 있다.
✅ INSERT ... SELECT는 실무에서 매우 많이 사용된다.
✅ INSERT하기 전에 SELECT만 먼저 실행하여 결과를 확인하는 습관이 중요하다.
연습 문제
기본 문제
① Customers 테이블의 모든 고객을 BackupCustomers 테이블에 저장하는 SQL을 작성하시오.
② Products 테이블의 상품명을 ProductBackup 테이블에 저장하는 SQL을 작성하시오.
응용 문제
① 독일(Germany) 고객만 GermanyCustomers 테이블에 저장하는 SQL을 작성하시오.
② 가격이 30 이상인 상품만 ExpensiveProducts 테이블에 저장하는 SQL을 작성하시오.
도전 문제
Customers 테이블에서
국가가 USA 또는 UK인 고객만
EnglishCustomers 테이블에 저장하는 SQL을 작성하시오.
정답
기본 문제
INSERT INTO BackupCustomers
(
CustomerID,
CustomerName,
Country
)
SELECT
CustomerID,
CustomerName,
Country
FROM Customers;
응용 문제
INSERT INTO GermanyCustomers
(
CustomerID,
CustomerName,
Country
)
SELECT
CustomerID,
CustomerName,
Country
FROM Customers
WHERE Country = 'Germany';
'프로그래밍 > MySQL' 카테고리의 다른 글
| 📊 [SQL] 제35장 INSERT(3) - 번호를 직접 입력하지 않아도 될까요? (0) | 2026.07.10 |
|---|---|
| 📊 [SQL] 제33장 INSERT - 이제 데이터를 추가해 볼까요? (0) | 2026.07.10 |
| 📊 [SQL] 제32장 서브쿼리(3) - FROM절에서 사용하는 서브쿼리 (0) | 2026.07.10 |
| 📊 [SQL] 제31장 서브쿼리(2) - 여러 개의 결과를 반환하는 서브쿼리 (0) | 2026.07.09 |
| 📊 [SQL] 제30장 서브쿼리 - SELECT 안에 또 SELECT를 사용할 수 있을까요? (0) | 2026.07.08 |