본문 바로가기
공부/Oracle

오라클 SQL 문법 공부22- UPDATE 문

by 리빈아빠 2018. 3. 21.
반응형

서론

이번에는 기존에 저장 되어있는 데이터를 변경해주는 UPDATE 문에 대해서 알아보고자 한다. UPDATE문은 특정 데이터만 변경하는 경우가 많기 때문에 WHERE 조건을 잘 명시해주어야 한다. 제대로 해주지 않으면 변경되지 않아야 하는 데이터도 변경이 되어버리기 때문에 조심해서 사용해야 한다.

본론

오다이바

--UPDATE
--UPDATE 문장은 기존 데이터를 다른 데이터로 변경할 때 사용하는 방법입니다.
--UPDATE TABLE_NAME
--SET COLUMN = VALUE
--WHERE 조건;

--PROFESSOR 테이블에서 차범철 교수의 직급과 동일한 직급을 가진 교수들 중 현재 급여가 250만원이 안되는 경수들의 급여를 15% 인상하세요.

--차범철 교수와 직급이 같은 교수들 중 급여가 250 이상인 교수 조회
SELECT P1.NAME,
       P1.PAY * 1.15
  FROM PROFESSOR_TEST P1,
       PROFESSOR_TEST P2
 WHERE P2.NAME = '차범철'
   AND P1.POSITION = P2.POSITION
   AND P1. PAY < 250;
 
-- 직급이 차범철 교수와 같은 교수들의 급여를 15% 인상한 값을 넣어줌
UPDATE PROFESSOR_TEST
SET PAY = PAY*1.15
WHERE  POSITION = (SELECT POSITION FROM PROFESSOR_TEST WHERE NAME = '차범철')
AND PAY < 250;
COMMIT;

--PROFESSOR_TEST 테이블에서 나한열 교수의 급여와 보너스를 주승재 교수와 동일하게 수정하여라
--1)
UPDATE PROFESSOR_TEST
SET PAY = (SELECT PAY FROM PROFESSOR_TEST WHERE NAME = '주승재'),
BONUS = (SELECT BONUS FROM PROFESSOR_TEST WHERE NAME = '주승재')
WHERE NAME = '나한열';
SELECT * FROM PROFESSOR_TEST;
ROLLBACK;

--2) 동시에
UPDATE PROFESSOR_TEST
SET (PAY, BOUNUS) = (SELECT PAY, BONUS FROM PROFESSOR_TEST WHERE NAME = '주승재')
WHERE NAME = '나한열';
--가급적 최소한의 FROM 절을 사용하는 것이 좋다.

--EMP_TEST테이블을 이용하여 각 직원의 연봉을 그 직원의 상위관리자의 연봉으로 수정하여라.
--단, 상위관리자가 없는 직원의 연봉은 기존과 같게한다.
UPDATE EMP_TEST E1
SET SAL = NVL((SELECT E2.SAL FROM EMP_TEST E2 WHERE E1.MGR = E2.EMPNO), E1.SAL);

UPDATE문은 UPDATE 변경할 데이터가 있는 테이블 명 SET 변경할 컬럼 = 변경할 값 그리고 특정조건을 WHERE 절에 입력함으로써 사용한다. 만약 변경할 컬럼이 복수개 라면 , 컴마로 구분하여 더 입력해주거나 괄호로 컬럼들을 묶어 서브쿼리 결과 값으로 SELECT 절의 컬럼과 데이터타입, 개수가 맞게끔 해주면 된다.

EX) UPDATE PROFESSOR_TEST SET PAY = 100, POSITION = '교수'; (교수 테이블의 페이와 직급을 모두 100, 교수로 변경)

UPDATE PROFESSOR_TEST SET (PAY, POSITION) = (SELECT 100, '교수' FROM DUAL);


UPDATE문을 날릴 테이블에 애칭을 먹여서 서브쿼리절과 함께 조인도 가능하다. 단 당연한 말이지만 조인 된 결과의 값이 한 행씩 나올경우에만 가능하다.

EX) UPDATE EMP E1

SET E1.SAL = (SELECT CASE WHEN E2.EMPNO IS NULL THEN (E1.SAL * 1.1) ELSE (E1.SAL + E2.SAL / 2) END FROM EMP E2 WHERE E1.MGR = E2.EMPNO(+))

WHERE E1.DEPTNO = (SELECT DEPTNO FROM EMP WHERE ENAME = 'JAMES');


E1.SAL = 에 입력할 변경될 서브쿼리의 값이 복수개가 나오면 당연히 오류가 난다. 위의 쿼리는 셀프조인을 하여 자신의 상사 (단 한명) 가 있을 경우 상사와 자신의 급여 합의 반을 상사가 없다면 자신의 급여를 10%를 인상한 값을 UPDATE 하는 것이다.


또한 변경될 컬럼이 참조키라면 제약조건에 의해 특정 값들로 변경이 불가능하다. 참조하고 있는 테이블의 컬럼에 변경할 값을 추가 해주어야 정상적으로 변경 될 것이다.

UPDATE 후에는 COMMIT이나 ROLLBACK을

INSERT문에 대해서 포스팅 할 때에도 COMMIT과 ROLLBACK에 관해서 말씀을 드렸었다. 단순히 생각해 변경된 값을 정상적으로 디스크인 DB에 저장하려면 COMMIT을, 저장하지 않고 싶다면 ROLLBACK을 하라고 했었다. UPDATE문도 마찬가지로 데이터를 수정하는 것이기 때문에 COMMIT과 ROLLBACK을 통해 추가적인 작업을 해주어야 한다.


특정 사용자가 데이터를 갱신하거나 추가, 삭제를 할 경우 확정되기 전까지에는 데이터 일관성을 위해 다른 사용자들은 변경 하기전 데이터를 계속해서 보여주어야 한다. 따라서 이를 트랜잭션이라는 작업 단위로 묶어 사용자 별로 가지고 있는다. 트랜잭션이 INSERT, UPDATE DELETE 등 차례대로 사용한 것들을 가지고 있다가 COMMIT이나 ROLLBACK을 통하여 트랜잭션을 종료하면서 실제 DB에 저장하는 것이다. 이 트랜잭션 때문에 동시에 다른 사용자도 데이터를 변경 하려 하면 아직 종료되지 않은 트랜잭션 때문에 테이블에 락이 걸려 즉시 반영이 되지 않는다. 앞 시점에 먼저 발생한 트랜잭션이 COMMIT든 ROLLBACK이든 종료가 되어야지 락이 풀리고 나서야 정상적으로 COMMIT이나 ROLLBACK을 통해 트랜잭션을 종료할 수가 있다. 

결론

UPDATE 문에 대해 알아보았다. UPDATE는 단순히 특정조건의 데이터를 변경할 때 사용하는 구문이다. INSERT와 구문 자체가 조금은 다르기 때문에 처음 접하면 헛갈릴 수 있으니 자주 테스트 하면서 익히는게 좋을 것이다. INSERT는 새로운 레코드를 추가하는 것이고 UPDATE는 기존에 있는 레코드를 변경한다고 보면 된다.