[SQL] INSERT INTO 문 완벽 정복: 기초부터 고급 활용까지 (예제 포함)
데이터베이스에서 테이블을 만들었다면, 이제 그 안을 채워야겠죠? 데이터가 없는 테이블은 앙꼬 없는 찐빵과 같아요. 테이블에 생명을 불어넣는 작업, 바로 데이터 입력입니다. SQL에서는 INSERT INTO
명령어를 사용하여 이 중요한 작업을 수행합니다.
오늘은 INSERT INTO
문의 기본 사용법부터 다른 테이블의 데이터를 활용하는 고급 방법, 그리고 실제 예제를 통해 여러 행을 한 번에 효율적으로 입력하는 방법까지 차근차근 알아보겠습니다.
1. INSERT INTO 기본 사용법: 한땀 한땀 값 채우기
가장 기본적인 데이터 입력 방식입니다. 테이블의 특정 컬럼에 직접 값을 지정하여 한 행(row) 또는 여러 행의 데이터를 추가합니다.
기본 구조 (단일 행):
INSERT INTO 테이블명 (컬럼1, 컬럼2, 컬럼3, ...)
VALUES (값1, 값2, 값3, ...);
테이블명
: 데이터를 추가할 대상 테이블의 이름입니다.(컬럼1, 컬럼2, ...)
: 값을 입력할 컬럼들을 명시합니다. 이 부분을 생략하면 테이블에 정의된 모든 컬럼 순서대로 값을 입력해야 합니다.VALUES (값1, 값2, ...)
: 지정된 컬럼에 실제로 들어갈 값들입니다. 컬럼 목록의 순서와 VALUES 목록의 값 순서, 그리고 데이터 타입이 일치해야 합니다.
1.1. 실전 예제: 사용자 정보 추가하기
실제 데이터베이스 환경에서 어떻게 사용되는지 기본 예제를 통해 살펴보겠습니다. SQL을 웹에서 바로 사용할 수 있는 사이트인 db-fiddle.com에서 다음 코드를 그대로 붙여 넣으시면 됩니다.
이 웹사이트가 궁금하다면 사용 과정을 포스팅 해 놓았습니다. 너무 간단해서 굳이 보지 않으셔도 상관 없습니다.
먼저, 사용자 정보를 저장할 users
테이블을 생성합니다. 이때 한국어와 같은 다양한 문자를 제대로 저장하기 위해 CHARACTER SET utf8mb4
를 지정하는 것이 중요합니다.
1. db-fiddle에서 Schema SQL 창에 다음을 입력하세요.
-- 테이블 생성 (한국어 등 다양한 문자 지원을 위해 utf8mb4 사용)
CREATE TABLE users (
UserID VARCHAR(20) PRIMARY KEY,
UserName VARCHAR(50),
Email VARCHAR(100),
Point INT
) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
이제 이 users
테이블에 두 명의 사용자 정보를 한 번의 INSERT INTO
문으로 추가해 보겠습니다. 여러 행을 추가할 때는 VALUES
절 뒤에 각 행에 해당하는 값 목록을 쉼표(,
)로 구분하여 나열합니다.
2. db-fiddle에서 Schema SQL 창에 위에서 입력한 코드 뒤에 다음을 입력하세요.
-- 여러 사용자 데이터 한 번에 삽입
INSERT INTO users (UserID, UserName, Email, Point) VALUES
('user001', '김철수', 'old@example.com', 1000),
('user002', '이영희', 'young@example.com', 1500);
이제 데이터가 잘 입력되었는지 SELECT
문으로 확인해 봅시다.
3. db-fiddle에서 다음을 Query SQL 창에 삽입하세요.
-- 데이터 확인
SELECT * FROM users;
결과:
4. db-fiddle에서 run 버튼을 누르거나, Ctrl+Enter를 누르면 SQL이 실행되어 다음 결과가 나타납니다.
UserID | UserName | Point | |
---|---|---|---|
user001 | 김철수 | old@example.com | 1000 |
user002 | 이영희 | young@example.com | 1500 |
이렇게 여러 행의 데이터를 한 번의 명령으로 입력하면, 여러 번 INSERT
문을 실행하는 것보다 효율적입니다.
포인트:
- 문자열 값은 작은따옴표(
'
)로 감싸줍니다. (예: '김철수', 'user001') - 숫자 값은 따옴표 없이 사용합니다. (예: 1000)
- 날짜 값도 보통 작은따옴표로 감싸며, 데이터베이스 시스템에 따라 형식(예: 'YYYY-MM-DD')을 맞춰야 합니다. (위 예제에는 없음)
- 컬럼 목록을 생략할 경우,
VALUES
절에는 테이블 정의 시 컬럼 순서대로 모든 값을 제공해야 합니다. - 다국어(예: 한국어) 데이터를 저장할 때는 테이블 생성 시
CHARACTER SET utf8mb4
와 같이 적절한 문자셋을 지정해야 글자 깨짐 현상을 방지할 수 있습니다.
2. INSERT INTO 고급 활용: 다른 테이블에서 데이터 가져오기 (SELECT 활용)
때로는 기존 테이블의 데이터를 기반으로 새로운 데이터를 생성하거나, 특정 조건에 맞는 데이터만 골라 다른 테이블에 복사하고 싶을 때가 있습니다. 이럴 때 SELECT
문을 INSERT INTO
문과 함께 사용하면 매우 편리합니다.
기본 구조:
INSERT INTO 타겟_테이블명 (컬럼1, 컬럼2, ...)
SELECT 소스_컬럼A, 소스_컬럼B, ...
FROM 소스_테이블명
WHERE 조건;
타겟_테이블명
: 데이터가 추가될 테이블입니다.(컬럼1, 컬럼2, ...)
:SELECT
문을 통해 가져온 값을 저장할 타겟 테이블의 컬럼들입니다. 이 목록은SELECT
되는 컬럼 목록과 순서 및 데이터 타입이 호환되어야 합니다.SELECT 소스_컬럼A, 소스_컬럼B, ... FROM 소스_테이블명 WHERE 조건;
: 이 부분이 바로 데이터를 가져오는SELECT
쿼리입니다.SELECT
문의 결과로 나오는 행들이타겟_테이블명
에 삽입됩니다.
2.1. 실전 예제: 활성 프리미엄 사용자 정보 복사하기
db-fiddle.com을 통해 실제 사용 예시를 살펴보겠습니다. all_users
라는 테이블에는 전체 사용자 정보가 있고, 이 중에서 "활성 상태(IsActive = 1
)"이면서 "포인트가 2000점 이상(Point >= 2000
)"인 사용자들의 특정 정보(UserID
, UserName
, Email
)만을 active_premium_users
라는 다른 테이블로 복사하는 상황을 가정해 봅시다.
Schema (테이블 구조 및 초기 데이터): 먼저, 두 개의 테이블을 준비합니다. - Schema SQL 창에 붙여넣기
-- 소스 테이블: all_users
CREATE TABLE all_users (
UserID VARCHAR(20) PRIMARY KEY,
UserName VARCHAR(50),
Email VARCHAR(100),
Point INT,
IsActive BOOLEAN -- 0 for inactive, 1 for active
) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
INSERT INTO all_users (UserID, UserName, Email, Point, IsActive) VALUES
('user001', '김철수', 'cheolsu@example.com', 1000, 1),
('user002', '이영희', 'younghee@example.com', 2500, 1),
('user003', '박지성', 'jisung@example.com', 3000, 0),
('user004', '손흥민', 'sonny@example.com', 500, 1),
('user005', '김연아', 'yuna@example.com', 2200, 1),
('user006', '류현진', 'ryu@example.com', 1800, 0);
-- 타겟 테이블: active_premium_users (초기에는 비어 있음)
CREATE TABLE active_premium_users (
UserID VARCHAR(20) PRIMARY KEY,
UserName VARCHAR(50),
Email VARCHAR(100)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Query (데이터 복사 및 확인):
이제 INSERT INTO ... SELECT
문을 사용하여 조건에 맞는 데이터를 복사합니다. - Query SQL 창에 붙여넣기
-- all_users 테이블에서 조건에 맞는 사용자의 정보를 active_premium_users 테이블로 복사
INSERT INTO active_premium_users (UserID, UserName, Email)
SELECT
UserID, -- all_users.UserID -> active_premium_users.UserID
UserName, -- all_users.UserName -> active_premium_users.UserName
Email -- all_users.Email -> active_premium_users.Email
FROM
all_users -- 데이터를 가져올 소스 테이블
WHERE
IsActive = 1 AND Point >= 2000; -- 복사할 데이터의 조건
-- active_premium_users 테이블의 내용 확인
SELECT * FROM active_premium_users;
이 명령을 실행하면, all_users
테이블에서 IsActive
가 1이고 Point
가 2000 이상인 '이영희'와 '김연아'의 UserID
, UserName
, Email
정보가 active_premium_users
테이블에 새로운 행으로 추가됩니다.
결과 (active_premium_users
테이블):
UserID | UserName | |
---|---|---|
user002 | 이영희 | younghee@example.com |
user005 | 김연아 | yuna@example.com |
이처럼 INSERT INTO ... SELECT
구문은 특정 조건에 따라 데이터를 필터링하고, 필요한 컬럼만 선택하여 다른 테이블로 효율적으로 이전하거나 백업하는 데 매우 유용하게 사용될 수 있습니다.
3. INSERT INTO 사용 시 주의사항: 실수 없이 데이터 입력하기
INSERT INTO
문을 사용할 때 몇 가지 주의할 점이 있습니다. 이를 지키지 않으면 오류가 발생하거나 원치 않는 데이터가 입력될 수 있습니다.
- 테이블은 미리 만들어 두세요!: 데이터를 삽입할 테이블은 당연히 미리 존재해야 합니다.
CREATE TABLE
문을 사용해 테이블 구조를 먼저 정의해야 합니다. - 컬럼 순서와 데이터 타입, 개수를 맞춰주세요!:
VALUES
절에 제공하는 값들은 지정된 (또는 테이블 전체) 컬럼의 순서, 데이터 타입, 개수와 정확히 일치해야 합니다.INSERT INTO ... SELECT
구문에서도SELECT
되는 컬럼들과INSERT INTO
될 컬럼들의 순서, 타입, 개수가 맞아야 합니다.
- NOT NULL 컬럼은 필수!: 테이블 컬럼 정의 시
NOT NULL
제약 조건이 설정된 컬럼에는 반드시 값을 입력해야 합니다. 해당 컬럼을 생략하거나NULL
값을 입력하려고 하면 오류가 발생합니다. - 고유 키(Primary Key) 및 유니크(Unique) 제약 조건: PK나 Unique 제약 조건이 설정된 컬럼에는 중복된 값을 입력할 수 없습니다. 이미 존재하는 값을 또 입력하려고 하면 오류가 발생합니다. (db-fiddle 예제의
UserID
가 PK입니다.) - 문자열과 날짜는 따옴표!: 대부분의 SQL 시스템에서 문자열과 날짜/시간 값은 작은따옴표(
'
)로 감싸야 합니다. - 데이터의 문자셋(Character Set) 고려: 다국어 데이터를 저장할 경우 테이블 생성 시 적절한 문자셋(예:
utf8mb4
)을 지정하는 것이 중요합니다. 그렇지 않으면 db-fiddle 예제의 '김철수', '이영희'와 같은 한글이 깨져 보일 수 있습니다.
4. 결론: INSERT INTO로 풍성한 테이블 만들기
INSERT INTO
문은 데이터베이스에 데이터를 채워 넣어 실제로 활용 가능하게 만드는 핵심적인 명령어입니다. 단순 값 입력부터 다른 테이블의 데이터를 활용하는 방법, 그리고 여러 행을 한 번에 효율적으로 입력하는 방법까지 그 쓰임새는 매우 다양합니다.
오늘 배운 내용을 바탕으로 직접 테이블을 만들고 데이터를 입력해보세요. db-fiddle.com과 같은 온라인 SQL 연습 도구를 활용하면 더욱 쉽게 실습할 수 있습니다. 다양한 예제를 통해 연습하다 보면 INSERT INTO
문을 자유자재로 다루는 데이터베이스 전문가로 거듭날 수 있을 것입니다!