SQL Cook: 4. 8 테이블에서 레코드 수정하기

0

SQL_COOK

목록 보기
29/35
post-thumbnail

Q. 테이블의 일부 또는 모든 행에 대한 값을 수정하려고 한다

예를 들어, 부서값이 20인 모든 사원의 급여를 10% 인상한다.

A 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절은 연산을 통한 값을 보여줄 뿐이다.
미리 결과를 예측할 수 있다는 점에서 훌륭한 사전 작업이 될 수 있을 것 같다.


제4. 9 장 일치하는 행이 있을 때 업데이트하기

Q. 한 테이블에 해당 행이 존재할 때 다른 테이블의 행을 업데이트하려고 한다

예를 들어, 'EMP_BONUS' 테이블에 사원 정보가 존재한다면, 'EMP' 테이블의 해당 사원 급여값을 20% 상승시키려고 한다.

A. 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절의 조건에만 집중한다는 뜻으로 받아들이면 되겠다.

0개의 댓글