문제
-- 1. 사원번호가 1001인 사원과 동일한 직급(POSITION)을 가진 사원을 조회하시오.
-- 2. 부서번호가 2인 부서와 동일한 지역에 있는 부서를 조회하시오.
-- 3. 가장 높은 급여를 받는 사원을 조회하시오.
-- 4. 평균 급여 이하를 받는 사원을 조회하시오.
-- 5. 평균 근속 개월 수 이상을 근무한 사원을 조회하시오.
-- 6. 부서번호가 2인 부서에 근무하는 사원들의 직급과 일치하는 사원을 조회하시오.
-- 7. 부서명이 '영업부'인 부서에 근무하는 사원을 조회하시오.
-- 8. 직급이 '과장'인 사원들이 근무하는 부서 정보를 조회하시오.
-- 9. '영업부'에서 가장 높은 급여를 받는 사람보다 더 높은 급여를 받는 사원을 조회하시오.
-- 10. 3 ~ 4번째로 입사한 사원을 조회하시오.
답
-- 1. 사원번호가 1001인 사원과 동일한 직급(POSITION)을 가진 사원을 조회하시오.
SELECT EMP_NO, NAME, DEPART, GENDER, POSITION, HIRE_DATE, SALARY
FROM EMPLOYEE_TBL
WHERE POSITION = (SELECT POSITION
FROM EMPLOYEE_TBL
WHERE EMP_NO = 1001);
-- 2. 부서번호가 2인 부서와 동일한 지역에 있는 부서를 조회하시오.
SELECT DEPT_NO, DEPT_NAME, LOCATION
FROM DEPARTMENT_TBL
WHERE LOCATION = (SELECT LOCATION
FROM DEPARTMENT_TBL
WHERE DEPT_NO = 2);
-- 3. 가장 높은 급여를 받는 사원을 조회하시오.
SELECT EMP_NO, NAME, DEPART, GENDER, POSITION, HIRE_DATE, SALARY
FROM EMPLOYEE_TBL
WHERE SALARY = (SELECT MAX(SALARY)
FROM EMPLOYEE_TBL);
-- 4. 평균 급여 이하를 받는 사원을 조회하시오.
SELECT EMP_NO, NAME, DEPART, GENDER, POSITION, HIRE_DATE, SALARY
FROM EMPLOYEE_TBL
WHERE SALARY <= (SELECT AVG(SALARY)
FROM EMPLOYEE_TBL);
-- 5. 평균 근속 개월 수 이상을 근무한 사원을 조회하시오.
SELECT EMP_NO, NAME, DEPART, GENDER, POSITION, HIRE_DATE, SALARY
FROM EMPLOYEE_TBL
WHERE MONTHS_BETWEEN(SYSDATE, HIRE_DATE) >= (SELECT AVG(MONTHS_BETWEEN(SYSDATE, HIRE_DATE))
FROM EMPLOYEE_TBL);
-- 6. 부서번호가 2인 부서에 근무하는 사원들의 직급과 일치하는 사원을 조회하시오.
SELECT EMP_NO, NAME, DEPART, GENDER, POSITION, HIRE_DATE, SALARY
FROM EMPLOYEE_TBL
WHERE POSITION IN (SELECT POSITION
FROM EMPLOYEE_TBL
WHERE DEPART = 2); -- WHERE절에서 사용한 DEPART 칼럼이 PK/UNIQUE 칼럼이 아니므로 다중 행 서브쿼리로 처리한다.
-- 7. 부서명이 '영업부'인 부서에 근무하는 사원을 조회하시오.
SELECT EMP_NO, NAME, DEPART, GENDER, POSITION, HIRE_DATE, SALARY
FROM EMPLOYEE_TBL
WHERE DEPART IN (SELECT DEPT_NO
FROM DEPARTMENT_TBL
WHERE DEPT_NAME = '영업부'); -- WHERE절에서 사용한 DEPART_NAME 칼럼이 PK/UNIQUE가 아니므로 다중 행 서브쿼리로 처리한다.
-- 참고) 조인으로 풀기
SELECT E.EMP_NO, E.NAME, E.DEPART, E.GENDER, E.POSITION, E.HIRE_DATE, E.SALARY
FROM DEPARTMENT_TBL D INNER JOIN EMPLOYEE_TBL E
ON D.DEPT_NO = E.DEPART
WHERE D.DEPT_NAME = '영업부';
-- 8. 직급이 '과장'인 사원들이 근무하는 부서 정보를 조회하시오.
SELECT DEPT_NO, DEPT_NAME, LOCATION
FROM DEPARTMENT_TBL
WHERE DEPT_NO IN (SELECT DEPART
FROM EMPLOYEE_TBL
WHERE POSITION = '과장'); -- WHERE절에서 사용한 POSITION 칼럼이 PK/UNIQUE가 아니므로 다중 행 서브쿼리로 처리한다.
-- 참고) 조인으로 풀기
SELECT D.DEPT_NO, D.DEPT_NAME, D.LOCATION
FROM DEPARTMENT_TBL D INNER JOIN EMPLOYEE_TBL E
ON D.DEPT_NO = E.DEPART
WHERE E.POSITION = '과장';
-- 9. '영업부'에서 가장 높은 급여를 받는 사람보다 더 높은 급여를 받는 사원을 조회하시오.
SELECT EMP_NO, NAME, DEPART, GENDER, POSITION, HIRE_DATE, SALARY
FROM EMPLOYEE_TBL
WHERE SALARY > (SELECT MAX(SALARY)
FROM EMPLOYEE_TBL
WHERE DEPART IN (SELECT DEPT_NO
FROM DEPARTMENT_TBL
WHERE DEPT_NAME = '영업부'));
-- 참고) 서브쿼리를 조인으로 풀기
SELECT EMP_NO, NAME, DEPART, GENDER, POSITION, HIRE_DATE, SALARY
FROM EMPLOYEE_TBL
WHERE SALARY > (SELECT MAX(E.SALARY)
FROM DEPARTMENT_TBL D INNER JOIN EMPLOYEE_TBL E
ON D.DEPT_NO = E.DEPART
WHERE D.DEPT_NAME = '영업부');
-- 10. 3 ~ 4번째로 입사한 사원을 조회하시오.
SELECT EMP_NO, NAME, DEPART, GENDER, POSITION, HIRE_DATE, SALARY
FROM (SELECT ROW_NUMBER() OVER(ORDER BY HIRE_DATE ASC) AS RN, EMP_NO, NAME, DEPART, GENDER, POSITION, HIRE_DATE, SALARY
FROM EMPLOYEE_TBL)
WHERE RN BETWEEN 3 AND 4;