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