Subquery Summary

결과 모양은 위치가, 실행 비용은 외부 참조가 결정합니다

서브쿼리는 바깥 SQL의 빈칸을 채우는 보조 질의입니다. 그래서 먼저 어떤 자리에 들어가는지 보고, 그다음 외부 행을 읽는지 확인하면 거의 모든 형태를 빠르게 해석할 수 있습니다.

읽는 순서 1
SELECT, WHERE, FROM, HAVING 중 어디에 들어가는가
읽는 순서 2
외부 행을 참조하면 행마다 다시 계산될 수 있음

자리에 따라 반환 형태와 역할이 달라집니다

단일 값
SELECT, HAVING
스칼라 서브쿼리로 한 칸의 값만 채웁니다. 평균, 최대값, 카운트처럼 비교 기준을 만들 때 씁니다.
값 집합
WHERE
IN / EXISTS / ALL / ANY로 행을 남길지 버릴지 결정합니다. 존재 여부와 범위 비교가 핵심입니다.
임시 테이블
FROM
인라인 뷰로 중간 결과를 먼저 만들고, 바깥 쿼리가 그 집합을 다시 읽습니다.

비용 판단은 상관 여부를 먼저 봅니다

비상관 서브쿼리

외부 행과 독립적이라 먼저 한 번 계산한 뒤 결과를 비교하기 쉽습니다. 읽기 흐름이 단순합니다.

상관 서브쿼리

현재 행 값을 읽으므로 행마다 반복 실행될 수 있습니다. 행 수가 크면 JOIN이나 윈도우 함수로 바꿀지 먼저 검토합니다.

실무 체크
NOT IN은 서브쿼리 결과에 NULL이 섞이면 쉽게 함정에 빠집니다. 존재 여부 비교는 NOT EXISTS가 더 안전합니다.
마지막 정리
불필요한 중첩은 걷어내고 가장 단순한 질의로 남깁니다. 예를 들어 SELECT DISTINCT category FROM products처럼 직접 표현할 수 있으면 그 편이 더 읽기 쉽습니다.