메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
편집 요약 없음
편집 요약 없음
 
(같은 사용자의 중간 판 3개는 보이지 않습니다)
1번째 줄: 1번째 줄:
== INSERT 구문 ==
{{난이도
|제목=학습단계 : 1단계
|별1=1
}}


== INSERT 구문 ==
{{요점
{{요점
|내용= 기본 개념 설명
|내용= 기본 개념 설명
19번째 줄: 22번째 줄:




=== 예제 ===
=== 예제 1 ===
==== 1.간단한 데이터 추가 ====
==== 1.간단한 데이터 추가 ====


37번째 줄: 40번째 줄:


예제 2: 컬럼 이름 생략 (모든 컬럼에 값을 넣는 경우)
=== 예제 2 ===
: 컬럼 이름 생략 (모든 컬럼에 값을 넣는 경우)


테이블의 컬럼 순서를 정확히 알고 계신 경우, 컬럼명을 생략하고 아래와 같이 작성하실 수도 있습니다.
테이블의 컬럼 순서를 정확히 알고 계신 경우, 컬럼명을 생략하고 아래와 같이 작성하실 수도 있습니다.
49번째 줄: 53번째 줄:


예제 3: 다른 테이블에서 데이터 복사
=== 예제 3 ===
: 다른 테이블에서 데이터 복사


다른 테이블의 데이터를 이용하여 INSERT하는 방법도 있습니다.
다른 테이블의 데이터를 이용하여 INSERT하는 방법도 있습니다.
63번째 줄: 68번째 줄:


추가 팁
=== 추가 팁 ===
* 데이터를 추가한 후, COMMIT; 명령어를 실행하셔야 실제로 데이터가 저장됩니다.
* 데이터를 추가한 후, COMMIT; 명령어를 실행하셔야 실제로 데이터가 저장됩니다.
* 만약 잘못 입력하셨다면, ROLLBACK;을 통해 마지막 COMMIT 이전 상태로 되돌릴 수 있습니다.
* 만약 잘못 입력하셨다면, ROLLBACK;을 통해 마지막 COMMIT 이전 상태로 되돌릴 수 있습니다.
* 컬럼 수와 값의 수는 반드시 일치해야 합니다.
* 컬럼 수와 값의 수는 반드시 일치해야 합니다.
 
----


=== 고급 기능 ===
=== 고급 기능 ===
75번째 줄: 79번째 줄:


✅ 1. INSERT ALL — 여러 행을 한 번에 삽입 (다중 INSERT)
==== INSERT ALL — 여러 행을 한 번에 삽입 (다중 INSERT) ====
<source lang=sql>
<source lang=sql>
INSERT ALL
INSERT ALL
84번째 줄: 88번째 줄:
</source>
</source>


INSERT ALL은 여러 레코드를 한 번에 삽입할 때 사용합니다.
* INSERT ALL은 여러 레코드를 한 번에 삽입할 때 사용합니다.
SELECT * FROM DUAL은 형식상 필요합니다. DUAL은 Oracle의 가상 테이블입니다.
* SELECT * FROM DUAL은 형식상 필요합니다. DUAL은 Oracle의 가상 테이블입니다.
 
----
 
✅ 2. INSERT FIRST — 조건에 맞는 첫 번째 문장만 실행


==== INSERT FIRST — 조건에 맞는 첫 번째 문장만 실행 ====
<source lang=sql>
<source lang=sql>
INSERT FIRST
INSERT FIRST
103번째 줄: 105번째 줄:




이 구문은 조건에 따라 다른 테이블로 분기해서 삽입합니다.
* 이 구문은 조건에 따라 다른 테이블로 분기해서 삽입합니다.
INSERT FIRST는 첫 번째 조건만 실행되며, 나머지는 건너뜁니다.
* INSERT FIRST는 첫 번째 조건만 실행되며, 나머지는 건너뜁니다.


----


✅ 3. RETURNING INTO — INSERT한 후 값을 바로 변수에 저장 (PL/SQL에서 사용)
==== RETURNING INTO — INSERT한 후 값을 바로 변수에 저장 (PL/SQL에서 사용) ====


<source lang=sql>
<source lang=sql>
122번째 줄: 124번째 줄:




RETURNING INTO는 삽입 직후에 생성된 값을 변수에 즉시 저장합니다.
* RETURNING INTO는 삽입 직후에 생성된 값을 변수에 즉시 저장합니다.
보통 시퀀스와 함께 자주 사용됩니다.
* 보통 시퀀스와 함께 자주 사용됩니다.




✅ 4. 병렬 INSERT (대용량 INSERT 성능 향상)
==== 병렬 INSERT (대용량 INSERT 성능 향상) ====


<source lang=sql>
<source lang=sql>
133번째 줄: 134번째 줄:


INSERT /*+ PARALLEL(CUSTOMER, 4) */
INSERT /*+ PARALLEL(CUSTOMER, 4) */
INTO CUSTOMER (ID, NAME, EMAIL)
SELECT EMP_ID, EMP_NAME, EMP_EMAIL
FROM EMPLOYEE;</source>
or
<source lang=sql>
-- 12C 이상부터 힌트로 가능
INSERT /*+ ENABLE_PARALLEL_DML PARALLEL(CUSTOMER, 4) */
INTO CUSTOMER (ID, NAME, EMAIL)
INTO CUSTOMER (ID, NAME, EMAIL)
SELECT EMP_ID, EMP_NAME, EMP_EMAIL
SELECT EMP_ID, EMP_NAME, EMP_EMAIL
138번째 줄: 146번째 줄:




PARALLEL 힌트를 사용하면 여러 프로세스를 사용해 INSERT 속도 향상 가능
* PARALLEL 힌트를 사용하면 여러 프로세스를 사용해 INSERT 속도 향상 가능
단, ENABLE PARALLEL DML 세션 설정이 필요합니다.
* 단, ENABLE PARALLEL DML 세션 설정이 필요합니다.


----


✅ 5. MERGE 문 (조건에 따라 INSERT 또는 UPDATE)
==== MERGE 문 (조건에 따라 INSERT 또는 UPDATE) ====


<source lang=sql>
<source lang=sql>
156번째 줄: 164번째 줄:




MERGE 문은 **“있으면 UPDATE, 없으면 INSERT”**의 로직을 한 번에 처리합니다.
* MERGE 문은 **“있으면 UPDATE, 없으면 INSERT”**의 로직을 한 번에 처리합니다.
대량의 동기화 작업에 매우 유용합니다.
* 대량의 동기화 작업에 매우 유용합니다.


[[category:oracle]]  
[[category:oracle]]  

2025년 7월 23일 (수) 19:53 기준 최신판

INSERT 구문

학습단계 : 1단계
★☆☆☆☆


menu_book 기본 개념 설명
  • INSERT 구문은 테이블에 새로운 데이터를 추가할 때 사용됩니다.


기본 문법

INSERT INTO 테이블명 (컬럼1, 컬럼2, ...)
VALUES (값1, 값2, ...);
  • INSERT INTO: 데이터를 추가할 테이블명을 지정합니다.
  • (컬럼1, 컬럼2, ...): 어떤 컬럼에 값을 넣을지를 지정합니다.
  • VALUES (...): 해당 컬럼들에 대응하는 값을 입력합니다.


예제 1

1.간단한 데이터 추가

고객 정보를 담는 CUSTOMER 테이블이 아래와 같다고 가정하겠습니다.

ID (NUMBER) NAME (VARCHAR2) EMAIL (VARCHAR2)


SQL 예제:

INSERT INTO CUSTOMER (ID, NAME, EMAIL)
VALUES (1, '홍길동', 'hong@example.com');

이 구문은 ID가 1이고 이름은 ‘홍길동’, 이메일은 ‘hong@example.com’인 고객 정보를 추가하는 것입니다.

예제 2

컬럼 이름 생략 (모든 컬럼에 값을 넣는 경우)

테이블의 컬럼 순서를 정확히 알고 계신 경우, 컬럼명을 생략하고 아래와 같이 작성하실 수도 있습니다.

INSERT INTO CUSTOMER
VALUES (2, '김철수', 'kim@example.com');

※ 이 방법은 컬럼 순서가 바뀌지 않았을 때만 안전합니다. 컬럼 순서가 바뀌면 오류가 발생할 수 있습니다.

예제 3

다른 테이블에서 데이터 복사

다른 테이블의 데이터를 이용하여 INSERT하는 방법도 있습니다.

INSERT INTO CUSTOMER (ID, NAME, EMAIL)
SELECT EMP_ID, EMP_NAME, EMP_EMAIL
FROM EMPLOYEE
WHERE DEPARTMENT = 'SALES';

위 구문은 EMPLOYEE 테이블에서 부서가 ‘SALES’인 직원을 CUSTOMER 테이블에 추가하는 예제입니다.

추가 팁

  • 데이터를 추가한 후, COMMIT; 명령어를 실행하셔야 실제로 데이터가 저장됩니다.
  • 만약 잘못 입력하셨다면, ROLLBACK;을 통해 마지막 COMMIT 이전 상태로 되돌릴 수 있습니다.
  • 컬럼 수와 값의 수는 반드시 일치해야 합니다.

고급 기능

다음 기능들은 대량 데이터 처리, 조건부 삽입, 트랜잭션 제어 등에서 매우 유용합니다.

INSERT ALL — 여러 행을 한 번에 삽입 (다중 INSERT)

INSERT ALL
  INTO CUSTOMER (ID, NAME, EMAIL) VALUES (3, '이순신', 'lee@example.com')
  INTO CUSTOMER (ID, NAME, EMAIL) VALUES (4, '유관순', 'yoo@example.com')
  INTO CUSTOMER (ID, NAME, EMAIL) VALUES (5, '안중근', 'ahn@example.com')
SELECT * FROM DUAL;
  • INSERT ALL은 여러 레코드를 한 번에 삽입할 때 사용합니다.
  • SELECT * FROM DUAL은 형식상 필요합니다. DUAL은 Oracle의 가상 테이블입니다.

INSERT FIRST — 조건에 맞는 첫 번째 문장만 실행

INSERT FIRST
  WHEN SALARY > 5000 THEN
    INTO HIGH_SAL_EMP (EMP_ID, NAME, SALARY) VALUES (EMP_ID, NAME, SALARY)
  WHEN SALARY BETWEEN 3000 AND 5000 THEN
    INTO MID_SAL_EMP (EMP_ID, NAME, SALARY) VALUES (EMP_ID, NAME, SALARY)
  ELSE
    INTO LOW_SAL_EMP (EMP_ID, NAME, SALARY) VALUES (EMP_ID, NAME, SALARY)
SELECT EMP_ID, NAME, SALARY
FROM EMPLOYEE;


  • 이 구문은 조건에 따라 다른 테이블로 분기해서 삽입합니다.
  • INSERT FIRST는 첫 번째 조건만 실행되며, 나머지는 건너뜁니다.

RETURNING INTO — INSERT한 후 값을 바로 변수에 저장 (PL/SQL에서 사용)

DECLARE
  v_id NUMBER;
BEGIN
  INSERT INTO CUSTOMER (ID, NAME, EMAIL)
  VALUES (CUSTOMER_SEQ.NEXTVAL, '장보고', 'jang@example.com')
  RETURNING ID INTO v_id;

  DBMS_OUTPUT.PUT_LINE('삽입된 고객 ID: ' || v_id);
END;


  • RETURNING INTO는 삽입 직후에 생성된 값을 변수에 즉시 저장합니다.
  • 보통 시퀀스와 함께 자주 사용됩니다.


병렬 INSERT (대용량 INSERT 성능 향상)

ALTER SESSION ENABLE PARALLEL DML;

INSERT /*+ PARALLEL(CUSTOMER, 4) */
INTO CUSTOMER (ID, NAME, EMAIL)
SELECT EMP_ID, EMP_NAME, EMP_EMAIL
FROM EMPLOYEE;

or

-- 12C 이상부터 힌트로 가능 
INSERT /*+ ENABLE_PARALLEL_DML PARALLEL(CUSTOMER, 4) */
INTO CUSTOMER (ID, NAME, EMAIL)
SELECT EMP_ID, EMP_NAME, EMP_EMAIL
FROM EMPLOYEE;


  • PARALLEL 힌트를 사용하면 여러 프로세스를 사용해 INSERT 속도 향상 가능
  • 단, ENABLE PARALLEL DML 세션 설정이 필요합니다.

MERGE 문 (조건에 따라 INSERT 또는 UPDATE)

MERGE INTO CUSTOMER c
USING TEMP_CUSTOMER t
ON (c.ID = t.ID)
WHEN MATCHED THEN
  UPDATE SET c.NAME = t.NAME, c.EMAIL = t.EMAIL
WHEN NOT MATCHED THEN
  INSERT (ID, NAME, EMAIL)
  VALUES (t.ID, t.NAME, t.EMAIL);


  • MERGE 문은 **“있으면 UPDATE, 없으면 INSERT”**의 로직을 한 번에 처리합니다.
  • 대량의 동기화 작업에 매우 유용합니다.