SQL Professional
[독학! SQLP] 서브쿼리
by 개발자의
2025. 8. 20.
서브쿼리?
- 정의: 하나의 SQL문 안에 포함된 또 다른 SQL문. SELECT, INSERT, UPDATE, DELETE 등에서 사용 가능.
- 형태: 보통 괄호 ( ) 안에 작성됨.
- 용도: 비교 값 제공, 조건절로 사용, 집계된 값 반환 등.
서브쿼리의 종류
단일행 서브쿼리
- 결과가 1행 1열
- WHERE 절에서 사용
- 연산자 : =, <, >, <=, >=
- 예시
-- 평균 급여보다 큰 사원
SELECT ename
, sal
FROM emp
WHERE sal > (SELECT AVG(sal) FROM emp);
다중행 서브쿼리
- 결과가 여러행
- WHERE 절에서 사용
- 연산자 : IN, ANY, ALL, EXISTS
- 예시
-- 댈러스 부서 직원
SELECT ename
, deptno
FROM emp
WHERE deptno IN (SELECT deptno FROM dept WHERE loc = 'DALLAS');
다중열 서브쿼리
- 결과가 여러 열
- WHERE 절에서 사용
- 연산자 : (col1, col2) IN ...
- 칼럼 수와 자료형 일치 해아한다.
- 예시
-- SCOTT과 같은 부서+직무 가진 사원
SELECT ename
, deptno
, job
FROM emp
WHERE (deptno, job) IN (SELECT deptno, job FROM emp WHERE ename = 'SCOTT');
상관 서브쿼리
- 외부 쿼리의 값을 내부 쿼리가 참조
- WHERE/HAVING 절 조건에서 행을 필터링 하는 역할
- 연산자 : =, IN 등
- 외부 쿼리의 컬럼을 내부(서브쿼리)에서 참조하는 방식으로 외부 쿼리의 각 행마다 서브쿼리가 반복실행됨(참/거짓 판별).
- 일반 서브쿼리와 달리 독립적으로 실행이 불가하다.
- 성능상 비용 ↑ (조인으로 대체 가능할 때가 많음).
- 예시
-- 각 부서 평균보다 급여가 높은 사원
SELECT e.ename
, e.sal
FROM emp e
WHERE e.sal > (SELECT AVG(sal) FROM emp WHERE deptno = e.deptno);
스칼라 서브쿼리
- 단일 값 반환 (결과가 1행 1열)
- SELECT 절에서 값 처럼 사용
- 열을 확장할때 씀.
- 상관 서브쿼리처럼 외부 컬럼을 참조하기도 하지만, 용도가 출력의 확장이므로 스칼라 서브쿼리로 분류함.
- 예시
-- 사원과 부서명 같이 출력
SELECT ename
, sal
, (SELECT dname FROM dept d WHERE d.deptno = e.deptno) AS dept_name
FROM emp e;
인라인 뷰
- 여러행(뷰처럼 취급)
- FROM 절에 사용
- Top-N, 중간집계시 사용
- 예시
SELECT *
FROM (
SELECT ename
, sal
FROM emp
ORDER BY sal DESC
)
WHERE ROWNUM <= 3; → 급여 Top 3
WITH 절(공통 테이블 식, CTE)
- 여러행
- FROM (뷰처럼)/SELECT(스칼라 서브쿼리 처럼)절 에서 사용
- 쿼리 재사용, 가독성↑
- 예시
-- 각 부서 평균보다 높은 급여 사원
WITH dept_avg AS (
SELECT deptno
, AVG(sal) avg_sal
FROM emp
GROUP BY deptno
)
SELECT e.ename
, e.sal
FROM emp e
JOIN dept_avg d
ON e.deptno = d.deptno
WHERE e.sal > d.avg_sal;