반응형
250x250
Notice
Recent Posts
Recent Comments
Link
관리 메뉴

Yeonee's Story

Oracle SQL - UPDATE(UPDATE SET WHERE,서브쿼리), DELETE, TRUNCATE, ROLLBACK, TRUNCATE DELETE차이 비교 본문

Oracle SQL/Oracle SQL

Oracle SQL - UPDATE(UPDATE SET WHERE,서브쿼리), DELETE, TRUNCATE, ROLLBACK, TRUNCATE DELETE차이 비교

yeonee 여니 2023. 6. 10. 11:57
728x90
반응형
SMALL

안녕하세요.

https://blog.naver.com/sysysy0302여니입니다 :)

 

/*
    2.  UPDATE
    
    테이블에 기록된 기존의 데이터를 수정하는 구문
    
    [표현법]
    UPDATE 테이블명
    SET 컬럼명 = 바꿀값,
        컬럼명 = 바꿀값,
        ... -- 여러개의 칼럼값을 동시변경 가능 이때 AND 가 아니라 , 로 나열한다
    WHERE 조건; -- WHERE절은 생략 가능한데, 생략시 모든테이블의 모든행이 바뀌게 된다.
*/

-- 복사본 테이블 만든 후 작업.
CREATE TABLE DEPT_COPY
AS SELECT *
   FROM DEPARTMENT;
   
SELECT * FROM DEPT_COPY;

-- DEPT_COPY 테이블에서 D9부서의 부서명을 전략기획팀으로 수정
UPDATE DEPT_COPY
SET DEPT_TITLE = '전략기획팀'; -- 9개 행이 수정
-- 전체 행의 모든 DEPT_TITLE값들이 모두 전략기획팀으로 수정됨. 이렇게 하면 안되구!

-- 참고) 변경사항에 대해서 되돌리는 명령어 : ROLLBACK;
ROLLBACK; -- 되돌리다 (UPDATE전으로)

UPDATE DEPT_COPY
SET DEPT_TITLE = '전략기획팀' 
WHERE DEPT_ID = 'D9' -- 1행이 수정
;

SELECT * FROM DEPT_COPY;

CREATE TABLE EMP_SALARY
AS SELECT EMP_ID, EMP_NAME, DEPT_CODE, SALARY, BONUS
FROM EMPLOYEE;

SELECT * FROM EMP_SALARY;

-- EMP_SALARY 테이블에서 노옹철 사원의 급여를 1000만원으로 변경
UPDATE EMP_SALARY
SET SALARY = 10000000
WHERE EMP_NAME = '노옹철';

SELECT * FROM EMP_SALARY;

-- EMP_SALARY테이블에서 선동일 사원의 급여를 700만원, 보너스를 0.2로 변경
UPDATE EMP_SALARY
SET SALARY = 7000000,
    BONUS = 0.2
WHERE EMP_NAME = '선동일';

--UPDATE EMP_SALARY
--SET BONUS = 0.2
--WHERE EMP_NAME = '선동일';

SELECT * FROM EMP_SALARY;

-- EMP_SALARY테이블에서 전체사원의 급여를 기존의 급여에 20% 인상한 금액으로 변경
UPDATE EMP_SALARY
SET SALARY = SALARY*1.2;

SELECT * FROM EMP_SALARY;

/*
    UPDATE시 서브쿼리 사용
    서브쿼리를 수행한 결과값으로 기존의 값으로부터 변경하겠다.
    
    - CREATE시에 서브쿼리 사용시 : 서브쿼리 수행한 결과로 테이블을 만들겠다.
    - INSERT시에 서브쿼리 사용시 : 서브쿼리 수행한 결과를 해당 테이블 새롭게 삽입하겠다.

    [표현법]
    UPDATE 테이블명
    SET 칼럼명 = (서브쿼리)
    WHERE 조건;
    
*/
-- EMP_SALARY 테이블에 김소연 사원의 부서코드를 선동일 사원의 부서코드로 변경
UPDATE EMP_SALARY
SET DEPT_CODE = (
                    SELECT DEPT_CODE
                    FROM EMPLOYEE
                    WHERE EMP_NAME = '선동일'
                )
WHERE EMP_NAME = '김소연';

SELECT * FROM EMP_SALARY;

-- 방명수 사원의 급여와 보너스를 유재식 사원의 급여와 보너스값으로 변경
UPDATE EMP_SALARY
--SET SALARY = ( SELECT SALARY FROM EMPLOYEE WHERE EMP_NAME = '유재식')
--,   BONUS  = ( SELECT BONUS FROM EMPLOYEE WHERE EMP_NAME = '유재식')
SET (SALARY, BONUS) = (SELECT SALARY, BONUS FROM EMP_SALARY WHERE EMP_NAME = '유재식')
WHERE EMP_NAME = '방명수';

-- 주의사항 : UPDATE 시에도 변경할 값에 대해서 해당 칼럼의 제약조건에 위배되면 안됨.
-- 송종기 사원의 사번을 200으로 변경
UPDATE EMPLOYEE
SET EMP_ID = 200
WHERE EMP_NAME = '송종기';
-- unique constraint (KH.EMPLOYEE_PK) violated : PRIMARY KEY 제약조건 위배.

UPDATE EMPLOYEE
SET EMP_ID = NULL
WHERE EMP_ID = 200;
-- ORA-01407: cannot update ("KH"."EMPLOYEE"."EMP_ID") to NULL 
-- NOT NULL 제약조건 위배.

COMMIT;
-- 모든 변경사항을 확정하는 명령어 

/*
    4. DELETE
    
    테이블에 기록된 데이터를 "행"단위로 삭제하는 구문
    
    [표현법]
    DELETE FROM 테이블명
    WHERE 조건; -- WHERE절 생략 가능. 단, 생략시 해당 테이블의 모든 행이 삭제.
*/
DELETE FROM EMPLOYEE;

SELECT * FROM EMPLOYEE;

ROLLBACK; -- 롤백시 마지막 커밋시점으로 돌아간다.

-- EMPLOYEE 테이블로부터 김소연, 김소연2 사원의 정보를 지우기
DELETE FROM EMPLOYEE
WHERE EMP_NAME IN ('김소연','김소연2');

COMMIT;

-- DEPARTMENT테이블로부터 DEPT_ID가 D1인부서를 삭제
DELETE FROM DEPARTMENT
WHERE DEPT_ID = 'D1';
-- 만약에 EMPLOYEE 테이블의 DEPT_CODE 컬럼에서 외래키 제약조건이 추가되었을 경우, 삭제가 되지 않았을것!

DELETE FROM DEPARTMENT
WHERE DEPT_ID = 'D3'; -- 외래키 제약조건이 자식테이블에서 걸려있었더라도, 사용하지 않았으므로 삭제가 잘 됐을것!

ROLLBACK;

/*
    *TRUNCATE : 테이블의 전체 행을 다 삭제할때 사용하는 구문 
                DELETE 구문보다 수행속도가 훨씬 빠름 
                별도의 조건을 제시 불가
                ROLLBACK이 불가능함.(신중하게 삭제해야한다)
                
    [표현법]
    TRUNCATE TABLE 테이블명;
    
    DELETE 구문과 비교
    
        TRUNCATE TABLE 테이블명;           |           DELETE FROM 테이블명;
    ----------------------------------------------------------------------------
        별도의 조건제시 불가(WHERE X)        |           특정조건 제시 가능(WHERE O)
        수행속도가 빠름                     |           수행속도가 느림
        ROLLBACK 불가능                    |           ROLLBACK 가능
*/
SELECT * FROM EMP_SALARY;

DELETE FROM EMP_SALARY;

ROLLBACK; --DELETE문은 롤백 가능.

TRUNCATE TABLE EMP_SALARY; -- 롤백하고 전체조회 해봐도 데이터가 비어있다.

728x90
반응형
LIST