메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
(새 문서: 물론입니다. Oracle 19c 기준으로 INSERT 구문을 초보자 분도 이해하기 쉽도록 존칭을 사용해 설명드리겠습니다. ⸻ ✅ 기본 개념 설명 INSERT 구문은 테이블에 새로운 데이터를 추가할 때 사용됩니다. ⸻ ✅ 기본 문법 INSERT INTO 테이블명 (컬럼1, 컬럼2, ...) VALUES (값1, 값2, ...); • INSERT INTO: 데이터를 추가할 테이블명을 지정합니다. • (컬럼1, 컬럼2, ...): 어떤 컬럼에...)
 
편집 요약 없음
 
(같은 사용자의 중간 판 10개는 보이지 않습니다)
1번째 줄: 1번째 줄:
물론입니다. Oracle 19c 기준으로 INSERT 구문을 초보자 분도 이해하기 쉽도록 존칭을 사용해 설명드리겠습니다.
== INSERT 구문 ==
{{난이도
|제목=학습단계 : 1단계
|별1=1
}}


{{요점
|내용= 기본 개념 설명
* INSERT 구문은 테이블에 새로운 데이터를 추가할 때 사용됩니다.
}}


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


=== 기본 문법 ===
<source lang=sql>
INSERT INTO 테이블명 (컬럼1, 컬럼2, ...)
INSERT INTO 테이블명 (컬럼1, 컬럼2, ...)
VALUES (값1, 값2, ...);
VALUES (값1, 값2, ...);
</source>


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




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


고객 정보를 담는 CUSTOMER 테이블이 아래와 같다고 가정하겠습니다.
고객 정보를 담는 CUSTOMER 테이블이 아래와 같다고 가정하겠습니다.
28번째 줄: 31번째 줄:


SQL 예제:
SQL 예제:
 
<source lang=sql>
INSERT INTO CUSTOMER (ID, NAME, EMAIL)
INSERT INTO CUSTOMER (ID, NAME, EMAIL)
VALUES (1, '홍길동', 'hong@example.com');
VALUES (1, '홍길동', 'hong@example.com');
</source>


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


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


테이블의 컬럼 순서를 정확히 알고 계신 경우, 컬럼명을 생략하고 아래와 같이 작성하실 수도 있습니다.
테이블의 컬럼 순서를 정확히 알고 계신 경우, 컬럼명을 생략하고 아래와 같이 작성하실 수도 있습니다.
 
<source lang=sql>
INSERT INTO CUSTOMER
INSERT INTO CUSTOMER
VALUES (2, '김철수', 'kim@example.com');
VALUES (2, '김철수', 'kim@example.com');
</source>


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


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


다른 테이블의 데이터를 이용하여 INSERT하는 방법도 있습니다.
다른 테이블의 데이터를 이용하여 INSERT하는 방법도 있습니다.
 
<source lang=sql>
INSERT INTO CUSTOMER (ID, NAME, EMAIL)
INSERT INTO CUSTOMER (ID, NAME, EMAIL)
SELECT EMP_ID, EMP_NAME, EMP_EMAIL
SELECT EMP_ID, EMP_NAME, EMP_EMAIL
FROM EMPLOYEE
FROM EMPLOYEE
WHERE DEPARTMENT = 'SALES';
WHERE DEPARTMENT = 'SALES';
</source>


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


추가 팁
=== 추가 팁 ===
데이터를 추가한 후, COMMIT; 명령어를 실행하셔야 실제로 데이터가 저장됩니다.
* 데이터를 추가한 후, COMMIT; 명령어를 실행하셔야 실제로 데이터가 저장됩니다.
만약 잘못 입력하셨다면, ROLLBACK;을 통해 마지막 COMMIT 이전 상태로 되돌릴 수 있습니다.
* 만약 잘못 입력하셨다면, ROLLBACK;을 통해 마지막 COMMIT 이전 상태로 되돌릴 수 있습니다.
컬럼 수와 값의 수는 반드시 일치해야 합니다.
* 컬럼 수와 값의 수는 반드시 일치해야 합니다.
----
 
=== 고급 기능 ===
다음 기능들은 대량 데이터 처리, 조건부 삽입, 트랜잭션 제어 등에서 매우 유용합니다.




더 복잡한 INSERT ALL, INSERT FIRST 문법이나 트랜잭션 제어도 설명드릴 수 있습니다.
==== INSERT ALL — 여러 행을 한 번에 삽입 (다중 INSERT) ====
원하시는 내용이 있으시면 말씀해 주세요! 궁금하신 점 있으신가요?❓
<source lang=sql>
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;
</source>
 
* INSERT ALL은 여러 레코드를 한 번에 삽입할 때 사용합니다.
* SELECT * FROM DUAL은 형식상 필요합니다. DUAL은 Oracle의 가상 테이블입니다.
----
 
==== INSERT FIRST — 조건에 맞는 첫 번째 문장만 실행 ====
<source lang=sql>
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;</source>
 
 
* 이 구문은 조건에 따라 다른 테이블로 분기해서 삽입합니다.
* INSERT FIRST는 첫 번째 조건만 실행되며, 나머지는 건너뜁니다.
 
----
 
==== RETURNING INTO — INSERT한 후 값을 바로 변수에 저장 (PL/SQL에서 사용) ====
 
<source lang=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;</source>
 
 
* RETURNING INTO는 삽입 직후에 생성된 값을 변수에 즉시 저장합니다.
* 보통 시퀀스와 함께 자주 사용됩니다.
 
 
==== 병렬 INSERT (대용량 INSERT 성능 향상) ====
 
<source lang=sql>
ALTER SESSION ENABLE PARALLEL DML;
 
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)
SELECT EMP_ID, EMP_NAME, EMP_EMAIL
FROM EMPLOYEE;</source>
 
 
* PARALLEL 힌트를 사용하면 여러 프로세스를 사용해 INSERT 속도 향상 가능
* 단, ENABLE PARALLEL DML 세션 설정이 필요합니다.
 
----
 
==== MERGE 문 (조건에 따라 INSERT 또는 UPDATE) ====
 
<source lang=sql>
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);</source>
 
 
* MERGE 문은 **“있으면 UPDATE, 없으면 INSERT”**의 로직을 한 번에 처리합니다.
* 대량의 동기화 작업에 매우 유용합니다.
 
[[category:oracle]]
[[category:oracle insert 구문]]
[[category:oracle 병렬 insert]] 
[[category:oracle insert all]]

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”**의 로직을 한 번에 처리합니다.
  • 대량의 동기화 작업에 매우 유용합니다.