본문 바로가기

📚Study Note/ORACLE

[ ORACLE ] UPDATE : 테이블에서 기존 데이터를 변경 + 업데이트 실수를 백업테이블로 다시 수정하기

-- ■■■ UPDATE ■■■

--1. 테이블에서 기존 데이터를 변경하는 구문.

-- 2. 형식 및 구조
--UPDATE 테이블명
--SET 컬럼명=변경할 값[, 컬럼명=변경할 값,....]
--[WHERE 조건절]

SELECT  *
FROM TBL_SAWON;
/*
1002	김서현	9412272234567	10/11/05	2000
1003	김아별	9303082234567	99/08/16	5000
1004	이유림	9609142234567	08/02/02	4000
1005	정주희	9712242234567	09/07/15	2000
1006	한혜림	9710062234567	09/07/15	2000
1007	이하이	0405064234567	10/06/05	1000
1008	아이유	0103254234567	12/07/13	3000
1009	정준이	9804251234567	07/07/08	4000
1010	이이제	0204254234567	08/12/10	2000
1011	선동열	7505071234567	90/10/10	3000
1012	선우선	9912122234567	02/10/10	2000
1013	선우용녀	7101092234567	91/11/11	1000
1014	남주혁	0203043234567	10/05/05	2000
1015	남궁선	0512123234567	12/08/14	1000
1016	남이	7012121234567	90/08/14	2000
1001	김가영	9402252234567	21/03/30	100
*/


ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD';


-- ● TBL_SAWON 테이블에서 사원번호 1003 번 사원의
-- 주민번호를 『8303082234567』


UPDATE TBL_SAWON
SET JUBUN='8303082234567'
WHERE SANO=1003;
--===>>1 행 이(가) 업데이트되었습니다.


/*
업데이트를 쓰게 되면 내가 바꾸고자 하는 테이블이 이게 맞는지 확인하고
일단은 UPDATE TBL_SAWON 써주고 그런다음 WHERE 조건절부터 써서 사원번호 1003이니까
WHERE SANO=1003 쓰고 , 쿼리문 가운데에 SET JUBUN='83003082234567'
*/

SELECT *
FROM TBL_SAWON;
-- 실행 후 COMMIT 또는 ROLLBACK을 반드시 선택적으로 실행
COMMIT;
--==>> 커밋 완료.

-- ● TBL_SAWON 테이블에서 1005번 사원의 입사일 과 급여를 
-- 각각 2018-02-22, 2200 으로 변경한다.

UPDATE TBL_SAWON
SET HIREDATE = '2018-02-22', SAL=2200
WHERE SANO='1005';
--확인
--1005	정주희	9712242234567	2018-02-22	2200
--확인후커밋
COMMIT;


UPDATE TBL_SAWON
SET HIREDATE = TO_DATE('2018-02-22', 'YYYY-MM-DD')
WHERE SANO='1005';


COMMIT;

-- ● TBL_INSA 테이블 복사(데이터만)

CREATE TABLE TBL_INSABACKUP
AS
SELECT *
FROM TBL_INSA;
--==>>Table TBL_INSABACKUP이(가) 생성되었습니다.


-- TBL_INSABACKUP 테이블에서 
-- 직위가 과장과 부장만 수당 10% 인상!
SELECT *
FROM TBL_INSABACKUP;


UPDATE TBL_INSABACKUP T --여기서 T.SUDANG 안해도 됨
SET SUDANG = T.SUDANG*1.1--수당 10프로인상
WHERE JIKWI IN ('과장','부장');---직위 과장부장
--==>>15개 행 이(가) 업데이트되었습니다.

SELECT NAME,JIKWI,SUDANG,SUDANG*1.1
FROM TBL_INSABACKUP
WHERE JIKWI IN ('과장','부장');
/*
홍길동	부장	    220000	242000
이순애	부장	    176000	193600
이기자	과장	    165000	181500
김종서	부장  	143000	157300
이상헌	과장	    165000	181500
박문수	과장	    181500	199650
김인수	부장  	187000	205700
김영길	과장	    187000	205700
정정해	과장	    136400	150040
지재환	부장	    176000	193600
최석규	과장	    205700	226270
문길수	과장	    165000	181500
허경운	부장	    165000	181500
권영미	과장	    114400	125840
이미경	부장	    176000	193600



*/

--INSABACKUP 테이블에서 전화번호가 016, 017, 018, 019 로 시작하는
-- 전화번호인 경우 이를 모두 010 으로 변경한다.

--○테이블 전체 확인
SELECT *
FROM TBL_INSABACKUP;

-- ○전화번호가 016, 017, 018, 019 로 시작하는 행 조회
SELECT *
FROM TBL_INSABACKUP
WHERE TEL LIKE '016%' OR TEL LIKE '017%' OR TEL LIKE '018%' OR TEL LIKE '019%';
--WHERE SUBSTR(TEL,1,3) IN ('016', '017', '018', '019')



-- ○전화번호가 016, 017, 018, 019 로 시작하는 행 업데이트
UPDATE TBL_INSABACKUP
SET TEL = REPLACE(TEL,SUBSTR(TEL,1,3),'010')
WHERE TEL LIKE '016%' OR TEL LIKE '017%' OR TEL LIKE '018%' OR TEL LIKE '019%';
--WHERE SUBSTR(TEL,1,3) IN ('016', '017', '018', '019')
--==>> 24개 행 이(가) 업데이트되었습니다.


--○테이블 전체 확인
SELECT *
FROM TBL_INSABACKUP;


-- ●TBL_SAWON 테이블 백업
CREATE TABLE TBL_SAWONBACKUP
AS
SELECT *
FROM TBL_SAWON;
--==>>Table TAB_SAWONBACKUP이(가) 생성되었습니다.


--● 확인
SELECT *
FROM TBL_SAWONBACKUP;



-- 만약에 이땡땡 사원이 이불라불라 사원으로 바꾸고 싶었는데
-- 모든 사원의 이름은 이불라불라로 바꿔버리고 커밋해버렸다면?

-- 불완전 복구이기는 하다만 TBL_SAWON 테이블을 백업해둔 TBL_SAWONBACK을
-- 실행할 수 있다.

-- UPDATE 처리 이후에 COMMIT 을 수행하였다면 ROLLBACK 은 불가능한 상황
-- 하지만 TBL_SAWONBACKUP 테이블에 데이터를 백업해 두었다.
-- SANAME 컬럼의 내용만 추출하여 '이불라불라' 대신 넣어줄 수 있다는 것이다.

UPDATE TBL_SAWON
SET NAME='김가영'
WHERE SANO=1001;

UPDATE TBL_SAWON
SET NAME='김서현'
WHERE SANO=1002;

UPDATE TBL_SAWON
SET NAME='김아별'
WHERE SANO=1003;

--만약 사원이 16000명 이라면 ..하나하나바꾸기가 힘들다 그럴 수 없다

UPDATE TBL_SAWON                      -- 1002, 1003, ....
SET SANAME=TBL_SAWONBAKUP 테이블의 1001번 사원의 사원명;

-- A테이블의 이름이 모두 이 불라불라로 바뀌었을 때
-- A테이블의 백업테이블인 B백업 테이블의 이름을 하나하나씩 A에 업데이트해주는 것
UPDATE TBL_SAWON                     
SET SANAME=(  SELECT SANAME
              FROM TBL_SAWONBAKUP
              WHERE SANO=TBL_SAWON.SANO  );
              

 

 

 

 

UPDATE 문 실습

-- ● EMPLOYEES 테이블의 직원들 SALARY 를 10% 인상한다.
-- 단, 부서명이 'IT'인 경우로  한정한다.
-- (변경된 결과를 확인 후 ROLLBACK)

 

SELECT *
FROM DEPARTMENTS;
--==>> 부서 테이블에 부서명이 있다.


-- 우선 EMPLOYEES 테이블 확인

SELECT *
FROM EMPLOYEES;

--
SELECT *
FROM EMPLOYEES
WHERE 직원테이블의 DEPARTMENT_ID =부서테이블의 IT 부서의 DEPARTMENT_ID ;

-- IT 부서인 직원을 모두 조회
SELECT *
FROM EMPLOYEES
WHERE DEPARTMENT_ID = (SELECT DEPARTMENT_ID
                        FROM DEPARTMENTS
                        WHERE DEPARTMENT_NAME='IT');
                        
                        
                        
-- IT 부서 직원들의 급여를 10% 인상
UPDATE EMPLOYEES
SET SALARY = SALARY*1.1
WHERE DEPARTMENT_ID = (SELECT DEPARTMENT_ID
                        FROM DEPARTMENTS
                        WHERE DEPARTMENT_NAME='IT');
--==>> 5개 행 이(가) 업데이트되었습니다.

--[확인결과]
/*
103	Alexander	Hunold	AHUNOLD	590.423.4567	06/01/03	IT_PROG	9000		102	60
103	Alexander	Hunold	AHUNOLD	590.423.4567	06/01/03	IT_PROG	9900		102	60
--==>> ALEXANDER 의 SALARY가 9000에서 9900으로 증가했다. */

-- 업데이트 한 결과 ROLLBACK;
ROLLBACK;
                        
--==>>롤백 완료.

 

-- ● EMPLOYEES 테이블에서 SALARY 를
-- 각 부서의 이름별로 다른 인상률을 적용하여 수정할 수 있도록 한다.
-- FINANCE 10%
-- EXECUTIVE 15% 
-- ACCOUNTING 20% (쿼리문을 작성하여 결과 확인 후 ROLLBACK)

 

UPDATE EMPLOYEES
SET SALARY = CASE DEPARTNENT_ID WHEN (F부서의 아이디) THEN SALARY*1.1 
                                WHEN (E부서의 아이디) THEN SALARY*1.15 
                                WHEN (A부서의 아이디) THEN SALARY*1.2 
                                ELSE SALARY
             END;    

UPDATE EMPLOYEES
SET SALARY = CASE DEPARTMENT_ID WHEN (SELECT DEPARTMENT_ID
                                    FROM DEPARTMENTS
                                    WHERE DEPARTMENT_NAME='Finance') THEN SALARY*1.1 
                                WHEN (SELECT DEPARTMENT_ID
                                    FROM DEPARTMENTS
                                    WHERE DEPARTMENT_NAME='Executive') THEN SALARY*1.15 
                                WHEN (SELECT DEPARTMENT_ID
                                    FROM DEPARTMENTS
                                    WHERE DEPARTMENT_NAME='Accounting') THEN SALARY*1.2 
                                ELSE SALARY
             END;
   --==>>107개 행 이(가) 업데이트되었습니다.          
ROLLBACK;--==??롤백 완료.





UPDATE EMPLOYEES
SET SALARY = CASE DEPARTMENT_ID WHEN (SELECT DEPARTMENT_ID
                                    FROM DEPARTMENTS
                                    WHERE DEPARTMENT_NAME='Finance') THEN SALARY*1.1 
                                WHEN (SELECT DEPARTMENT_ID
                                    FROM DEPARTMENTS
                                    WHERE DEPARTMENT_NAME='Executive') THEN SALARY*1.15 
                                WHEN (SELECT DEPARTMENT_ID
                                    FROM DEPARTMENTS
                                    WHERE DEPARTMENT_NAME='Accounting') THEN SALARY*1.2 
                                ELSE SALARY
             END
WHERE DEPARTMENT_ID IN (SELECT DEPARTMENT_ID 
                        FROM DEPARTMENTS
                        WHERE DEPARTMENT_NAME IN ('Finance','Executive','Accounting'));

--==>> 11개 행 이(가) 업데이트되었습니다.
--위에서는 107개행이 업데이트 된 반면 여기서는 11개행만이 업데이트되었다. 
-- 따라서 이 경우는 WHERE 절이 없어도 되지만 있는 것이 바람직하다. 


ROLLBACK;
--==>>롤백 완료.


'📚Study Note > ORACLE' 카테고리의 다른 글

[ ORACLE ] PL / SQL  (0) 2021.04.08
[ ORACLE ] DELETE │ VIEW  (0) 2021.04.08
[ ORACLE ] DEFAULT 표현식  (0) 2021.04.07
[ ORACLE ] NOT NULL(NN:CK:C)  (0) 2021.04.07
[ ORACLE ] FOREIGN KEY(FK : F: R)  (0) 2021.04.07