Database/Oracle

[Oracle] DML(2) - UPDATE

21종 2023. 7. 31. 22:41

UPDATE
테이블에 기록되어있는 기존의 데이터를 수정하는 구문

[표현식]
UPDATE 테이블명 
SET 컬럼명 = 바꿀값,
    컬럼명 = 바꿀값,
    ...         --> 여러개의 컬럼값 동시변경 가능(,로 나열해야됨!! AND 아님!!)
[WHERE 조건];    --> 생략하면 전체 행의 모든 행의 데이터가 변경된다..!! 그래서 조건을 꼭 쓰자

 

SELECT * FROM DEPT_COPY;

 

-- D9 부서의 부서명을 '전략기획팀'으로 수정
UPDATE DEPT_COPY
SET DEPT_TITLE = '전략기획팀'; -- 총무부
-- 이러면 행이 다 바뀜;;

ROLLBACK;   -- 빠르게 롤백

UPDATE DEPT_COPY
SET DEPT_TITLE = '전략기획팀' -- 총무부
WHERE DEPT_ID = 'D9';


-- 선동일 사원의 급여를 700만원으로 변경하고, 보너스도 0.2로 변경
UPDATE EMP_SALARY
SET SALARY = 7000000,
    BONUS = 0.2
WHERE EMP_NAME = '선동일';
-- 전체사원의 급여를 기존의 급여의 10프로 인상한 금액 (기존급여 * 1.1)
UPDATE EMP_SALARY 
SET SALARY = SALARY * 1.1;

 


* UPDATE시 서브쿼리를 사용 가능

UPDATE 테이블명
SET 컬럼명 = 서브쿼리
WHERE 조건;
-- 방명수 사원의 급여와 보너스 값을 유재식 사원의 급여와 보너스 값으로 변경

-- 단일행 서브쿼리
UPDATE EMP_SALARY
SET SALARY = (SELECT SALARY FROM EMP_SALARY WHERE EMP_NAME = '유재식'),
    BONUS = (SELECT BONUS FROM EMP_SALARY WHERE EMP_NAME = '유재식')
WHERE EMP_NAME = '방명수';

-- 다중열 서브쿼리
UPDATE EMP_SALARY
SET (SALARY, BONUS) = (SELECT SALARY, BONUS FROM EMP_SALARY WHERE EMP_NAME = '유재식')
WHERE EMP_NAME = '방명수';

-- ASIA 지역에서 근무하는 사원들의 보너스 값을 0.3 으로 변경
SELECT * FROM EMP_SALARY;   -- DEPT_CODE
SELECT * FROM DEPARTMENT;   -- DEPT_ID      LOCATION_ID
SELECT * FROM LOCATION;     --              LOCAL_CODE

 

 

EMP_SALARY
DEPARTMENT
LOCATION

-- 먼저 ASIA 지역에서 근무하는 사원들 조회 (서브쿼리로 사용할 것임)
SELECT EMP_ID
FROM EMP_SALARY
JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE)
WHERE LOCAL_NAME LIKE 'ASIA%';

UPDATE EMP_SALARY
SET BONUS = 0.3
WHERE EMP_ID IN (SELECT EMP_ID
                    FROM EMP_SALARY
                    JOIN DEPARTMENT ON (DEPT_CODE = DEPT_ID)
                    JOIN LOCATION ON (LOCATION_ID = LOCAL_CODE)
                    WHERE LOCAL_NAME LIKE 'ASIA%');


* UPDATE 시에도 해당 컬럼에 대한 제약조건 위배되면 안됨!

-- 사번이 200번인 사원의 이름을 NULL로 변경 (이름에 not null 제약조건이 붙어있음)
UPDATE EMPLOYEE
SET EMP_NAME = NULL
WHERE EMP_ID = 200;
-- QRA-01407: ORA-01407: cannot update ("KH"."EMPLOYEE"."EMP_NAME") to NULL
-- NOT NULL 제약조건 위배!!
-- 노옹철 사원의 직급코드 J9로 변경 (부모 테이블에 j9라는 데이터는 없음)
UPDATE EMPLOYEE 
SET JOB_CODE = 'J9'
WHERE EMP_NAME = '노옹철';
--ORA-02291: integrity constraint (KH.SYS_C007216) violated - parent key not found
-- FOREIGN KEY 제약조건 위배!!!!