-- ■■■ 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 |