[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 Email 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 Email
user002 이영희 younghee@example.com
user005 김연아 yuna@example.com

이처럼 INSERT INTO ... SELECT 구문은 특정 조건에 따라 데이터를 필터링하고, 필요한 컬럼만 선택하여 다른 테이블로 효율적으로 이전하거나 백업하는 데 매우 유용하게 사용될 수 있습니다.

3. INSERT INTO 사용 시 주의사항: 실수 없이 데이터 입력하기

INSERT INTO 문을 사용할 때 몇 가지 주의할 점이 있습니다. 이를 지키지 않으면 오류가 발생하거나 원치 않는 데이터가 입력될 수 있습니다.

  1. 테이블은 미리 만들어 두세요!: 데이터를 삽입할 테이블은 당연히 미리 존재해야 합니다. CREATE TABLE 문을 사용해 테이블 구조를 먼저 정의해야 합니다.
  2. 컬럼 순서와 데이터 타입, 개수를 맞춰주세요!:
    • VALUES 절에 제공하는 값들은 지정된 (또는 테이블 전체) 컬럼의 순서, 데이터 타입, 개수와 정확히 일치해야 합니다.
    • INSERT INTO ... SELECT 구문에서도 SELECT 되는 컬럼들과 INSERT INTO 될 컬럼들의 순서, 타입, 개수가 맞아야 합니다.
  3. NOT NULL 컬럼은 필수!: 테이블 컬럼 정의 시 NOT NULL 제약 조건이 설정된 컬럼에는 반드시 값을 입력해야 합니다. 해당 컬럼을 생략하거나 NULL 값을 입력하려고 하면 오류가 발생합니다.
  4. 고유 키(Primary Key) 및 유니크(Unique) 제약 조건: PK나 Unique 제약 조건이 설정된 컬럼에는 중복된 값을 입력할 수 없습니다. 이미 존재하는 값을 또 입력하려고 하면 오류가 발생합니다. (db-fiddle 예제의 UserID가 PK입니다.)
  5. 문자열과 날짜는 따옴표!: 대부분의 SQL 시스템에서 문자열과 날짜/시간 값은 작은따옴표(')로 감싸야 합니다.
  6. 데이터의 문자셋(Character Set) 고려: 다국어 데이터를 저장할 경우 테이블 생성 시 적절한 문자셋(예: utf8mb4)을 지정하는 것이 중요합니다. 그렇지 않으면 db-fiddle 예제의 '김철수', '이영희'와 같은 한글이 깨져 보일 수 있습니다.

4. 결론: INSERT INTO로 풍성한 테이블 만들기

INSERT INTO 문은 데이터베이스에 데이터를 채워 넣어 실제로 활용 가능하게 만드는 핵심적인 명령어입니다. 단순 값 입력부터 다른 테이블의 데이터를 활용하는 방법, 그리고 여러 행을 한 번에 효율적으로 입력하는 방법까지 그 쓰임새는 매우 다양합니다.

오늘 배운 내용을 바탕으로 직접 테이블을 만들고 데이터를 입력해보세요. db-fiddle.com과 같은 온라인 SQL 연습 도구를 활용하면 더욱 쉽게 실습할 수 있습니다. 다양한 예제를 통해 연습하다 보면 INSERT INTO 문을 자유자재로 다루는 데이터베이스 전문가로 거듭날 수 있을 것입니다!