예를 들어, 부서값이 20인 모든 사원의 급여를 10% 인상한다.
UPDATE
문을 사용한다update emp
set sal = sal*1.10
where deptno = 20
>>
5 row(s) updated.
대량의 업데이트를 준비할 때, 결과를 미리 볼 수도 있다.
SET
절에 들어갈 식이 포함된 SELECT
문을 통해서 알 수 있다.
쿼리는 다음과 같다.
select deptno, ename, sal as origin_sal,
sal*.10 as amt_to_add,
sal*1.10 as new_sal
from emp
where deptno = 20
order by 1, 5;
>>
DEPTNO ENAME ORIGIN_SAL AMT_TO_ADD NEW_SAL
20 SMITH 880 88 968
20 ADAMS 1210 121 1331
20 JONES 3272.5 327.25 3599.75
20 SCOTT 3300 330 3630
20 FORD 3300 330 3630
5 rows selected.
UPDATE SET
구문은 실제로 그 값을 변화시키나, SELECT
절은 연산을 통한 값을 보여줄 뿐이다.
미리 결과를 예측할 수 있다는 점에서 훌륭한 사전 작업이 될 수 있을 것 같다.
예를 들어, 'EMP_BONUS' 테이블에 사원 정보가 존재한다면, 'EMP' 테이블의 해당 사원 급여값을 20% 상승시키려고 한다.
UPDATE
문의 WHERE
절에서 서브쿼리를 사용한다'EMP_BONUS' 테이블에도 있는 'EMP' 테이블의 사원 정보를 찾는다.
update emp
set sal = sal*1.20
where empno in (select empno from emp_bonus);
select * from emp;
>>
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7839 KING PRESIDENT - 17-NOV-81 6000 - 10
7698 BLAKE MANAGER 7839 01-MAY-81 2850 - 30
7782 CLARK MANAGER 7839 09-JUN-81 2940 - 10
7566 JONES MANAGER 7839 02-APR-81 3272.5 - 20
7788 SCOTT ANALYST 7566 19-APR-87 3300 - 20
7902 FORD ANALYST 7566 03-DEC-81 3300 - 20
7369 SMITH CLERK 7902 17-DEC-80 880 - 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1210 - 20
7900 JAMES CLERK 7698 03-DEC-81 950 - 30
7934 MILLER CLERK 7782 23-JAN-82 1560 - 10
IN
대신 EXISTS
를 사용할 수 있다.
update emp
set sal = sal.1.20
where exists (select null
from emp_bonus
where emp.empno = emp_bonus.empno)
SELECT null
은 말 그대로 NULL 칼럼을 출력하겠다는 뜻으로, 값에는 아무런 영향이 없다.
앞선 절에서도 살펴본 바 있다.
행을 반환하는 것은 원치 않으며, 단지 WHERE
절의 조건에만 집중한다는 뜻으로 받아들이면 되겠다.