서브 쿼리란?

서브 쿼리 : 쿼리가 중첩(무한대로 가능)

예시

SELECT SAL 

FROM EMP

WHERE ENAME = 'SCOTT';

이 쿼리는 이름이 SCOTT인 값을 조회한다.

SELECT ENAME

FROM EMP

WHERE SAL > 3000;

이 쿼리는 월급이 3000인 사람을 조회한다.

SELECT ENAME

FROM EMP

WHERE SAL > (SELECT SAL FROM EMP WHERE ENAME = 'SCOTT');

두 쿼리를 합쳐서 이름이 SCOTT인 사람의 급여보다 큰 사람을 조회할 수 있다.


서브 쿼리 실행 결과가 여러 건일 경우

단일 행의 경우엔 기본 연산자를 사용할 수 있다.

다중 행의 경우엔 다음과 같은 방법을 사용할 수 있다.

 

QUIZ 01. 사원 번호가 7369인 사원의 직업과 같고 사원 번호가 7876인 사원의 급여보다 많은

사람들의 이름, 급여, 직업 출력

SELECT ENAME, SAL, JOB

FROM EMP

WHERE JOB = (SELECT JOB FROM EMP WHERE EMPNO = 7369)

AND SAL > (SELECT SAL FROM EMP WHERE EMPNO = 7876);

 

QUIZ 02. 최소 급여를 받는 사람의 이름과 급여 출력

SELECT ENAME, JOB, SAL

FROM EMP

WHERE SAL = (SELECT MIN(SAL) FROM EMP);

 

QUIZ 03. 20번 부서의 최소 급여

SELECT DEPTNO, MIN(SAL)

FROM EMP

GROUP BY DEPTNO

HAVING DEPTNO = 20;

 

QUIZ 04. 각 부서 별 최소 급여

SELECT DEPTNO, MIN(SAL)

FROM EMP

GROUP BY DEPTNO;

 

QUIZ 05. 각 부서의 최소 급여 중 20번 부서의 최소 급여보다 많이 받는 부서의 부서 번호, 최소 급여 출력

SELECT DEPTNO, MIN(SAL)

FROM EMP

GROUP BY DEPTNO

HAVING MIN(SAL) > (SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO HAVING DEPTNO = 20);

 

QUIZ 06. 급여가 950 또는 800 또는 1400인 직원의 이름 직업 출력

SELECT T1.ENAME, T1.JOB

FROM (SELECT ENAME, JOB FROM EMP WHERE SAL IN (950, 800, 1400)) T1;

 

QUIZ 07. 각 부서 별로 최소 급여를 받는 사원의 이름 직업 출력

SELECT ENAME, JOB

FROM EMP

WHERE SAL IN (SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO);

팁!!

서브 쿼리는 = 보다는 IN을 사용할 것

평소엔 싱글 값이 나오던 서브 쿼리가 업데이트나 배치 작업으로 멀티 값이 나올 수 있다.

아니면 아래와 같이 서브 쿼리 멀티 컬럼 비교를 사용

멀티 컬럼 비교

SELECT ENAME, JOB

FROM EMP

WHERE (DEPTNO, SAL)

IN (SELECT DEPTNO, MIN(SAL) FROM EMP GROUP BY DEPTNO);  

 

QUIZ 08. 스미스 또는 마틴의 직업과 같은 직업을 갖는 사원의 이름과 직업 출력

SELECT ENAME, JOB

FROM EMP

WHERE JOB IN (SELECT JOB FROM EMP WHERE ENAME = 'SMITH' OR ENAME = 'MARTIN');

 

QUIZ 09. 스미스와 마틴의 이름을 빼고 출력하려면

SELECT ENAME, JOB

FROM EMP

WHERE JOB IN (SELECT JOB FROM EMP WHERE ENAME = 'SMITH' OR ENAME = 'MARTIN')

AND ENAME NOT IN ('SMITH', 'MARTIN');

 

QUIZ 10. 각 부서별 급여 총합 중 최댓값을 갖는 부서의 부서번호, 급여 총합 출력

SELECT DEPTNO, SUM(SAL)

FROM EMP

GROUP BY DEPTNO

HAVING SUM(SAL) = (SELECT MAX(SUM(SAL)) FROM EMP GROUP BY DEPTNO);

!! HAVING절에서도 GROUP 함수 사용이 가능하다. 이 점을 몰라서 문제 푸는데 애를 먹었다.


ANY & ALL

QUIZ 11. 직업이 CLERK인 사람들의 급여보다 적게 받는 사람

SELEC EMPNO, ENAME, JOB, SAL

FROM EMP

WHERE SAL < ANY (SELECT SAL FROM EMP WHERE JOB = 'CLERK');

< ANY : 리스트 중에 있는 값 하나 보다 작은 (최댓값보다 작은), 각각의 값을 비교해 어느 하나라도 만족하면 TRUE

> ALL : 리스트 중에 있는 모든 값보다 큰(최댓값보다 큰), 최대값보다 커야 한다. 모든 값 비교해 모두 만족하면 TRUE

> ANY: 최솟값보다 큰

< ANY: 최솟값보다 작은

댓글남기기