ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL - DML(Data Manipulation Language) INSERT, UPDATE, UPDATE시 주의사항
    DataBase/Oracle 2022. 1. 27. 02:06
    728x90
    반응형

     

    • INSERT
    • UPDATE
    • UPDATE시 주의사항

     

     

     

     

    DML(Data manipulation Language)

    • 데이터 조작 언어
    • 테이블에 값을 삽입, 수정, 삭제, 조회하는 언어

     

     

     

    INSERT

     

    INSERT INTO 테이블명 (컬럼명, 컬럼명, ..) VALUES (데이터, 데이터, ..)

     

    • 새로운 행을 추가하는 구문
    • 테이블의 행 개수가 증가한다.

     

    INSERT - 기본 

     

    INSERT INTO EMPLOYEE E(
        E.EMP_ID, 
        E.EMP_NAME, 
        E.EMP_NO, 
        E.EMAIL, 
        E.PHONE
    )
    VALUES(
        '900', 
        '장채현', 
        '901123-2080503', 
        'jang_ch@greedy.com', 
        '01055569512'
    );


     

     

    INSERT - VALUES 대신 서브 쿼리 사용

     

    • 서브 쿼리를 이용한 INSERT 방식
    • 서브 쿼리에서 추출한 행들로 INSERT 할 수 있다.

     

    INSERT INTO EMP_01 A(
        A.EMP_ID
      , A.EMP_NAME
      , A.DEPT_TITLE
    )
    (
      SELECT E.EMP_ID
           , E.EMP_NAME
           , D.DEPT_TITLE
        FROM EMPLOYEE E
        LEFT JOIN DEPARTMENT D ON(E.DEPT_CODE = D.DEPT_ID)
    );


     

     

    INSERT ALL

     

    • INSERT시에 사용하는 조건절이 같은 서브 쿼리를 가지고 두 개 이상의 테이블에
      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 
        E.EMP_ID,
        E.EMP_NAME,
        E.DEPT_CODE,
        E.HIRE_DATE,
        E.MANAGER_ID
    FROM 
        EMPLOYEE E
    WHERE 
        E.DEPT_CODE = 'D1';

     위 쿼리를 실행하면 서브 쿼리에서 추출된 행들이 각 EMP_DEPT_D1, EMP_MANAGER 테이블에 삽입이 이루어진다.


     

     

    INSERT ALL의 WEHN/THEN을 이용한 조건에 따른 행 추가

     

    • 조건이 같은 서브 쿼리의 추출된 행들을 WHEN/THEN을 이용하여
      원하는 조건의 서브 쿼리의 추출된 행들을 삽일 할 수 있다.

     

    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 E.EMP_ID
         , E.EMP_NAME
         , E.HIRE_DATE
         , E.SALARY
      FROM EMPLOYEE E;


     

     

    UPDATE

     

    UPDATE 테이블명 SET 컬럼명 = 바꿀값, 컬럼명 = 바꿀값, ... [WHERE 컬럼명 비교연산자 비교값]

     

    • 테이블에 기록된 칼럼의 값을 수정하는 구문

     

    UPDATE - 기본

     

    UPDATE
           DEPT_COPY DC
       SET DC.DEPT_TITLE = '전략기획팀'
     WHERE DC.DEPT_ID = 'D9';

     참고로 WHERE 조건을 안 넣으면 모든 행의 DEPT_TITLE 값들이 '전략기획팀'으로 수정된다.


     

     

    UPDATE - 서브 쿼리 이용

     

    -- 평상시 유재식 사원을 부러워하던 방명수 사원의
    -- 급여와 보너스율을 유재식 사원과 동일하게 변경해 주기로 했다.
    -- 이를 반영하는 UPDATE문을 작성해보세요
    UPDATE
           EMP_SALARY ES
       SET ES.SALARY = (SELECT E1.SALARY
                          FROM EMPLOYEE E1
                         WHERE E1.EMP_NAME = '유재식'
                       )
         , ES.BONUS = (SELECT E2.BONUS
                         FROM EMPLOYEE E2
                        WHERE E2.EMP_NAME = '유재식'
                      )
     WHERE ES.EMP_NAME = '방명수';


     

     

    UPDATE - 다중열 서브 쿼리 이용

     

    • 서브 쿼리를 이용해 한번에 여러 칼럼을 수정할 수 있다.

     

    UPDATE
           EMP_SALARY ES
       SET (ES.SALARY, ES.BONUS) = (SELECT E1.SALARY, E1.BONUS
                                      FROM EMPLOYEE E1
                                     WHERE E1.EMP_NAME = '유재식'
                                   )
     WHERE ES.EMP_NAME = '방명수';

     


     

     

    UPDATE - 다중행 서브 쿼리 이용

     

    • WHERE 조건을 이용하여 서브 쿼리의 추출된 행들과 비교 연산을 통하여 값을 변경할 수 있다.

     

    UPDATE 
           EMP_SALARY ES
       SET ES.BONUS = 0.5
     WHERE ES.EMP_ID IN (SELECT E1.EMP_ID
                           FROM EMPLOYEE E1
                           JOIN DEPARTMENT D1 ON(E1.DEPT_CODE = D1.DEPT_ID)
                           JOIN LOCATION L1 ON (D1.LOCATION_ID = L1.LOCAL_CODE)
                          WHERE L1.LOCAL_NAME LIKE 'ASIA%'
                        );

     

     

    UPDATE 주의 사항

     

    • 변경 값은 해당 칼럼에 대한 제약 조건에 위배되지 않아야 한다.

     

    FOREIGN KEY 제약 조건 위배

     

    • 부모 테이블의 기본키가 존재하지 않는 값으로 변경하는 경우

     

    UPDATE
           EMPLOYEE E
    -- FOREIGN KEY 제약 조건 위배됨 (부모 키가 없습니다)
       SET E.DEPT_CODE = '65'   
     WHERE E.DEPT_CODE = 'D6';

     부모 테이블의 기본키 값이 '65'가 존재하지 않아 오류 발생


     

    NOT NULL 제약 조건 위배

     

    • NOT NULL 제약 조건을 갖고 있는 칼럼의 값을 NULL로 수정하는 경우

     

    UPDATE
           EMPLOYEE E
    -- NOT NULL 제약 조건 위배됨
       SET E.EMP_NAME = NULL
     WHERE E.EMP_ID = '200';

     해당 칼럼의 제약 조건이 NOT NULL인데 NULL값으로 수정하려고 하여 오류 발생


     

    UNIQUE 제약 조건 위배

     

    • UNIQUE 제약 조건을 갖고 있는 칼럼에서 이미 존재하는 칼럼 값으로 수정하는 경우

     

    UPDATE
           EMPLOYEE E
    -- UNIQUE 제약 조건 위배됨
       SET E.EMP_NO = '800808-2123341'
     WHERE E.EMP_ID = '200';

     해당 칼럼의 값들 중 이미 '800808-2123341'가 존재하여 오류 발생

     

     

     

    728x90
    반응형

    댓글

Designed by Tistory.