서브쿼리 및 관련 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;