본문 바로가기

Programming/SQL

6. 실습(4) - SubQuery

Edit

6. 실습(4) - SubQuery

1. 다음과 같이 부서별 직원 수를 Subquery로 구하시오.

SELECT D.DEPT_NAME
, (SELECT COUNT(*)
FROM DEPT_EMP DE
WHERE DE.TO_DATE = '9999-01-01' AND DE.DEPT_NO=D.DEPT_NO)
FROM DEPARTMENTS D;

SELECT D.DEPT_NAME, COUNT(*)
FROM DEPARTMENTS D
INNER JOIN DEPT_EMP DE ON DE.DEPT_NO=D.DEPT_NO
WHERE DE.TO_DATE = '9999-01-01'
GROUP BY D.DEPT_NAME;

NOTE : SELECT절에 Subquery를 사용하는 예이다.
Subquery를 사용한 SQL문은 부서를 가져오면서 각 부서(DEPT_EMP)에 배정된 직원의 인원수를 계산(COUNT)한다.
앞서 연습한 Join을 사용한 SQL문은 부서와 할당된 부서(DEPT_EMP)를 조인해서 부서명으로 그룹화하고 그 부서의 직원수를 계산(COUNT)한다.
둘다 적절한 SQL문은 아니고 설명을 위해 작성한 SQL문이다.


2. 각 부서에서 가장 오래 근무한 직원을 출력하시오

SELECT DEPT_NAME
, (
SELECT FIRST_NAME
FROM DEPT_EMP DE
INNER JOIN EMPLOYEES E ON E.EMP_NO = DE.EMP_NO
WHERE DE.TO_DATE = '9999-01-01' AND DE.DEPT_NO=D.DEPT_NO
ORDER BY FROM_DATE
LIMIT 1
)EMPLOYEE
FROM DEPARTMENTS D;

NOTE : Subquery에서 조인을 사용했다.
먼저, 부서 리스트(DEPARTMENTS )를 조회한다.
부서를 가져오면서 각 부서(DEPT_EMP)에 배정받은 날짜(FROM_DATE)가 가장 빠른 직원의 이름(EMPLOYEES)을 조회한다.


연습: 가장 오래된 직원 10명이 근무했던 처음과 마지막 부서를 출력하시오.

SELECT EM.*
, (
SELECT DEPT_NAME
FROM DEPT_EMP DEE, DEPARTMENTS DE
WHERE DEE.DEPT_NO = DE.DEPT_NO
ORDER BY FROM_DATE
LIMIT 1
) FIRST_DEPT
, (
SELECT DEPT_NAME
FROM DEPT_EMP DEE, DEPARTMENTS DE
WHERE DEE.DEPT_NO=DE.DEPT_NO
ORDER BY FROM_DATE DESC
LIMIT 1
) LAST_DEPT
FROM EMPLOYEES EM
ORDER BY HIRE_DATE
LIMIT 10;


3. 각 부서에서 급여를 가장 많이 받는 직원 리스트를 구하시오.

SELECT DEPT_NAME
, (
SELECT FIRST_NAME
FROM DEPT_EMP DE
INNER JOIN EMPLOYEES E ON E.EMP_NO = DE.EMP_NO
INNER JOIN SALARIES S ON S.EMP_NO = DE.EMP_NO
WHERE DE.TO_DATE = '9999-01-01' AND DE.DEPT_NO=D.DEPT_NO
ORDER BY SALARY DESC
LIMIT 1
) EMPLOYEE
FROM DEPARTMENTS D;

NOTE : 급여를 알기 위해 급여 테이블을 Subquery의 조인에 추가하였다.
먼저, 부서 리스트(DEPARTMENTS )를 조회한다.
부서를 가져오면서 해당 부서에 속한 직원들(DEPT_EMP)의 급여(SALARIES)를 확인한 뒤, 급여가 큰 순으로 정렬해서 가장 많이 받는 직원 1명(LIMIT)의 이름(EMPLOYEES)을 가져와 출력하게 된다.


4. 부서별로 직원 수를 구하시오.

-- 1번에서는 부서별 직원수를 조인과 SELECT절에 subquery를 사용하였다.
-- 이 경우 데이터의 양이 많을 경우 속도가 느려질 수 있는데 속도를 고려하여 적절한 SQL을 작성 해보자.

SELECT DEPT_NAME, CNT
FROM DEPARTMENTS D
INNER JOIN (
SELECT DEPT_NO, COUNT(*) CNT
FROM DEPT_EMP
WHERE TO_DATE='9999-01-01'
GROUP BY DEPT_NO
) DS ON D.DEPT_NO=DS.DEPT_NO
ORDER BY D.DEPT_NO

NOTE : 1번 문제에서 두 가지 방법을 사용하였다.

  • 10개의 부서를 추출하고, 각 부서의 인원수를 계산하는 것
  • 부서와 인원 테이블을 조인해서 데이터를 구성하고 부서명으로 그룹화 한 뒤 인원을 계산하는 것

조인을 사용하는 것이 추천되는 방식인데 문제는 문자열로 그룹화 하는 것이다.
가급적 정형화된 코드로 그룹화 하는 것이 좋다.
더욱이 조인을 먼저 하기 때문에 많은 데이터 조인(부서수 10 & 인원수 240,124)이 발생한다.


NOTE : 개인적으로 가장 선호하는 방식은 위에 작성한 코드처럼 부서코드로 그룹화해서 인원을 계산하고, 부서명을 찾기 위해 조인하는 것이다.
부서수가 10개이므로 10개의 데이터(10 & 10)로 조인을 하기 때문에 더 빠르게 처리된다.
SQL 속도 처리(튜닝)는 처리하는 데이터 개수만 잘 세어도 거의 문제가 발생하지 않는다.
따라서 항상 몇 건의 데이터를 조인하고 그룹화 하는지 파악해야 한다.


5. 전체 평균보다 많이 받는 직원 수를 계산하시오.

SELECT COUNT(*) -- 107706
FROM SALARIES S
WHERE S.TO_DATE = '9999-01-01'
AND SALARY >= (SELECT AVG(SALARY)
FROM SALARIES
WHERE TO_DATE = '9999-01-01');

NOTE : 전체 평균을 Subquery로 구하여 조건절(WHERE)에서 사용하였다.
먼저, 현재 근무 중인 직원들의 급여 평균(AVG(SALARY))를 계산하고 그 금액보다 큰(>=) 직원들 인원을 계산(COUNT)한다.


6. 다음과 같이 퇴직한 직원수를 구하시오

SELECT COUNT(*)
FROM EMPLOYEES E
WHERE NOT EXISTS(SELECT 1
FROM DEPT_EMP DE
WHERE DE.TO_DATE = '9999-01-01'
AND E.EMP_NO=DE.EMP_NO);


SELECT COUNT(*)
FROM EMPLOYEES E
WHERE EMP_NO NOT IN (SELECT DISTINCT EMP_NO
FROM DEPT_EMP DE
WHERE DE.TO_DATE = '9999-01-01');

NOTE : 이 데이터에서는 퇴직 필드가 없기 때문에 퇴직의 개념부터 먼저 정의해야 한다.
이 데이터에서 근무중인 직원은 실습(2) - GROUP 에서 정의한 데로 급여나 현재 근무 부서, 업무의 종료일자가 ‘9999-01-01’인 것이다.
따라서 퇴사는 종료일자가 ‘9999-01-01’아닌 것이 될 것이다.
즉, 직원중에서 급여, 근무 부서, 업무 테이블에 종료일자가 ‘9999-01-01’인 데이터가 없는(NOT EXISTS, NOT IN ) 직원이 퇴사자가 된다.


NOTE : EXISTS와 IN 둘다 많이 사용되는 명령어로 DBMS에 따라 다르지만 대부분 Subquery의 양이 많으면 EXISTS를 사용하라고 권하고 있다.
개인적으로 속도가 빨라서 EXISTS를 자주 사용한다.


연습 : 다음 SQL문을 실행하여 정확성을 검증해 보자.

-- 전체 직원수(300,024) = 근무중인 직원수(240,124) + 퇴사한 직원수(59,900)

SELECT COUNT(*)
FROM EMPLOYEES E;


SELECT COUNT(DISTINCT EMP_NO)
FROM DEPT_EMP DE
WHERE DE.TO_DATE = '9999-01-01';


7. 연도별 퇴직 직원수를 구하여라

SELECT YEAR(TO_DATE), COUNT(*)
FROM (
SELECT DE.EMP_NO, MAX(TO_DATE) TO_DATE
FROM DEPT_EMP DE
WHERE NOT EXISTS(SELECT 1
FROM DEPT_EMP DE1
WHERE DE1.TO_DATE = '9999-01-01'
AND DE1.EMP_NO=DE.EMP_NO)
GROUP BY DE.EMP_NO
) DS
GROUP BY YEAR(TO_DATE)

NOTE : 앞 5번 SQL문을 Subquery로 하여 그룹화 하였다.
퇴사 날짜를 구하기 위해 직원 테이블이 아닌 할당된 부서테이블(DEPT_EMP)을 사용하였다.
퇴사 날짜는 부서에서 근무한 마지막 날짜인 종료날짜(TO_DATE) 중에서 가장 큰값(Max)이 퇴사 날짜가 될 것이다.
각 개인별(GROUP BY DE.EMP_NO) 퇴사 날짜를 구해서 퇴사날짜를 년도별로 그룹화 하면 연도별 퇴사 직원수를 구할 수 있다.
이 경우는 다음과 같은 SQL 문이 더 효율적일 수 있다.


생각해보기 : 각 부서에서 급여를 가장 많이 받는 직원이름과 급여를 출력하시오.


출처 : SW 개발이 좋은 사람

%23%23%23%206.%20%uC2E4%uC2B5%284%29%20-%20SubQuery%0A-%20%5B**%uC0D8%uD50C%20%uB370%uC774%uD130%20%uBCA0%uC774%uC2A4%20%uAC1C%uC694**%5D%28http%3A//youssol.tistory.com/26%29%0A-%20**Subquery**%uB294%20SQL%20%uC548%uC5D0%20SQL%uBB38%uC744%20%uC0AC%uC6A9%uD558%uB294%20%uAC83%uC73C%uB85C%20SELECT%2C%20FROM%2C%20WHERE%20%uB4F1%20%uB2E4%uC591%uD55C%20%uACF3%uC5D0%uC11C%20%uC0AC%uC6A9%uB41C%uB2E4.%0A%3Cbr%3E%0A%0A**1.%20%uB2E4%uC74C%uACFC%20%uAC19%uC774%20%uBD80%uC11C%uBCC4%20%uC9C1%uC6D0%20%uC218%uB97C%20Subquery%uB85C%20%uAD6C%uD558%uC2DC%uC624.**%0A%21%5BAlt%20text%5D%28./1.png%29%0A%0A%60%60%60sql%0ASELECT%20D.DEPT_NAME%0A%20%20%20%20%20%2C%20%28SELECT%20COUNT%28*%29%20%0A%20%20%20%20%20%20%20%20%20%20FROM%20DEPT_EMP%20DE%20%0A%20%20%20%20%20%20%20%20%20WHERE%20DE.TO_DATE%20%3D%20%279999-01-01%27%20AND%20DE.DEPT_NO%3DD.DEPT_NO%29%0A%20%20FROM%20DEPARTMENTS%20D%3B%0A%60%60%60%0A%60%60%60sql%0ASELECT%20D.DEPT_NAME%2C%20COUNT%28*%29%0A%20%20FROM%20DEPARTMENTS%20D%0A%20INNER%20JOIN%20DEPT_EMP%20DE%20ON%20DE.DEPT_NO%3DD.DEPT_NO%0A%20WHERE%20DE.TO_DATE%20%3D%20%279999-01-01%27%0A%20GROUP%20BY%20D.DEPT_NAME%3B%0A%60%60%60%0A%3E%20**NOTE%20%3A%20**SELECT%uC808%uC5D0%20Subquery%uB97C%20%uC0AC%uC6A9%uD558%uB294%20%uC608%uC774%uB2E4.%0A%3E%20Subquery%uB97C%20%uC0AC%uC6A9%uD55C%20SQL%uBB38%uC740%20%uBD80%uC11C%uB97C%20%uAC00%uC838%uC624%uBA74%uC11C%20%uAC01%20%uBD80%uC11C%28DEPT_EMP%29%uC5D0%20%uBC30%uC815%uB41C%20%uC9C1%uC6D0%uC758%20%uC778%uC6D0%uC218%uB97C%20%uACC4%uC0B0%28COUNT%29%uD55C%uB2E4.%0A%3E%20%uC55E%uC11C%20%uC5F0%uC2B5%uD55C%20Join%uC744%20%uC0AC%uC6A9%uD55C%20SQL%uBB38%uC740%20%uBD80%uC11C%uC640%20%uD560%uB2F9%uB41C%20%uBD80%uC11C%28DEPT_EMP%29%uB97C%20%uC870%uC778%uD574%uC11C%20%uBD80%uC11C%uBA85%uC73C%uB85C%20%uADF8%uB8F9%uD654%uD558%uACE0%20%uADF8%20%uBD80%uC11C%uC758%20%uC9C1%uC6D0%uC218%uB97C%20%uACC4%uC0B0%28COUNT%29%uD55C%uB2E4.%0A%3E%20%uB458%uB2E4%20%uC801%uC808%uD55C%20SQL%uBB38%uC740%20%uC544%uB2C8%uACE0%20%uC124%uBA85%uC744%20%uC704%uD574%20%uC791%uC131%uD55C%20SQL%uBB38%uC774%uB2E4.%0A%0A%3Cbr%3E%0A%0A**2.%20%uAC01%20%uBD80%uC11C%uC5D0%uC11C%20%uAC00%uC7A5%20%uC624%uB798%20%uADFC%uBB34%uD55C%20%uC9C1%uC6D0%uC744%20%uCD9C%uB825%uD558%uC2DC%uC624**%0A%21%5BAlt%20text%5D%28./2.png%29%0A%0A%60%60%60sql%0ASELECT%20DEPT_NAME%0A%20%20%20%20%2C%20%28%0A%09%20%20%20%20SELECT%20FIRST_NAME%0A%20%20%20%20%20%20%20%20%20%20FROM%20DEPT_EMP%20DE%0A%20%20%20%20%20%20%20%20%20INNER%20JOIN%20EMPLOYEES%20E%20ON%20E.EMP_NO%20%3D%20DE.EMP_NO%0A%20%20%20%20%20%20%20%20%20WHERE%20DE.TO_DATE%20%3D%20%279999-01-01%27%20AND%20DE.DEPT_NO%3DD.DEPT_NO%0A%20%20%20%20%20%20%20%20%20ORDER%20BY%20FROM_DATE%0A%20%20%20%20%20%20%20%20%20LIMIT%201%0A%20%20%20%20%20%20%20%29EMPLOYEE%0A%20%20FROM%20DEPARTMENTS%20D%3B%0A%60%60%60%0A%3E%20**NOTE%20%3A%20**Subquery%uC5D0%uC11C%20%uC870%uC778%uC744%20%uC0AC%uC6A9%uD588%uB2E4.%0A%3E%20%uBA3C%uC800%2C%20%uBD80%uC11C%20%uB9AC%uC2A4%uD2B8%28DEPARTMENTS%20%29%uB97C%20%uC870%uD68C%uD55C%uB2E4.%0A%3E%20%uBD80%uC11C%uB97C%20%uAC00%uC838%uC624%uBA74%uC11C%20%uAC01%20%uBD80%uC11C%28DEPT_EMP%29%uC5D0%20%uBC30%uC815%uBC1B%uC740%20%uB0A0%uC9DC%28FROM_DATE%29%uAC00%20%uAC00%uC7A5%20%uBE60%uB978%20%uC9C1%uC6D0%uC758%20%uC774%uB984%28EMPLOYEES%29%uC744%20%uC870%uD68C%uD55C%uB2E4.%0A%0A%3Cbr%3E%0A%0A**%uC5F0%uC2B5%3A%20%uAC00%uC7A5%20%uC624%uB798%uB41C%20%uC9C1%uC6D0%2010%uBA85%uC774%20%uADFC%uBB34%uD588%uB358%20%uCC98%uC74C%uACFC%20%uB9C8%uC9C0%uB9C9%20%uBD80%uC11C%uB97C%20%uCD9C%uB825%uD558%uC2DC%uC624.**%0A%60%60%60sql%0ASELECT%20EM.*%0A%20%20%20%20%20%2C%20%28%0A%09%20%20%20%20%20SELECT%20DEPT_NAME%20%0A%20%20%20%20%20%20%20%20%20%20%20FROM%20DEPT_EMP%20DEE%2C%20DEPARTMENTS%20DE%0A%20%20%20%20%20%20%20%20%20%20WHERE%20DEE.DEPT_NO%20%3D%20DE.DEPT_NO%20%0A%20%20%20%20%20%20%20%20%20%20ORDER%20BY%20FROM_DATE%20%0A%20%20%20%20%20%20%20%20%20%20LIMIT%201%20%0A%20%20%20%20%20%20%20%20%29%20FIRST_DEPT%0A%20%20%20%20%20%2C%20%28%0A%09%09%20SELECT%20DEPT_NAME%20%0A%20%20%20%20%20%20%20%20%20%20%20FROM%20DEPT_EMP%20DEE%2C%20DEPARTMENTS%20DE%0A%20%20%20%20%20%20%20%20%20%20WHERE%20DEE.DEPT_NO%3DDE.DEPT_NO%20%0A%20%20%20%20%20%20%20%20%20%20ORDER%20BY%20FROM_DATE%20DESC%20%0A%20%20%20%20%20%20%20%20%20%20LIMIT%201%0A%20%20%20%20%20%20%20%20%29%20LAST_DEPT%0A%20%20FROM%20EMPLOYEES%20EM%0A%20ORDER%20BY%20HIRE_DATE%0A%20LIMIT%2010%3B%0A%60%60%60%0A%3Cbr%3E%0A%0A**3.%20%uAC01%20%uBD80%uC11C%uC5D0%uC11C%20%uAE09%uC5EC%uB97C%20%uAC00%uC7A5%20%uB9CE%uC774%20%uBC1B%uB294%20%uC9C1%uC6D0%20%uB9AC%uC2A4%uD2B8%uB97C%20%uAD6C%uD558%uC2DC%uC624.**%0A%21%5BAlt%20text%5D%28./3.png%29%0A%0A%60%60%60sql%0ASELECT%20DEPT_NAME%0A%20%20%20%20%20%2C%20%28%0A%09%20%20%20%20%20SELECT%20FIRST_NAME%0A%20%20%20%20%20%20%20%20%20%20%20FROM%20DEPT_EMP%20DE%0A%20%20%20%20%20%20%20%20%20%20INNER%20JOIN%20EMPLOYEES%20E%20ON%20E.EMP_NO%20%3D%20DE.EMP_NO%0A%20%20%20%20%20%20%20%20%20%20INNER%20JOIN%20SALARIES%20S%20ON%20S.EMP_NO%20%3D%20DE.EMP_NO%0A%20%20%20%20%20%20%20%20%20%20WHERE%20DE.TO_DATE%20%3D%20%279999-01-01%27%20AND%20DE.DEPT_NO%3DD.DEPT_NO%0A%20%20%20%20%20%20%20%20%20%20ORDER%20BY%20SALARY%20DESC%0A%20%20%20%20%20%20%20%20%20%20LIMIT%201%0A%20%20%20%20%20%20%20%29%20EMPLOYEE%0A%20%20FROM%20DEPARTMENTS%20D%3B%0A%60%60%60%0A%3E%20**NOTE%20%3A%20**%uAE09%uC5EC%uB97C%20%uC54C%uAE30%20%uC704%uD574%20%uAE09%uC5EC%20%uD14C%uC774%uBE14%uC744%20Subquery%uC758%20%uC870%uC778%uC5D0%20%uCD94%uAC00%uD558%uC600%uB2E4.%0A%3E%20%uBA3C%uC800%2C%20%uBD80%uC11C%20%uB9AC%uC2A4%uD2B8%28DEPARTMENTS%20%29%uB97C%20%uC870%uD68C%uD55C%uB2E4.%0A%3E%20%uBD80%uC11C%uB97C%20%uAC00%uC838%uC624%uBA74%uC11C%20%uD574%uB2F9%20%uBD80%uC11C%uC5D0%20%uC18D%uD55C%20%uC9C1%uC6D0%uB4E4%28DEPT_EMP%29%uC758%20%uAE09%uC5EC%28SALARIES%29%uB97C%20%uD655%uC778%uD55C%20%uB4A4%2C%20%uAE09%uC5EC%uAC00%20%uD070%20%uC21C%uC73C%uB85C%20%uC815%uB82C%uD574%uC11C%20%uAC00%uC7A5%20%uB9CE%uC774%20%uBC1B%uB294%20%uC9C1%uC6D0%201%uBA85%28LIMIT%29%uC758%20%uC774%uB984%28EMPLOYEES%29%uC744%20%uAC00%uC838%uC640%20%uCD9C%uB825%uD558%uAC8C%20%uB41C%uB2E4.%0A%0A%3Cbr%3E%0A%0A**4.%20%uBD80%uC11C%uBCC4%uB85C%20%uC9C1%uC6D0%20%uC218%uB97C%20%uAD6C%uD558%uC2DC%uC624.%20**%0A%21%5BAlt%20text%5D%28./4.png%29%0A%0A%60%60%60sql%0A--%201%uBC88%uC5D0%uC11C%uB294%20%uBD80%uC11C%uBCC4%20%uC9C1%uC6D0%uC218%uB97C%20%uC870%uC778%uACFC%20SELECT%uC808%uC5D0%20subquery%uB97C%20%uC0AC%uC6A9%uD558%uC600%uB2E4.%0A--%20%uC774%20%uACBD%uC6B0%20%uB370%uC774%uD130%uC758%20%uC591%uC774%20%uB9CE%uC744%20%uACBD%uC6B0%20%uC18D%uB3C4%uAC00%20%uB290%uB824%uC9C8%20%uC218%20%uC788%uB294%uB370%20%uC18D%uB3C4%uB97C%20%uACE0%uB824%uD558%uC5EC%20%uC801%uC808%uD55C%20SQL%uC744%20%uC791%uC131%20%uD574%uBCF4%uC790.%0A%0ASELECT%20DEPT_NAME%2C%20CNT%0A%20%20FROM%20DEPARTMENTS%20D%0A%20INNER%20JOIN%20%28%0A%09%09%09%20SELECT%20DEPT_NO%2C%20COUNT%28*%29%20CNT%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20FROM%20DEPT_EMP%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20WHERE%20TO_DATE%3D%279999-01-01%27%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20GROUP%20BY%20DEPT_NO%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%20DS%20ON%20D.DEPT_NO%3DDS.DEPT_NO%0A%20ORDER%20BY%20D.DEPT_NO%0A%60%60%60%0A%3E%20**NOTE%20%3A%20**1%uBC88%20%uBB38%uC81C%uC5D0%uC11C%20%uB450%20%uAC00%uC9C0%20%uBC29%uBC95%uC744%20%uC0AC%uC6A9%uD558%uC600%uB2E4.%0A-%20%20%20%2010%uAC1C%uC758%20%uBD80%uC11C%uB97C%20%uCD94%uCD9C%uD558%uACE0%2C%20%uAC01%20%uBD80%uC11C%uC758%20%uC778%uC6D0%uC218%uB97C%20%uACC4%uC0B0%uD558%uB294%20%uAC83%0A-%20%20%20%20%uBD80%uC11C%uC640%20%uC778%uC6D0%20%uD14C%uC774%uBE14%uC744%20%uC870%uC778%uD574%uC11C%20%uB370%uC774%uD130%uB97C%20%uAD6C%uC131%uD558%uACE0%20%uBD80%uC11C%uBA85%uC73C%uB85C%20%uADF8%uB8F9%uD654%20%uD55C%20%uB4A4%20%uC778%uC6D0%uC744%20%uACC4%uC0B0%uD558%uB294%20%uAC83%0A%0A%3E%uC870%uC778%uC744%20%uC0AC%uC6A9%uD558%uB294%20%uAC83%uC774%20%uCD94%uCC9C%uB418%uB294%20%uBC29%uC2DD%uC778%uB370%20%20%uBB38%uC81C%uB294%20%uBB38%uC790%uC5F4%uB85C%20%uADF8%uB8F9%uD654%20%uD558%uB294%20%uAC83%uC774%uB2E4.%20%0A%3E%20%uAC00%uAE09%uC801%20%uC815%uD615%uD654%uB41C%20%uCF54%uB4DC%uB85C%20%uADF8%uB8F9%uD654%20%uD558%uB294%20%uAC83%uC774%20%uC88B%uB2E4.%0A%3E%20%uB354%uC6B1%uC774%20%uC870%uC778%uC744%20%uBA3C%uC800%20%uD558%uAE30%20%uB54C%uBB38%uC5D0%20%uB9CE%uC740%20%uB370%uC774%uD130%20%uC870%uC778%28%uBD80%uC11C%uC218%2010%20%26%20%uC778%uC6D0%uC218%20240%2C124%29%uC774%20%uBC1C%uC0DD%uD55C%uB2E4.%0A%0A%3Cbr%3E%0A%0A%3E**NOTE%20%3A%20**%uAC1C%uC778%uC801%uC73C%uB85C%20%uAC00%uC7A5%20%uC120%uD638%uD558%uB294%20%uBC29%uC2DD%uC740%20%uC704%uC5D0%20%uC791%uC131%uD55C%20%uCF54%uB4DC%uCC98%uB7FC%20%uBD80%uC11C%uCF54%uB4DC%uB85C%20%uADF8%uB8F9%uD654%uD574%uC11C%20%uC778%uC6D0%uC744%20%uACC4%uC0B0%uD558%uACE0%2C%20%uBD80%uC11C%uBA85%uC744%20%uCC3E%uAE30%20%uC704%uD574%20%uC870%uC778%uD558%uB294%20%uAC83%uC774%uB2E4.%0A%3E%20%uBD80%uC11C%uC218%uAC00%2010%uAC1C%uC774%uBBC0%uB85C%2010%uAC1C%uC758%20%uB370%uC774%uD130%2810%20%26%2010%29%uB85C%20%uC870%uC778%uC744%20%uD558%uAE30%20%uB54C%uBB38%uC5D0%20%uB354%20%uBE60%uB974%uAC8C%20%uCC98%uB9AC%uB41C%uB2E4.%0A%3E%20SQL%20%uC18D%uB3C4%20%uCC98%uB9AC%28%uD29C%uB2DD%29%uB294%20%uCC98%uB9AC%uD558%uB294%20%uB370%uC774%uD130%20%uAC1C%uC218%uB9CC%20%uC798%20%uC138%uC5B4%uB3C4%20%uAC70%uC758%20%uBB38%uC81C%uAC00%20%uBC1C%uC0DD%uD558%uC9C0%20%uC54A%uB294%uB2E4.%0A%3E%20%uB530%uB77C%uC11C%20%uD56D%uC0C1%20%uBA87%20%uAC74%uC758%20%uB370%uC774%uD130%uB97C%20%uC870%uC778%uD558%uACE0%20%uADF8%uB8F9%uD654%20%uD558%uB294%uC9C0%20%uD30C%uC545%uD574%uC57C%20%uD55C%uB2E4.%0A%0A%3Cbr%3E%0A%0A**5.%20%uC804%uCCB4%20%uD3C9%uADE0%uBCF4%uB2E4%20%uB9CE%uC774%20%uBC1B%uB294%20%uC9C1%uC6D0%20%uC218%uB97C%20%uACC4%uC0B0%uD558%uC2DC%uC624.**%0A%60%60%60sql%0ASELECT%20COUNT%28*%29%20--%20107706%0A%20%20FROM%20SALARIES%20S%20%0A%20WHERE%20S.TO_DATE%20%3D%20%279999-01-01%27%0A%20%20%20AND%20SALARY%20%3E%3D%20%28SELECT%20AVG%28SALARY%29%20%0A%09%09%09%09%20%20%20%20FROM%20SALARIES%20%0A%09%09%09%09%20%20%20WHERE%20TO_DATE%20%3D%20%279999-01-01%27%29%3B%0A%60%60%60%0A%3E%20**NOTE%20%3A%20**%uC804%uCCB4%20%uD3C9%uADE0%uC744%20Subquery%uB85C%20%uAD6C%uD558%uC5EC%20%uC870%uAC74%uC808%28WHERE%29%uC5D0%uC11C%20%uC0AC%uC6A9%uD558%uC600%uB2E4.%0A%3E%20%uBA3C%uC800%2C%20%uD604%uC7AC%20%uADFC%uBB34%20%uC911%uC778%20%uC9C1%uC6D0%uB4E4%uC758%20%uAE09%uC5EC%20%uD3C9%uADE0%28AVG%28SALARY%29%29%uB97C%20%uACC4%uC0B0%uD558%uACE0%20%uADF8%20%uAE08%uC561%uBCF4%uB2E4%20%uD070%28%3E%3D%29%20%uC9C1%uC6D0%uB4E4%20%uC778%uC6D0%uC744%20%uACC4%uC0B0%28COUNT%29%uD55C%uB2E4.%0A%0A%3Cbr%3E%0A%0A**6.%20%uB2E4%uC74C%uACFC%20%uAC19%uC774%20%uD1F4%uC9C1%uD55C%20%uC9C1%uC6D0%uC218%uB97C%20%uAD6C%uD558%uC2DC%uC624**%0A%21%5BAlt%20text%5D%28./6.png%29%0A%0A%60%60%60sql%0ASELECT%20COUNT%28*%29%0A%20%20FROM%20EMPLOYEES%20E%0A%20WHERE%20NOT%20EXISTS%28SELECT%201%20%0A%09%09%09%09%09FROM%20DEPT_EMP%20DE%20%0A%09%09%09%09%09WHERE%20DE.TO_DATE%20%3D%20%279999-01-01%27%20%0A%09%09%09%09%09%20%20AND%20E.EMP_NO%3DDE.EMP_NO%29%3B%0A%0ASELECT%20COUNT%28*%29%0A%20%20FROM%20EMPLOYEES%20E%0A%20WHERE%20EMP_NO%20NOT%20IN%20%28SELECT%20DISTINCT%20EMP_NO%20%0A%09%09%09%09%09%09FROM%20DEPT_EMP%20DE%20%0A%09%09%09%09%09%20%20%20WHERE%20DE.TO_DATE%20%3D%20%279999-01-01%27%29%3B%0A%60%60%60%0A%3E%20**NOTE%20%3A%20**%uC774%20%uB370%uC774%uD130%uC5D0%uC11C%uB294%20%uD1F4%uC9C1%20%uD544%uB4DC%uAC00%20%uC5C6%uAE30%20%uB54C%uBB38%uC5D0%20%uD1F4%uC9C1%uC758%20%uAC1C%uB150%uBD80%uD130%20%uBA3C%uC800%20%uC815%uC758%uD574%uC57C%20%uD55C%uB2E4.%0A%3E%20%uC774%20%uB370%uC774%uD130%uC5D0%uC11C%20%uADFC%uBB34%uC911%uC778%20%uC9C1%uC6D0%uC740%20%5B**%uC2E4%uC2B5%282%29%20-%20GROUP**%5D%28http%3A//youssol.tistory.com/28%29%20%uC5D0%uC11C%20%uC815%uC758%uD55C%20%uB370%uB85C%20%uAE09%uC5EC%uB098%20%uD604%uC7AC%20%uADFC%uBB34%20%uBD80%uC11C%2C%20%uC5C5%uBB34%uC758%20%uC885%uB8CC%uC77C%uC790%uAC00%20%279999-01-01%27%uC778%20%uAC83%uC774%uB2E4.%0A%3E%20%uB530%uB77C%uC11C%20%uD1F4%uC0AC%uB294%20%uC885%uB8CC%uC77C%uC790%uAC00%20%279999-01-01%27%uC544%uB2CC%20%uAC83%uC774%20%uB420%20%uAC83%uC774%uB2E4.%0A%3E%20%uC989%2C%20%uC9C1%uC6D0%uC911%uC5D0%uC11C%20%uAE09%uC5EC%2C%20%uADFC%uBB34%20%uBD80%uC11C%2C%20%uC5C5%uBB34%20%uD14C%uC774%uBE14%uC5D0%20%uC885%uB8CC%uC77C%uC790%uAC00%20%279999-01-01%27%uC778%20%uB370%uC774%uD130%uAC00%20%uC5C6%uB294%28NOT%20EXISTS%2C%20NOT%20IN%20%29%20%uC9C1%uC6D0%uC774%20%uD1F4%uC0AC%uC790%uAC00%20%uB41C%uB2E4.%0A%0A%3Cbr%3E%0A%3E%20**NOTE%20%3A%20**EXISTS%uC640%20IN%20%uB458%uB2E4%20%uB9CE%uC774%20%uC0AC%uC6A9%uB418%uB294%20%uBA85%uB839%uC5B4%uB85C%20DBMS%uC5D0%20%uB530%uB77C%20%uB2E4%uB974%uC9C0%uB9CC%20%uB300%uBD80%uBD84%20Subquery%uC758%20%uC591%uC774%20%uB9CE%uC73C%uBA74%20EXISTS%uB97C%20%uC0AC%uC6A9%uD558%uB77C%uACE0%20%uAD8C%uD558%uACE0%20%uC788%uB2E4.%0A%3E%20%uAC1C%uC778%uC801%uC73C%uB85C%20%uC18D%uB3C4%uAC00%20%uBE68%uB77C%uC11C%20EXISTS%uB97C%20%uC790%uC8FC%20%uC0AC%uC6A9%uD55C%uB2E4.%0A%0A%3Cbr%3E%0A%0A**%uC5F0%uC2B5%20%3A%20%uB2E4%uC74C%20SQL%uBB38%uC744%20%uC2E4%uD589%uD558%uC5EC%20%uC815%uD655%uC131%uC744%20%uAC80%uC99D%uD574%20%uBCF4%uC790.**%0A%60%60%60sql%0A--%20%uC804%uCCB4%20%uC9C1%uC6D0%uC218%28300%2C024%29%20%3D%20%uADFC%uBB34%uC911%uC778%20%uC9C1%uC6D0%uC218%28240%2C124%29%20+%20%uD1F4%uC0AC%uD55C%20%uC9C1%uC6D0%uC218%2859%2C900%29%0A%0ASELECT%20COUNT%28*%29%0A%20%20FROM%20EMPLOYEES%20E%3B%0A%0ASELECT%20COUNT%28DISTINCT%20EMP_NO%29%0A%20%20FROM%20DEPT_EMP%20DE%0A%20WHERE%20DE.TO_DATE%20%3D%20%279999-01-01%27%3B%0A%60%60%60%0A%0A%3Cbr%3E%0A%0A**7.%20%uC5F0%uB3C4%uBCC4%20%uD1F4%uC9C1%20%uC9C1%uC6D0%uC218%uB97C%20%uAD6C%uD558%uC5EC%uB77C**%0A%21%5BAlt%20text%5D%28./7.png%29%0A%0A%60%60%60sql%0ASELECT%20YEAR%28TO_DATE%29%2C%20COUNT%28*%29%0A%20%20FROM%20%28%0A%20%20%20%20%20%20%20%20%20SELECT%20DE.EMP_NO%2C%20MAX%28TO_DATE%29%20TO_DATE%0A%20%20%20%20%20%20%20%20%20%20%20FROM%20DEPT_EMP%20DE%0A%20%20%20%20%20%20%20%20%20%20WHERE%20NOT%20EXISTS%28SELECT%201%20%0A%09%09%09%09%20%20%20%20%20%20%20%20%20%20%20%20%20FROM%20DEPT_EMP%20DE1%20%0A%09%09%09%09%20%20%20%20%20%20%20%20%20%20%20%20WHERE%20DE1.TO_DATE%20%3D%20%279999-01-01%27%20%0A%09%09%09%09%20%20%20%20%20%20%20%20%20%20%20%20%20%20AND%20DE1.EMP_NO%3DDE.EMP_NO%29%0A%20%20%20%20%20%20%20%20%20%20GROUP%20BY%20DE.EMP_NO%0A%09%09%29%20DS%0A%20GROUP%20BY%20YEAR%28TO_DATE%29%0A%60%60%60%0A%3E%20**NOTE%20%3A%20**%uC55E%205%uBC88%20SQL%uBB38%uC744%20Subquery%uB85C%20%uD558%uC5EC%20%uADF8%uB8F9%uD654%20%uD558%uC600%uB2E4.%0A%3E%20%uD1F4%uC0AC%20%uB0A0%uC9DC%uB97C%20%uAD6C%uD558%uAE30%20%uC704%uD574%20%uC9C1%uC6D0%20%uD14C%uC774%uBE14%uC774%20%uC544%uB2CC%20%uD560%uB2F9%uB41C%20%uBD80%uC11C%uD14C%uC774%uBE14%28DEPT_EMP%29%uC744%20%uC0AC%uC6A9%uD558%uC600%uB2E4.%0A%3E%20%uD1F4%uC0AC%20%uB0A0%uC9DC%uB294%20%uBD80%uC11C%uC5D0%uC11C%20%uADFC%uBB34%uD55C%20%uB9C8%uC9C0%uB9C9%20%uB0A0%uC9DC%uC778%20%uC885%uB8CC%uB0A0%uC9DC%28TO_DATE%29%20%uC911%uC5D0%uC11C%20%uAC00%uC7A5%20%uD070%uAC12%28Max%29%uC774%20%uD1F4%uC0AC%20%uB0A0%uC9DC%uAC00%20%uB420%20%uAC83%uC774%uB2E4.%0A%3E%20%uAC01%20%uAC1C%uC778%uBCC4%28GROUP%20BY%20DE.EMP_NO%29%20%uD1F4%uC0AC%20%uB0A0%uC9DC%uB97C%20%uAD6C%uD574%uC11C%20%uD1F4%uC0AC%uB0A0%uC9DC%uB97C%20%uB144%uB3C4%uBCC4%uB85C%20%uADF8%uB8F9%uD654%20%uD558%uBA74%20%uC5F0%uB3C4%uBCC4%20%uD1F4%uC0AC%20%uC9C1%uC6D0%uC218%uB97C%20%uAD6C%uD560%20%uC218%20%uC788%uB2E4.%0A%3E%20%uC774%20%uACBD%uC6B0%uB294%20%uB2E4%uC74C%uACFC%20%uAC19%uC740%20SQL%20%uBB38%uC774%20%uB354%20%uD6A8%uC728%uC801%uC77C%20%uC218%20%uC788%uB2E4.%0A%0A%3Cbr%3E%0A%3E%20**%uC0DD%uAC01%uD574%uBCF4%uAE30%20%3A%20**%uAC01%20%uBD80%uC11C%uC5D0%uC11C%20%uAE09%uC5EC%uB97C%20%uAC00%uC7A5%20%uB9CE%uC774%20%uBC1B%uB294%20%uC9C1%uC6D0%uC774%uB984%uACFC%20%uAE09%uC5EC%uB97C%20%uCD9C%uB825%uD558%uC2DC%uC624.%0A%0A%3Cbr%3E%0A%0A**%uCD9C%uCC98%20%3A%20**%20%5BSW%20%uAC1C%uBC1C%uC774%20%uC88B%uC740%20%uC0AC%uB78C%5D%28http%3A//forest71.tistory.com/%29


'Programming > SQL' 카테고리의 다른 글

8. 연습(2)  (0) 2017.03.11
7. 연습(1)  (0) 2017.03.11
5. 실습(3) - Join  (0) 2017.02.28
4. 실습(2) - Group  (0) 2017.02.25
3. 실습(1) - BASIC  (0) 2017.02.25