-- 모든 직원의 현재 직종 및 이전 직종을 사원 아이디, 직종 아이디로 표현하기
-- 각 사원에 대해 동일한 직종은 한 번만 조회
SELECT EMPLOYEE_ID, JOB_ID, 'C'
FROM EMPLOYEES
UNION
SELECT EMPLOYEE_ID, JOB_ID, 'P'
FROM JOB_HISTORY;
 
-- 모든 직원의 현재 직종 및 이전 직종을 사원 아이디, 직종 아이디로 표현하기
SELECT EMPLOYEE_ID, JOB_ID
FROM EMPLOYEES
UNION ALL
SELECT EMPLOYEE_ID, JOB_ID
FROM JOB_HISTORY
ORDER BY EMPLOYEE_ID;
 
-- 50번 부서에서 근무중이거나 근무했던 사원의 아이디, 직종을 조회하기
SELECT EMPLOYEE_ID, JOB_ID, HIRE_DATE AS START_DATE, NULL AS END_DATE
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 50
UNION ALL
SELECT EMPLOYEE_ID, JOB_ID, START_DATE, END_DATE
FROM JOB_HISTORY
WHERE DEPARTMENT_ID = 50;
 
-- 현재 50번 부서에 근무 중인 직원 중에서 이전에 50번 부서에 근무 경험이 있는 직원 조회하기
SELECT A.EMPLOYEE_ID, B.FIRST_NAME, B.SALARY
FROM (SELECT EMPLOYEE_ID
         FROM EMPLOYEES
         WHERE DEPARTMENT_ID = 50
         INTERSECT 
         SELECT EMPLOYEE_ID
         FROM JOB_HISTORY
         WHERE DEPARTMENT_ID = 50) A, EMPLOYEES B
WHERE A.EMPLOYEE_ID = B.EMPLOYEE_ID;
 
-- 90번 부서에 근무 중인 사원 중에서 업무가 변경된 적이 한 번도 없는 사원의 아이디를 조회하기
SELECT EMPLOYEE_ID
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 90
MINUS
SELECT EMPLOYEE_ID
FROM JOB_HISTORY;
 
-- 90번 부서에 근무 중인 사원 중에서 업무가 변경된 적이 한 번도 없는 사원의 정보를 조회하기
SELECT *
FROM EMPLOYEES
WHERE EMPLOYEE_ID IN (SELECT EMPLOYEE_ID
                                FROM EMPLOYEES
                                WHERE DEPARTMENT_ID = 90
                                MINUS
                                SELECT EMPLOYEE_ID
                                FROM JOB_HISTORY);
 
-- 직원 아이디가 174 사원과 관리자 및 부서가 동일한 사원을 조회하기
SELECT *
FROM EMPLOYEES
WHERE (MANAGER_ID, DEPARTMENT_ID) IN (SELECT MANAGER_ID, DEPARTMENT_ID -- 앞부분 괄호 필수, 순서 지켜야
                                                        FROM EMPLOYEES
                                                        WHERE EMPLOYEE_ID = 174);
 
-- 부서별 최고 급여를 조회했을 때
SELECT EMPLOYEE_ID, FIRST_NAME, NVL(TO_CHAR(DEPARTMENT_ID), '없음'), SALARY
FROM EMPLOYEES
WHERE (NVL(DEPARTMENT_ID, 0), SALARY) IN (SELECT NVL(DEPARTMENT_ID, 0), MAX(SALARY)
                                                 FROM EMPLOYEES
                                                 GROUP BY DEPARTMENT_ID);
 
-- 스칼라 서브쿼리 사용하기
-- 아이디, 이름, 급여, 평균 급여와의 차
SELECT EMPLOYEE_ID, FIRST_NAME, SALARY - (SELECT TRUNC(AVG(SALARY)) FROM EMPLOYEES) AVG_SALARY
FROM EMPLOYEES;
 
-- 전체 평균 급여보다 10000달러 이상 많이 받는 사원 조회하기
SELECT EMPLOYEE_ID, FIRST_NAME, SALARY 
FROM EMPLOYEES
WHERE SALARY - (SELECT TRUNC(AVG(SALARY)) FROM EMPLOYEES) >= 10000;
 
-- 모든 사원의 급여를 인상시키기
-- 평균 급여보다 적은 급여를 받는 사원의 급여 인상시키기
-- (평균급여액 - 급여)/4
UPDATE EMPLOYEES
SET
    SALARY = SALARY + TRUNC(((SELECT AVG(SALARY) FROM EMPLOYEES) - SALARY)/4)
WHERE EMPLOYEE_ID IN (SELECT EMPLOYEE_ID
                                FROM EMPLOYEES
                                WHERE SALARY < (SELECT AVG(SALARY)
                                FROM EMPLOYEES));
 
SELECT * FROM EMPLOYEES;
ROLLBACK;
 
-- 급여별 급여 인상액 추정해보기
-- 15000달러 이상 10% 인상, 10000달러 이상 15% 인상, 10000달러 미만 20% 인상
-- 평균 급여 대비 인상률임
SELECT
    EMPLOYEE_ID,
    FIRST_NAME,
    SALARY,
    CASE
        WHEN SALARY >= 15000 THEN TRUNC((SELECT AVG(SALARY) FROM EMPLOYEES) * 0.1)
        WHEN SALARY >= 10000 THEN TRUNC((SELECT AVG(SALARY) FROM EMPLOYEES) * 0.15)
        ELSE TRUNC((SELECT AVG(SALARY) FROM EMPLOYEES) * 0.2)
    END INCREMENT_SALARY
FROM EMPLOYEES;
 
-- 부서 아이디, 부서 이름, 부서별 사원수 계산하기(상호연관 서브쿼리)
SELECT A.DEPARTMENT_ID, A.DEPARTMENT_NAME,
          (SELECT COUNT(*FROM EMPLOYEES X WHERE X.DEPARTMENT_ID = A.DEPARTMENT_ID)
FROM DEPARTMENTS A
WHERE A.MANAGER_ID IS NOT NULL;
 
-- 일반 서브쿼리와 상호 연관 서브쿼리
-- 일반 서브쿼리
-- 전체 사원의 평균급여보다 급여를 많이 받는 사원 조회하기
SELECT FIRST_NAME, SALARY
FROM EMPLOYEES
WHERE SALARY > (SELECT TRUNC(AVG(SALARY))
                        FROM EMPLOYEES);  -- 서브쿼리는 단 한 번 실행되고, 실행 결과가 조건식에 사용된다.
 
-- 상호연관 서브쿼리
-- 소속부서의 평균급여보다 급여를 많이 받는 사원 조회하기
SELECT A.FIRST_NAME, A.DEPARTMENT_ID, A.SALARY
FROM EMPLOYEES A
WHERE A.SALARY > (SELECT AVG(SALARY) FROM EMPLOYEES B WHERE B.DEPARTMENT_ID = A.DEPARTMENT_ID);
 
 
SELECT EMPLOYEE_ID, FIRST_NAME, JOB_ID
FROM EMPLOYEES
WHERE TO_CHAR(HIRE_DATE, 'yyyy'>= '2003';
AND TO_CHAR(HIRE_DATE, 'mm') in ('01','02','03'
UNION
SELECT EMPLOYEE_ID, FIRST_NAME, JOB_ID
FROM EMPLOYEES
where TO_CHAR(HIRE_DATE, 'yyyymm'>= 200501
AND TO_CHAR(HIRE_DATE, 'yyyymm'<= 200506;
 
SELECT EMPLOYEE_ID
FROM EMPLOYEES
WHERE TO_CHAR(HIRE_DATE, 'yyyy'= 2005;
 
SELECT a.department_id, a.department_name, (SELECT count(*FROM EMPLOYEES x where x.DEPARTMENT_ID = a.department_id) as 사원수
FROM DEPARTMENTS a;
cs

'Oracle Database SQL' 카테고리의 다른 글

0410 필기  (0) 2019.06.17
190418  (0) 2019.06.07
190416(2)  (0) 2019.06.07
190416  (0) 2019.06.07
190415  (0) 2019.06.07

+ Recent posts