서브쿼리(Subquery)는 하나의 SQL 문 안에서 다른 SQL 문을 중첩하여 사용하는 쿼리입니다. 보통 특정 조건을 만족하는 데이터를 조회하거나, 메인 쿼리에서 사용할 값을 미리 계산하기 위해 사용됩니다.
예 : 'SCOTT' 사원의 급여보다 큰 급여를 받는 사원에 대한 정보
SELECT empno, ename, job, sal
FROM emp
WHERE sal >= (SELECT sal FROM emp WHERE ename = 'SCOTT');
(SELECT sal FROM emp WHERE ename = 'SCOTT')
는 emp
테이블에서 'SCOTT' 사원의 급여를 조회합니다. => 결과 : 3000WHERE sal > (서브쿼리 결과)
조건을 통해 SCOTT의 급여(3000)보다 큰=
(같다), <
(작다), >
(크다) 등 단일 값 비교 연산자와 함께 사용됩니다.수업예제
-- 최고 급여를 받는 사원 정보 출력
select empno, ename, sal
from emp
where sal = (select max(sal) from emp);
+-------+-------+---------+
| empno | ename | sal |
+-------+-------+---------+
| 7839 | KING | 5000.00 |
+-------+-------+---------+
-- 20번 부서에서 최고 급여를 받는 사원보다 많은 급여를 받는 사원 정보 출력
select empno, ename, sal
from emp
where sal >= (select max(sal) from emp where deptno = 20);
+-------+-------+---------+
| empno | ename | sal |
+-------+-------+---------+
| 7788 | SCOTT | 3000.00 |
| 7839 | KING | 5000.00 |
| 7902 | FORD | 3000.00 |
+-------+-------+---------+
IN
, ANY
, ALL
등 다중 값 비교 연산자와 함께 사용됩니다.-- 부서별 최고 급여를 받는 사원에 대한 정보 출력
select empno, ename, deptno, sal
from emp
where (deptno, sal) in (select deptno, max(sal) from emp group by deptno);
-- 위 쿼리는 부서별로 최고 급여를 받는 여러 사원이 있을 경우, 모든 사원의 정보를 출력
+-------+-------+--------+---------+
| empno | ename | deptno | sal |
+-------+-------+--------+---------+
| 7698 | BLAKE | 30 | 2850.00 |
| 7788 | SCOTT | 20 | 3000.00 |
| 7839 | KING | 10 | 5000.00 |
| 7902 | FORD | 20 | 3000.00 |
+-------+-------+--------+---------+
(SELECT MAX(sal) FROM emp GROUP BY deptno)
는 각 부서별 최대 급여를 반환합니다. => (2850, 3000, 5000)sal
이 각 부서의 최대 급여에 해당하는 모든 직원을 조회합니다.<
또는 >
연산자와 ANY의 조합ANY
는 서브쿼리의 하나 이상의 값과 비교하여 조건을 만족하는 경우 TRUE
를 반환합니다. ANY
와 <
, >
연산자를 함께 사용하면 서브쿼리 결과 중 최소/최대 값에 기반하여 조건을 설정할 수 있습니다.
WHERE column < ANY (서브쿼리) : 서브쿼리 결과 중 최대값보다 작은 컬럼 값
WHERE column > ANY (서브쿼리) : 서브쿼리 결과 중 최소값보다 큰 컬럼 값
<
또는 >
연산자와 ALL의 조합ALL
은 서브쿼리의 모든 값과 비교하여 조건을 만족해야 TRUE
를 반환합니다. ALL
과 <
, >
연산자를 함께 사용하면 서브쿼리 결과의 최대값 또는 최소값과 비교하여 범위를 좁힐 수 있습니다.
WHERE column < ALL (서브쿼리) : 서브쿼리 결과 중 최소값보다 작은 컬럼 값
WHERE column > ALL (서브쿼리) : 서브쿼리 결과 중 최대값보다 큰 컬럼 값
sal < any (서브쿼리)
: 서브쿼리 결과 중 최대값보다 작은 sal 값
sal > any (서브쿼리)
: 서브쿼리 결과 중 최소값보다 큰 sal 값
sal < all (서브쿼리)
: 서브쿼리 결과 중 최소값보다 작은 sal 값
sal > all (서브쿼리)
: 서브쿼리 결과 중 최대값보다 큰 sal 값
-- 예시 쿼리
-- 모든 부서의 최고 급여보다 작은 급여를 가진 사원
select empno, ename, sal
from emp
where sal < all (select max(sal) from emp group by deptno);
-- 특정 부서의 최저 급여보다 높은 급여를 가진 사원
select empno, ename, sal
from emp
where sal > any (select min(sal) from emp where deptno = 10);
-- 직책이 manager인 사원들의 급여가 전체보다 적은 사원들에 대한 정보
SELECT *
FROM employees
WHERE salary < (SELECT AVG(salary) FROM employees WHERE job_id = 'MANAGER');
-- MILLER보다 늦게 입사한 사원의 사번, 이름, 입사일을 추출
SELECT employee_id, name, hire_date
FROM employees
WHERE hire_date > (SELECT hire_date FROM employees WHERE name = 'MILLER');
-- 10월부터의 사원을 모두 찾아 입사한 사원에 대한 사번, 이름, 입사일
SELECT employee_id, name, hire_date
FROM employees
WHERE hire_date >= '2023-10-01';