hyeonga_code

Database_47_데이터 조작과 트랜잭션_DML 데이터 조작어 DELETE 본문

Oracle Database

Database_47_데이터 조작과 트랜잭션_DML 데이터 조작어 DELETE

hyeonga 2023. 8. 4. 06:59
반응형

-- DML_Data Management Language 데이터 조작어   
   
    -- DELETE
        /*
        DELETE [FROM] table
        [WHERE condition];
        */
        -- 필요한 경우 한 번에 여러 행을 삭제할 수 있습니다.
        -- 주의사항
            -- WHERE 절을 생략하면 테이블의 모든 행이 삭제됩니다.
            -- WHERE 절의 조건에 해앋하는 행이 없는 경우 '0 rows deleted.'라는 메세지가 반환됩니다.
        -- 서브쿼리를 사용하면 다른 테이블의 값을 기반으로 행을 삭제할 수 있습니다.
DELETE FROM departments
WHERE department_name='finance';
    /*
    0개 행 이(가) 삭제되었습니다.
        -- Finance의 앞글자가 대문자입니다.
    */
    
DELETE FROM departments
WHERE department_name='Finance';
    /*
        <오류>-------------------------------------------------------------------------------
        명령의 281 행에서 시작하는 중 오류 발생 -
        DELETE FROM departments
        WHERE department_name='Finance'
        오류 보고 -
        ORA-02292: integrity constraint (HR.EMP_DEPT_FK) violated - child record found
        ---------------------------------------------------------------------------------------
            -- 관련 자식 레코드가 존재합니다.
            -- 삭제할 수 없습니다.
            -- 자식 레코드를 관련 없는 데이터로 변경 후 삭제해야 합니다.
    */

    -- 관련 자식 레코드의 부서를 변경합니다.
UPDATE employees
SET department_id=70
WHERE employee_id=113;
    /*
    1 행 이(가) 업데이트되었습니다.
    */

DELETE FROM departments
WHERE department_name='Finance';
    /*
    1 행 이(가) 삭제되었습니다.
    */

SELECT * FROM departments;
    /*
    DP_ID   DP_NAME                      M_ID        LO_ID        
    -------------------------------------------------------------------
    40         Human Resource        ( null )        2500
    30         Purchasing                  ( null )       ( null )
    10         Administration              200           1700
    20         Marketing                    201           1800
    50         Shipping                      124           1500
    60         IT                                 103           1400
    80         Sales                           149           2500
    90         Executive                    100           1700
    110       Accounting                  205           1700
    190       Contracting               ( null )         1700
    70         Public Relations          100           1700
            -- 100 번 부서가 삭제되었습니다.
    */



    -- 커밋합니다.
COMMIT;

    -- 전체 데이터 삭제하기
        --1)
SELECT * FROM sales_reps;
    /*
    EM_ID       LAST_NAME  SALARY  COM_PCT  JOB_ID     DP_ID       
    --------------------------------------------------------------------
    174         Abel         11000 0.3         SA_REP         80
    176         Taylor         8600     0.2         SA_REP         80
    178         Grant         7000     0.15     SA_REP        ( null )
    202         Fay         6000 ( null )    MK_REP         20
    */


        --2)
DELETE FROM sales_reps;
    /*
    4개 행 이(가) 삭제되었습니다.
    */
        --3)
SELECT * FROM sales_reps;
    -- 아무것도 출력되지 않습니다.


        --4)
ROLLBACK;
    /*
    롤백 완료.
    */
    
SELECT * FROM sales_reps;
    /*
    EM_ID       LAST_NAME  SALARY  COM_PCT  JOB_ID     DP_ID       
    --------------------------------------------------------------------
    174         Abel         11000 0.3         SA_REP         80
    176         Taylor         8600     0.2         SA_REP         80
    178         Grant         7000     0.15     SA_REP        ( null )
    202         Fay         6000 ( null )    MK_REP         20
    */


    -- 서브쿼리로 다른 테이블 값을 조건으로 행을 삭제
DELETE FROM employees
WHERE department_id = 
                    ( SELECT department_id 
                      FROM departments
                      WHERE department_name LIKE '%Public%');   -- 30 번 부서
    /*
    1 행 이(가) 삭제되었습니다.
    */

SELECT * FROM employees;
    -- 70번 부서 사원 데이터가 모두 삭제되었습니다.



COMMIT;

반응형