ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Oracle - DML(Data ManipulationLanguage) INSERT - Part 1
    데이터베이스/Oracle 2020. 11. 20. 15:42
    728x90
    반응형

    DML(Data ManipulationLanguage)

    DML이란 데이터 조작 언어로 테이블에 값을 삽입(INSERT), 수정(UPDATE), 삭제(DELETE)하는 구문을 말한다.

    먼저 INSERT를 알아보자.

     

     

    INSERT

    INSERT테이블에 새로운 행을 추가하여 테이블의 행 개수를 증가시키는 구문이다.

     

    [ INSERT 예시 ]

    컬럼명을 생략하지 않은경우

    INSERT INTO EMPLOYEE (EMP_ID, EMP_NAME, EMP_NO, EMAIL, PHONE, DEPT_CODE,
    JOB_CODE, SAL_LEVEL, SALARY, BONUS, MANAGER_ID, HIRE_DATE,
    ENT_DATE, ENT_YN)
    VALUES(900, '장채현', '901123-1080503', 'jang_ch@kh.or.kr', '01055569512', 'D1', 'J8', 'S3',
    4300000, 0.2, '200', SYSDATE, NULL, DEFAULT);

     

    컬럼명을 생략할 경우

    INSERT INTO EMPLOYEE -- 컬럼명 생략
    VALUES(900, '장채현', '901123-1080503', 'jang_ch@kh.or.kr', '01055569512', 'D1', 'J8', 'S3',
    4300000, 0.2, '200', SYSDATE, NULL, DEFAULT);

    * INSERT하고자 하는 컬럼이 모든 컬럼인 경우 컬럼명 생략이 가능하다.

    단, 컬럼의 순서지켜서 VALUES에 값기입해야 한다.

     

    서브쿼리를 이용한 예시

    INSERT INTO EMP_01(
        SELECT EMP_ID, EMP_NAME, DEPT_TITLE
        FROM EMPLOYEE
        LEFT JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID) -- 서브쿼리
    );

    * 서브쿼리를 이용하여 여러개의 값을 삽입할 수 있다.

    * INSERT 시 VALUES 대신 서브쿼리 이용 가능

     

     

     

     

    INSERT ALL

    INSERT ALL이란 INSERT 시 서브쿼리가 사용하는 테이블같은 경우 두 개 이상의 테이블INSERT ALL을 이용하여 한 번에 삽입이 가능하다.

    단, 각 서브쿼리의 조건절이 같아야 한다.

     

    [ INSERT ALL 예시 ]

    - EMP_DEPT_D1테이블에 EMPLOYEE테이블의 부서코드가 D1인 직원의 사번, 이름, 소속부서, 입사일을 삽입하고

    EMP_MANAGER테이블에 EMPLOYEE테이블의 부서코드가 D1인 직원의 사번, 이름, 관리자 사번을 조회하여 삽입하기

     

    EMP_DEPT_D1 테이블 생성

    CREATE TABLE EMP_DEPT_D1
    AS 
    SELECT EMP_ID, EMP_NAME, DEPT_CODE, HIRE_DATE
    FROM EMPLOYEE
    WHERE 1 = 0; -- 같은 조건절

     

    EMP_MANAGER 테이블 생성

    CREATE TABLE EMP_MANAGER
    AS 
    SELECT EMP_ID, EMP_NAME, MANAGER_ID
    FROM EMPLOYEE
    WHERE 1 = 0; -- 같은 조건절

     

    생성 뒤 INSERT ALL을 통해 데이터 삽입하기

    INSERT ALL
    INTO EMP_DEPT_D1 VALUES(EMP_ID, EMP_NAME, DEPT_CODE, HIRE_DATE) -- 첫번째
    INTO EMP_MANAGER VALUES(EMP_ID, EMP_NAME, MANAGER_ID) -- 두번째
    SELECT EMP_ID, EMP_NAME, DEPT_CODE, HIRE_DATE, MANAGER_ID
    FROM EMPLOYEE
    WHERE DEPT_CODE = ‘D1’;

    삽입을 하고 나서 결과는 이러하다.

     

    EMP_DEPT_D1 테이블 조회

     

    EMP_MANAGER 테이블 조회

     

    또다른 예시

    - EMPLOYEE테이블의 구조를 복사하여 사번, 이름, 입사일, 급여를 기록할 수 있는 테이블 EMP_OLD와 EMP_NEW 생성

     

    EMP_OLD 테이블 생성

    CREATE TABLE EMP_OLD
    AS 
    SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
    FROM EMPLOYEE
    WHERE 1 = 0;

     

    EMP_NEW 테이블 생성

    CREATE TABLE EMP_NEW
    AS 
    SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
    FROM EMPLOYEE
    WHERE 1 = 0;

     

    두 테이블 생성 한 후 INSERT ALL을 통해 데이터 삽입하기

    - EMPLOYEE테이블의 입사일 기준으로 2000년 1월 1일 이전에 입사한 사원의 사번, 이름, 입사일, 급여를 조회해서 EMP_OLD테이블에 삽입하고 그 후에 입사한 사원의 정보는 EMP_NEW테이블에 삽입

    INSERT ALL
    WHEN HIRE_DATE < ‘2000/01/01’ THEN
    INTO EMP_OLD VALUES(EMP_ID, EMP_NAME, HIRE_DATE, SALARY)
    WHEN HIRE_DATE >= ‘2000/01/01’ THEN
    INTO EMP_NEW VALUES(EMP_ID, EMP_NAME, HIRE_DATE, SALARY)
    SELECT EMP_ID, EMP_NAME, HIRE_DATE, SALARY
    FROM EMPLOYEE;

     

    삽입한 후 두 테이블의 결과값 조회

    왼쪽은 EMP_OLD테이블

    오른쪽은 EMP_NEW테이블

    728x90
    반응형
Designed by Tistory.