18.SQL 연습
by SANGGI JEON
실습 1
- 각 사원(employee)에 대해서 사번(employee_id), 이름(first_name), 부서명(department_name), 매니저(manager)의 이름(first_name)을 조회하시오.
SELECT E.EMPLOYEE_ID, E.FIRST_NAME, D.DEPARTMENT_NAME, M.FIRST_NAME
FROM EMPLOYEES E LEFT OUTER JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
LEFT OUTER JOIN EMPLOYEES M
ON E.MANAGER_ID = M.EMPLOYEE_ID
실습 2
- 자신의(EMPLOYEE_ID = 118) 매니저보다 채용일(hire_date)이 빠른 사원의 사번(employee_id), 성(last_name)과 채용일(hire_date)을 조회하세요.
SELECT EMPLOYEE_ID, LAST_NAME, HIRE_DATE
FROM EMPLOYEES
WHERE HIRE_DATE < (SELECT M.HIRE_DATE
FROM EMPLOYEES E JOIN EMPLOYEES M
ON E.MANAGER_ID = M.EMPLOYEE_ID
WHERE E.EMPLOYEE_ID = 118);
실습 3
- 자신의(EMPLOYEE_ID = 118) 부서 평균 급여보다 연봉이 많은 사원의 사번(EMPLOYEE_ID), 성(LAST_NAME)과 연봉(SALARY)을 조회하세요.
SELECT EMPLOYEE_ID, LAST_NAME, SALARY
FROM EMPLOYEES
WHERE SALARY > (SELECT AVG(SALARY)
FROM EMPLOYEES
WHERE DEPARTMENT_ID = (SELECT DEPARTMENT_ID
FROM EMPLOYEES
WHERE EMPLOYEE_ID=118))
실습 4
- 입사일이 2005년 이전 직원들의 부서, 이름, 입사일, 부서 주소를 다음과 같이 출력 출력시 입사일 빠른 순으로 정렬하시오.
-
부서 이름 입사일 주소
-
SELECT D.DEPARTMENT_NAME AS "부서", E.FIRST_NAME || ' ' || E.LAST_NAME AS "이름", E.HIRE_DATE AS "입사일", L.STREET_ADDRESS || ' ' || L.CITY || ' ' || C.COUNTRY_NAME || ' ' || R.REGION_NAME AS "주소"
FROM EMPLOYEES E LEFT OUTER JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
LEFT OUTER JOIN LOCATIONS L
ON D.LOCATION_ID = L.LOCATION_ID
LEFT OUTER JOIN COUNTRIES C
ON L.COUNTRY_ID = C.COUNTRY_ID
LEFT OUTER JOIN REGIONS R
ON C.REGION_ID = R.REGION_ID
WHERE E.HIRE_DATE < '05/01/01'
ORDER BY E.HIRE_DATE
/
실습 5
- 직책(JOB TITLE)이 SALES MANAGER인 사원들의 입사년도와 입사년도(HIRE_DATE)별 평균 급여를 출력하시오
- 출력 시 년도를 기준으로 오름차순 정렬하시오.
SELECT TO_CHAR(HIRE_DATE, 'YYYY') AS "HIRE DATE", AVG(SALARY) AS AVG
FROM EMPLOYEES E JOIN JOBS JO
ON E.JOB_ID = JO.JOB_ID
WHERE JOB_TITLE = 'Sales Manager'
GROUP BY TO_CHAR(HIRE_DATE, 'YYYY')
ORDER BY "HIRE DATE";
실습 6
- 각 도시(City)에 있는 모든 부서 직원들의 평균 급여를 조회하고자 한다.
- 평균급여가 가장 낮은 도시부터 도시명(city)과 평균연봉, 해당 도시의 직원수를 출력하시오.
- 단, 도시에 근무하는 직원이 최소 3명 이상 근무하는 지역만 조회하시오.
SELECT L.CITY, AVG(SALARY), COUNT(*)
FROM EMPLOYEES E JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
JOIN LOCATIONS L
ON D.LOCATION_ID = L.LOCATION_ID
GROUP BY L.CITY
HAVING COUNT(*) >2
ORDER BY AVG(E.SALARY);
실습 7
- ‘Public Accountant’의 직책(job_title)으로 과거에 근무한 적이 있는 모든 사원의 사번과 이름을 출력하시오.
- (현재 ‘Public Accountant’의 직책(job_title)으로 근무하는 사원은 고려 하지 않는다.)
- 다음과 같이 출력
-
사번 이름 시작일 종료일
-
SELECT E.EMPLOYEE_ID AS "사번", FIRST_NAME || ' ' || LAST_NAME AS "이름", START_DATE "시작일", END_DATE "종료일"
FROM EMPLOYEES E JOIN JOB_HISTORY JOH
ON E.EMPLOYEE_ID = JOH.EMPLOYEE_ID
JOIN JOBS JO
ON JOH.JOB_ID = JO.JOB_ID
WHERE JO.JOB_TITLE = 'Public Accountant';
실습 8
- 2007년 입사(HIRE_DATE)한 직원들의 사번(EMPLOYEE_ID), 이름(FIRST_NAME), 성(LAST_NAME), 부서명(DEPARTMENT_NAME)을 조회함
- 이때, 부서에 배치되지 않은 직원의경우, ‘
'로 출력하시오.
- 이때, 부서에 배치되지 않은 직원의경우, ‘
SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, NVL(DEPARTMENT_NAME, '<Not Assigned>') AS DEPT_NAME
FROM EMPLOYEES E LEFT OUTER JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
WHERE TO_CHAR(HIRE_DATE, 'YYYY') = '2007';
실습 9
- 부서별로 가장 적은 급여를 받고 있는 직원의 이름, 부서이름, 급여를 출력하시오.
- 이름은 LAST_NAME만 출력하며, 부서이름으로 오름차순 정렬하고,
- 부서가 같은 경우 이름을 기준으로 오름차순 정렬하여 출력합니다.
SELECT E.LAST_NAME, ED.DEPARTMENT_NAME, ED.SALARY
FROM EMPLOYEES E JOIN (SELECT E.DEPARTMENT_ID, DEPARTMENT_NAME, MIN(SALARY) AS SALARY
FROM EMPLOYEES E JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
GROUP BY E.DEPARTMENT_ID, DEPARTMENT_NAME) ED
ON E.DEPARTMENT_ID = ED.DEPARTMENT_ID
WHERE E.SALARY = ED.SALARY
ORDER BY ED.DEPARTMENT_NAME, E.LAST_NAM;
SELECT E.LAST_NAME, ED.DEPARTMENT_NAME, ED.SALARY
FROM EMPLOYEES E JOIN (SELECT E.DEPARTMENT_ID, DEPARTMENT_NAME, MIN(SALARY) AS SALARY
FROM EMPLOYEES E JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
GROUP BY E.DEPARTMENT_ID, DEPARTMENT_NAME) ED
ON E.DEPARTMENT_ID = ED.DEPARTMENT_ID AND E.SALARY = ED.SALARY
ORDER BY ED.DEPARTMENT_NAME, E.LAST_NAME;
실습 10
- 사원의 부서가 속한 도시(CITY)가 ‘Seattle’인 사원의 이름, 해당 사원의 매니저 이름, 사원의 부서이름을 출력하시오.
- 이때 사원의 매니저가 없을 경우 <없음>이라고 출력하시오. 이름은 LAST_NAME만 출력하며없음>
- 사원의 이름을 오름차순으로 정렬하시오.
SELECT E.LAST_NAME, NVL(M.LAST_NAME, '없음'), D.DEPARTMENT_NAME
FROM EMPLOYEES E JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
JOIN LOCATIONS L
ON D.LOCATION_ID = L.LOCATION_ID AND L.CITY = 'Seattle'
LEFT OUTER JOIN EMPLOYEES M
ON E.MANAGER_ID = M.EMPLOYEE_ID
ORDER BY E.LAST_NAME;
SELECT E.E_NAME, NVL(E.M_NAME, '<없음>') AS LNAME, D.DEPARTMENT_NAME
FROM (SELECT A.LAST_NAME AS E_NAME, B.LAST_NAME AS M_NAME, A.DEPARTMENT_ID
FROM EMPLOYEES A LEFT OUTER JOIN EMPLOYEES B
ON A.MANAGER_ID = B.EMPLOYEE_ID
) E JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
JOIN LOCATIONS L ON D.LOCATION_ID = L.LOCATION_ID
WHERE L.CITY = 'Seattle'
ORDER BY E.E_NAME;
실습 11
- 각 업무(JOB) 별로 연봉(SALARY)의 총합을 구하고자 한다. 연봉 총합이 가장 높은 업무부터 업무명(JOB_TITLE)과 연봉 총합을 내림차순으로 조회하시오. 단 연봉총합이 30,000 보다 큰 업무만 출력하시오.
SELECT JOB_TITLE, SUM(SALARY) TOTAL_SAL
FROM EMPLOYEES E JOIN JOBS J
ON E.JOB_ID = J.JOB_ID
GROUP BY JOB_TITLE
HAVING SUM(SALARY) > 30000
ORDER BY TOTAL_SAL DESC;
- ‘Sales’ 부서에 속한 직원의 이름(FIRST_NAME), 급여(SALARY), 부서이름(DEPARTMENT_NAME)을 조회하시오.
- 단, 급여는 100번 부서의 평균보다 적게 받는 직원 정보만 출력되어야 한다.
SELECT FIRST_NAME, SALARY, DEPARTMENT_NAME
FROM EMPLOYEES E JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID AND D.DEPARTMENT_NAME='Sales'
WHERE SALARY < (SELECT AVG(SALARY)
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100);
SELECT E.RIST_NAME, E.SALARY, D.DEPARTMENT_NAME
FROM EMPLOYEES E JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
CROSS JOIN (SELECT AVG(SALARY) AS SAL
FROM EMPLOYEES
WHERE DEPARTMENT_ID = 100) SAL100
WHERE D.DEPARTMENT_NAME = 'Sales'
AND E.SALARY < SAL100.SAL
실습 12
- 부서별 직원들의 최대, 최소, 평균급여(소수점 이하 절사)를 조회하되, 평균 급여가 ‘IT’ 부서의 평균급여보다 많고, ‘Sales’ 부서의 평균보다 적은 부서 정보만 출력하시오.
SELECT DEPARTMENT_NAME, MAX(SALARY), MIN(SALARY), TRUNC(AVG(SALARY)) AVG
FROM EMPLOYEES E JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
GROUP BY DEPARTMENT_NAME
HAVING TRUNC(AVG(SALARY)) > (SELECT AVG(SALARY)
FROM EMPLOYEES E JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
WHERE DEPARTMENT_NAME='IT')
AND
TRUNC(AVG(SALARY)) < (SELECT AVG(SALARY)
FROM EMPLOYEES E JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
WHERE DEPARTMENT_NAME='Sales');
SELECT DEPARTMENT_NAME, MAX(SALARY), MIN(SALARY), TRUNC(AVG(SALARY)) AVG
FROM EMPLOYEES E JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
GROUP BY DEPARTMENT_NAME
HAVING TRUNC(AVG(SALARY)) > (SELECT TRUNC(AVG(SALARY))
FROM EMPLOYEES E JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
WHERE DEPARTMENT_NAME='IT')
AND
TRUNC(AVG(SALARY)) < (SELECT TRUNC(AVG(SALARY))
FROM EMPLOYEES E JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
WHERE DEPARTMENT_NAME='Sales');
Subscribe via RSS