ORACLE

UPDATE 시 조건절 / Oracle subquery (서브쿼리) 로 조건절 만들기

universedevelope 2022. 7. 30. 11:26
-- 『부서번호』 가 
--  (부서번호 / 부서테이블 / 부서이름이 IT인 곳에서) 와 같다는 조건만들기
--  ↓
UPDATE EMPLOYEES
SET SALARY = SALARY * 1.1
WHERE DEPARTMENT_ID = ( SELECT DEPARTMENT_ID
                        FROM DEPARTMENTS
                        WHERE DEPARTMENT_NAME = 'IT' );
--==>> 5개 행 이(가) 업데이트되었습니다.








-- ○ EMPLOYEES 테이블에서 JOB_TITLE 이 『Sales Manager』 인 사원들의
--    SALARY 를 해당 직무(직종)의 최고급여(MAX_SALARY)로 수정한다.
--    단, 입사일이 2006년 이전(해당년도제외) 입사자에 한해 적용.
--    (또한, 변경에 대한 결과 확인 후 ROLLBACK 수행)

-- 변경 전 Sales Manager의 입사일, 급여
SELECT *
FROM JOBS;

SELECT HIRE_DATE, SALARY
FROM EMPLOYEES
WHERE JOB_ID = (SELECT JOB_ID
                FROM JOBS
                WHERE JOB_TITLE = 'Sales Manager' );
/*
2004-10-01	14000
2005-01-05	13500
2005-03-10	12000
2007-10-15	11000
2008-01-29	10500
*/

--  Sales Manager의 입사일, 급여 조장
--  조건 1 : 직종이 Sales Manager
--  조건 2 : 해당 부서에서 2006년 이전 입사자만

--  변경해야할 급여 : 해당부서 전체직원 중 가장 높은 급여로 변경

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 EXTRACT (YEAR FROM HIRE_DATE) < 2006;          
--==>> 3개 행 이(가) 업데이트되었습니다.






-- ○ EMPLOYEES 테이블에서 SALARY를
--    각 부서의 이름별로 다른 인상률을 적용하여 수정할 수 있도록 한다.
--    Finance → 10% 인상
--    Executive → 15% 인상
--    Accounting  → 20% 인상
--    변경에 대한 결과 확인 후 ROLLBACK
SELECT DEPARTMENT_ID
FROM DEPARTMENTS
WHERE DEPARTMENT_NAME IN ('Accounting', 'Finance', 'Executive');




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 ('Accounting', 'Finance', 'Executive'));
----> 끝
---- 해당 쿼리문은 where 절 없이도 작동은하나, where 절 없이는
---- 속도가 늦는 현상이 발생한다
--==>> WHERE 절 없는 경우 : 11개 행 이(가) 업데이트되었습니다.
                 --        ↕                     
--==>> WHERE 절 없는 경우 : 107개 행 이(가) 업데이트되었습니다.
728x90