본문 바로가기
자격증/SQLP

2. INSERT문 심화

by 철제백조 2022. 9. 29.

1. 기본 사용법

INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, NULL, 20)

INTO 절의 컬럼 개수와 데이터 타입이 VALUES 절의 컬럼 개수와 데이터 타입이 동일해야 한다.

VALUES 절에 테이블의 모든 컬럼이 나열되어 있다면, INTO 절의 컬럼을 생략할 수 있지만, INTO 절에 입력할 컬럼을 모두 나열하는 방식을 권장한다.

 

 

2. 기본 사용법 (컬럼명 생략)

INSERT INTO emp
VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1987-04-19', 3000, NULL, 20)

VALUES 절에 입력할 테이블의 모든 컬럼이 나열되어 있다면 INTO 절의 컬럼은 생각해도 된다. 실무에서 리를 작설할 때는 꼭 INTO 절에 컬럼을 모두 작성할 것을 권장한다. 테이블에 컬럼이 추가되거나 삭제되었을 경우 기존 쿼리문에 오류가 발생할 수 있기 때문이다.

 

 

3. 일련번호 채번 후 INSERT (MAX + 1)

INSERT INTO emp ( empno
                , ename
                , job
                , mgr
                , hiredate
                , sal
                , comm
                , deptno
                )
         VALUES ( (SELECT NVL(MAX(empno), 0) + 1 FROM emp)
                , 'SCOTT'
                , 'ANALYST'
                , 7566
                , TO_DATE('1987-04-19', 'YYYY-MM-DD')
                , 3000
                , NULL
                , 20
                )

VALUES 절에서 서브 쿼리를 사용하여 일련번호를 채 후 INSERT를 수행할 수 있다. 오라클은 컬럼에 자동 증가 옵션이 없기 때문에, 시퀀스 또는 MAX + 1 같은 방법을 활용하여 일련번호를 생성한다.

 

 

4. 서브쿼리 INSERT (SELECT INSERT)

INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
SELECT 8000
     , a.ename
     , a.job
     , a.mgr
     , a.hiredate
     , a.sal
     , a.comm
     , a.deptno
  FROM emp a
 WHERE a.empno = 7788

VALUES 절 대신에 서브 쿼리를 사용하여 여러 건의 데이터를 INSERT 하거나, 기본 값을 조회 후 파라미터로 전달된 값과 합쳐서 INSERT를 할 때 사용한다.

 

 

5. INSERT ALL, FIRST

INSERT ALL
  WHEN sal >= 3000 THEN
       INTO emp_sal1 VALUES (empno, ename, sal)
  WHEN sal >= 2000 THEN
       INTO emp_sal2 VALUES (empno, ename, sal)   
  ELSE
       INTO emp_sal3 VALUES (empno, ename, sal)
SELECT a.empno
     , a.ename
     , a.sal
  FROM emp a
 WHERE a.empno = 7788

INSERT ALL을 사용하면 한 번에 여러 개의 테이블에 INSERT를 할 수 있다.

☆ 조건(WHEN~THEN)에 만족하면 해당 테이블에 INSERT 한다.

sal이 3000인 경우 emp_sql1, emp_sal2 두개의 테이블에 INSERT한다. 

 

 

INSERT FIRST
  WHEN sal >= 3000 THEN
       INTO emp_sal1 VALUES (empno, ename, sal)
  WHEN sal >= 2000 THEN
       INTO emp_sal2 VALUES (empno, ename, sal)   
  ELSE
       INTO emp_sal3 VALUES (empno, ename, sal)
SELECT a.empno
     , a.ename
     , a.sal
  FROM emp a
 WHERE a.empno = 7788

 INSERT FIRST는 조건에 만족하는 첫 번째 WHEN~THEN의 테이블에만 INSERT 한다.

sal이 3000인 경우 emp_sql1 테이블에 INSERT한다.

 

(단, INSERT ALL, FIRST는 반드시 서브 쿼리와 함께 사용해야 한다)

 

 

※ DAUL

DEFINE empno = 8800;
DEFINE ename = '''SCOTT''';
DEFINE sal = 3000;

INSERT ALL
  WHEN &sal >= 3000 THEN
       INTO emp_sal1 VALUES (&empno, &ename, &sal)
  WHEN &sal >= 2000 THEN
       INTO emp_sal2 VALUES (&empno, &ename, &sal)   
  ELSE
       INTO emp_sal3 VALUES (&empno, &ename, &sal)
SELECT *
  FROM dual

서브 쿼리를 사용하지 않을 경우 dual을 사용하면 된다.

파라미터를 전달된 값으로 조건을 만들고 INSERT 하면 된다.

 

 

 

 

 

참고 : https://gent.tistory.com/408?category=360526 

 

[Oracle] 오라클 UPDATE 방법 & 노하우 정리 (데이터 수정)

오라클에서 테이블의 값을 수정하기 위해서는 UPDATE 문을 사용하면 된다. WHERE 절에 해당하는 행이 여러 개인 경우 한 번에 여러 건의 행이 SET 절의 값으로 변경된다. UPDATE 문은 시스템 운영 시 자

gent.tistory.com

 

댓글