Oracle 데이터베이스에서 데이터를 테이블에 삽입할 때 사용하는 SQL 문이 바로 INSERT INTO
입니다. 이 명령은 테이블에 새로운 행(Row)을 추가하는 데 사용되며, 여러 가지 방식으로 활용할 수 있습니다.
기본 문법
INSERT INTO
는 두 가지 형태로 사용할 수 있습니다:
1️⃣ 컬럼 이름을 명시한 형태
INSERT INTO 테이블명 (컬럼1, 컬럼2, ...)
VALUES (값1, 값2, ...);
- 장점: 컬럼 순서를 명확히 지정할 수 있어, 데이터가 잘못 삽입될 가능성이 낮음.
- 컬럼 이름 생략 불가 조건: 테이블에
DEFAULT
값이 없는 컬럼이 있다면 반드시 값을 지정해야 합니다.
2️⃣ 컬럼 이름을 생략한 형태
INSERT INTO 테이블명
VALUES (값1, 값2, ...);
- 제약: 테이블의 모든 컬럼에 값을 넣어야 하며, 순서는 테이블에 정의된 컬럼 순서를 따라야 합니다.
- 사용 시 주의가 필요하며, 실무에서는 잘 사용되지 않는 방식입니다.
INSERT INTO 사용 예제
1️⃣ 단일 행 삽입
테이블 생성
CREATE TABLE employees (
employee_id NUMBER(10),
first_name VARCHAR2(50),
last_name VARCHAR2(50),
hire_date DATE,
salary NUMBER(10, 2)
);
값 삽입
INSERT INTO employees (employee_id, first_name, last_name, hire_date, salary)
VALUES (1, 'John', 'Doe', TO_DATE('2024-11-15', 'YYYY-MM-DD'), 5000.00);
- 결과:
employees
테이블에 새로운 행이 추가됩니다.
2️⃣ 다중 행 삽입
방법 1: 여러 INSERT INTO
문 실행
INSERT INTO employees (employee_id, first_name, last_name, hire_date, salary)
VALUES (2, 'Jane', 'Smith', TO_DATE('2024-11-16', 'YYYY-MM-DD'), 4500.00);
INSERT INTO employees (employee_id, first_name, last_name, hire_date, salary)
VALUES (3, 'Robert', 'Brown', TO_DATE('2024-11-17', 'YYYY-MM-DD'), 5500.00);
방법 2: INSERT ALL
사용
INSERT ALL
INTO employees (employee_id, first_name, last_name, hire_date, salary)
VALUES (4, 'Alice', 'Green', TO_DATE('2024-11-18', 'YYYY-MM-DD'), 6000.00)
INTO employees (employee_id, first_name, last_name, hire_date, salary)
VALUES (5, 'David', 'Taylor', TO_DATE('2024-11-19', 'YYYY-MM-DD'), 4000.00)
SELECT * FROM DUAL;
INSERT ALL
: 다중 행을 한 번의 SQL로 삽입.DUAL
: Oracle의 가상 테이블로, 단순히 SQL 실행을 위한 도구로 사용됩니다.
3️⃣ 서브쿼리 결과를 이용한 데이터 삽입
특정 조건을 만족하는 데이터를 한 테이블에서 다른 테이블로 복사할 때 유용합니다.
INSERT INTO employees (employee_id, first_name, last_name, hire_date, salary)
SELECT customer_id, first_name, last_name, SYSDATE, 3000.00
FROM customers
WHERE country = 'USA';
- 설명:
customers
테이블에서country
가 ‘USA’인 데이터를 가져와employees
테이블에 삽입합니다.
4️⃣ DEFAULT 값을 사용하는 삽입
테이블에서 기본값이 설정된 컬럼은 삽입 시 값을 생략할 수 있습니다.
테이블 생성
CREATE TABLE orders (
order_id NUMBER(10),
order_date DATE DEFAULT SYSDATE,
total_amount NUMBER(10, 2)
);
값 삽입
INSERT INTO orders (order_id, total_amount)
VALUES (1, 150.75);
- 결과:
order_date
는 설정된 기본값(SYSDATE)이 자동으로 삽입됩니다.
5️⃣ MERGE를 활용한 INSERT (UPSERT)
MERGE
문을 사용하면 데이터를 삽입하거나 업데이트할 수 있습니다.
MERGE INTO employees e
USING (SELECT 1 AS employee_id, 'Michael' AS first_name, 'Johnson' AS last_name FROM DUAL) src
ON (e.employee_id = src.employee_id)
WHEN MATCHED THEN
UPDATE SET e.salary = 5500.00
WHEN NOT MATCHED THEN
INSERT (employee_id, first_name, last_name, hire_date, salary)
VALUES (src.employee_id, src.first_name, src.last_name, SYSDATE, 5500.00);
- 설명:
employees
테이블에employee_id = 1
이 존재하면 업데이트, 존재하지 않으면 새로 삽입합니다.
실수 방지 및 성능 팁
- 트랜잭션 관리:
- 여러
INSERT
문을 실행할 때는 트랜잭션을 명시적으로 관리합니다.
BEGIN; INSERT INTO employees ...; INSERT INTO orders ...; COMMIT;
- 실패 시
ROLLBACK
으로 되돌릴 수 있습니다.
- 여러
- 데이터 확인:
SELECT *
로 데이터 삽입 전후 상태를 확인하여 잘못된 값 삽입을 방지합니다.
- 대량 삽입 시 성능 최적화:
- 대량 데이터 삽입에는
INSERT /*+ APPEND */
를 사용하거나 배치 처리를 고려하세요.
- 대량 데이터 삽입에는
마무리
INSERT INTO
는 Oracle에서 데이터를 추가할 때 필수적으로 사용되는 명령입니다. 단일 행, 다중 행, 서브쿼리 등을 통해 다양한 방식으로 활용할 수 있으며, MERGE
나 기본값을 조합하여 더 유연한 데이터 처리도 가능합니다. SQL을 작성할 때는 트랜잭션 관리와 데이터 검증을 통해 정확성과 성능을 동시에 유지하는 것이 중요합니다