서브쿼리 및 관련 SQL 개념 정리
1. 서브쿼리 유형 요약
| 구분 |
설명 |
사용 위치 |
특징 |
| 단일행 서브쿼리 |
하나의 행을 반환 |
WHERE, HAVING |
=, >, < 등과 함께 사용 |
| 다중행 서브쿼리 |
여러 행을 반환 |
WHERE, HAVING |
IN, ANY, ALL, EXISTS |
| 상호연관 서브쿼리 |
외부 쿼리와 연동되어 반복 실행 |
WHERE, SELECT |
외부의 각 행마다 실행 |
| 스칼라 서브쿼리 |
하나의 값 반환 |
SELECT, WHERE 등 |
컬럼처럼 활용 |
| 인라인 뷰 |
FROM 절에 서브쿼리 사용 |
FROM (SELECT …) |
임시 테이블 역할 |
| 계층형 쿼리 |
트리 구조 조회 |
START WITH, CONNECT BY |
계층 수준(LEVEL) 활용 |
| Top-N 쿼리 |
상위/하위 N건 조회 |
ROWNUM, ROW_NUMBER, FETCH 등 |
정렬 후 추출 |
| CTE (WITH 절) |
공통 테이블 표현식 |
쿼리 전체 구조 상단 |
재사용성과 가독성 향상 |
2. 주요 SQL 예제
단일행 서브쿼리
SELECT first_name, job_id, hire_date
FROM employees
WHERE job_id = (SELECT job_id FROM employees WHERE employee_id = 103);
다중행 서브쿼리
-- ANY 사용
SELECT first_name, salary
FROM employees
WHERE salary > ANY (SELECT salary FROM employees WHERE first_name = 'David');
-- IN 사용
SELECT first_name, salary
FROM employees
WHERE salary IN (SELECT salary FROM employees WHERE first_name = 'David');
EXISTS
SELECT first_name, salary
FROM employees e
WHERE EXISTS (
SELECT * FROM departments d
WHERE d.manager_id = e.employee_id
);
상호연관 서브쿼리
SELECT first_name, salary
FROM employees a
WHERE salary > (
SELECT AVG(salary)
FROM employees b
WHERE b.department_id = a.department_id
);
스칼라 서브쿼리
SELECT first_name,
(SELECT department_name
FROM departments d
WHERE d.department_id = e.department_id) AS department_name
FROM employees e;
인라인 뷰
SELECT row_number, first_name, salary
FROM (
SELECT first_name, salary,
ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_number
FROM employees
)
WHERE row_number BETWEEN 1 AND 10;
FETCH 사용 (Oracle 12c+)
SELECT first_name, salary
FROM employees
ORDER BY salary DESC
OFFSET 10 ROWS
FETCH FIRST 5 ROWS ONLY;