상세 컨텐츠

본문 제목

Oracle - UPDATE 실습2

IT/DBMS

by TMI1 2025. 7. 10. 17:51

본문

SELECT USER
FROM DUAL;
-- HR

--  EMPLOYEES 테이블의 직원들 SALARY를 10% 인상한다.
--  단, 부서명이 'IT'인 경우로 한정한다.
--  (UPDATE 쿼리문 실행 및 이후 결과를 확인한 후 ROLLBACK 할 것)
SELECT *
FROM TAB;

SELECT *
FROM EMPLOYEES;
--==> 부서명 없음~!!!
--  현재, EMPLOYEES 테이블은 부서명이 없다. >> 부서명IT는 DEPARTMENT 테이블에서 찾아라.. 

SELECT *
FROM DEPARTMENTS;
/*
EPARTMENT_ID DEPARTMENT_NAME                MANAGER_ID LOCATION_ID
------------- ------------------------------ ---------- -----------
           10 Administration                        200        1700
           20 Marketing                             201        1800
           30 Purchasing                            114        1700
           40 Human Resources                       203        2400
           50 Shipping                              121        1500
           60 IT                                    103        1400
                            :
*/
-- 60번으로 한정한다... 

UPDATE EMPLOYEES
SET SALARY = SALARY * 1.1
WHERE DEPARTMENT_ID = 60; -- NAME 없고 ID만 있는 걸 눈으로 확인함.

-- 1) 부서명 IT 부서의 부서아이디 
SELECT DEPARTMENT_ID
FROM DEPARTMENTS
WHERE DEPARTMENT_NAME = 'IT';
--==>> 60 

UPDATE EMPLOYEES
SET SALARY = SALARY * 1.1
WHERE DEPARTMENT_ID = 부서명 IT 부서의 부서아이디; 

UPDATE EMPLOYEES
SET SALARY = SALARY * 1.1
WHERE DEPARTMENT_ID = (SELECT DEPARTMENT_ID
                       FROM DEPARTMENTS
                       WHERE DEPARTMENT_NAME = 'IT'); 
--==>> 5개 행 이(가) 업데이트되었습니다.
SELECT *
FROM EMPLOYEES
WHERE DEPARTMENT_ID = (SELECT DEPARTMENT_ID
                       FROM DEPARTMENTS
                       WHERE DEPARTMENT_NAME = 'IT'); 
/*
103	Alexander	Hunold	AHUNOLD	590.423.4567	2006-01-03	IT_PROG	9900		102	60
104	Bruce	Ernst	BERNST	590.423.4568	2007-05-21	IT_PROG	6600		103	60
105	David	Austin	DAUSTIN	590.423.4569	2005-06-25	IT_PROG	5280		103	60
106	Valli	Pataballa	VPATABAL	590.423.4560	2006-02-05	IT_PROG	5280		103	60
107	Diana	Lorentz	DLORENTZ	590.423.5567	2007-02-07	IT_PROG	4620		103	60
*/

ROLLBACK;
--○ EMPLOYEES 테이블에서 JOB_TITLE이 Sales Manager 인 사원의
--   SALARY 를 해당 직무(직종)의 최고 급여(MAX_SALARY)로 수정하는 쿼리문을 구성한다. 
--   단, 입사일이 2006년 이전(해당 년도 제외) 입사자에 한하여
--  적용할 수 있도록 처리한다.  -- MAX_SALARY 20080 
--  (UPDATE 쿼리문 실행 및 이후 결과를 확인한 후 ROLLBACK 할 것)

SELECT *
FROM JOBS; 
SELECT *
FROM EMPLOYEES;

SELECT *
FROM EMPLOYEES
WHERE JOB_ID = 'SA_MAN';
/*
145	John	Russell	JRUSSEL	011.44.1344.429268	2004-10-01	SA_MAN	14000	0.4	100	80
146	Karen	Partners	KPARTNER	011.44.1344.467268	2005-01-05	SA_MAN	13500	0.3	100	80
147	Alberto	Errazuriz	AERRAZUR	011.44.1344.429278	2005-03-10	SA_MAN	12000	0.3	100	80
148	Gerald	Cambrault	GCAMBRAU	011.44.1344.619268	2007-10-15	SA_MAN	11000	0.3	100	80
149	Eleni	Zlotkey	EZLOTKEY	011.44.1344.429018	2008-01-29	SA_MAN	10500	0.2	100	80
*/

UPDATE EMPLOYEES
SET SALARY =('Sales Manager'의 MAX_SALARY)
WHERE JOB_ID = ('Sales Manager'의 JOB_ID)
AND TO_NUMBER(TO_CHAR(HIRE_DATE,'YYYY')) < 2006;

-- ('Sales Manager'의 MAX_SALARY)
SELECT MAX_SALARY
FROM JOBS
WHERE JOB_TITLE = 'Sales Manager';
-- 20080

-- ('Sales Manager'의 JOB_ID)
SELECT JOB_ID
FROM JOBS
WHERE JOB_TITLE = 'Sales Manager';
--==>> SA_MAN

UPDATE EMPLOYEES
SET SALARY =(SELECT MAX_SALARY
                FROM JOBS
                WHERE JOB_TITLE = 'Sales Manager')
WHERE JOB_ID = (SELECT JOB_ID
                FROM JOBS
                WHERE JOB_TITLE = 'Sales Manager')
AND TO_NUMBER(TO_CHAR(HIRE_DATE,'YYYY')) < 2006;
--==>> 3개 행 이(가) 업데이트되었습니다.

SELECT *
FROM EMPLOYEES
WHERE JOB_ID = 'SA_MAN';
/*
145	John	Russell	JRUSSEL	011.44.1344.429268	2004-10-01	SA_MAN	20080	0.4	100	80
146	Karen	Partners	KPARTNER	011.44.1344.467268	2005-01-05	SA_MAN	20080	0.3	100	80
147	Alberto	Errazuriz	AERRAZUR	011.44.1344.429278	2005-03-10	SA_MAN	20080	0.3	100	80
148	Gerald	Cambrault	GCAMBRAU	011.44.1344.619268	2007-10-15	SA_MAN	11000	0.3	100	80
149	Eleni	Zlotkey	EZLOTKEY	011.44.1344.429018	2008-01-29	SA_MAN	10500	0.2	100	80
*/

ROLLBACK; 
-- 롤백 완료 

SELECT *
FROM DEPARTMENTS;

--Finance
--Executive
--Accounting

SELECT *
FROM EMPLOYEES;

--○ EMPLOYEES 테이블에서 SALARY를
--   각 부서의 이름별로 다른 인상률을 적용하여 수정할 수 있도록 한다.
-- Finance → 10%
-- Executive → 15%
-- Accounting → 20%
-- 나머지 → 0%
-- (UPDATE 쿼리문 실행 및 이후 결과를 확인한 후 ROLLBACK 할 것)

-- 부서명 Finance , Executive, Accounting 조회
-- 상황에 따라 분기하는 구문
UPDATE EMPLOYEES
SET SALARY = CASE DEPARTMENT_ID WHEN ('Finance'의 부서아이디) 일 때 --DEPARTMENT NAME 이 없기 때문에 
                                THEN SARARY * 1.1
                                WHEN('Executive'의 부서아이디)
                                THEN SARARY * 1.15
                                WHEN('Accounting'의 부서아이디)
                                THEN SARARY * 1.2
                                ELSE SARARY
            END; 

--('Finance'의 부서아이디)
SELECT DEPARTMENT_ID
        FROM DEPARTMENTS
        WHERE DEPARTMENT_NAME = 'Finance';
--==>> 100 

-- ('Executive'의 부서아이디)
SELECT DEPARTMENT_ID
        FROM DEPARTMENTS
        WHERE DEPARTMENT_NAME = 'Executive';
--==>> 90 

-- ('Accounting'의 부서아이디)
SELECT DEPARTMENT_ID
        FROM DEPARTMENTS
        WHERE DEPARTMENT_NAME = 'Accounting';
--==>> 110 

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 (100,90,110);
            SELECT DEPARTMENT_ID
            FROM DEPARTMENTS
            WHERE DEPARTMENT_NAME IN ('Finance', 'Executive', 'Accounting')
         );
-- (100,90,110)
WHERE DEPARTMENT_ID 
            SELECT DEPARTMENT_ID
            FROM DEPARTMENTS
            WHERE DEPARTMENT_NAME IN ('Finance', 'Executive', 'Accounting');
/*
90
100
110
*/
-- 최종쿼리문
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개 행 이(가) 업데이트되었습니다.

ROLLBACK;
-- 롤백완료 




-- 『』  ◀  ★
--※ 
--○
/*
*/

-- →

 

'IT > DBMS' 카테고리의 다른 글

Oracle -DELETE, VIEW 생성  (3) 2025.07.11
Oracle - 테이블 전체 컬럼 이름UPDATE  (1) 2025.07.11
Oracle - UPDATE 실습1  (0) 2025.07.10
Oracle - DEFAULT 표현식 실습  (1) 2025.07.09
Oracle - NOT NULL 실습  (1) 2025.07.09

관련글 더보기

댓글 영역