기본 패턴
text
SELECT name
FROM users AS u
WHERE EXISTS (
SELECT 1
FROM posts AS p
WHERE p.user_id = u.id
);설명
- 서브쿼리는 다른 쿼리 안에 들어가는 작은 쿼리로, 조건 판단이나 값 계산에 자주 사용됩니다.
EXISTS는 "해당 조건을 만족하는 행이 하나라도 있으면 참"이라는 뜻으로 읽으면 됩니다.- 같은 조건을
JOIN으로도 표현할 수 있지만, "존재 여부만 확인"할 때는EXISTS가 의도를 더 분명하게 보여 줄 수 있습니다. - 서브쿼리는
SELECT목록,WHERE,FROM등 여러 위치에 들어갈 수 있지만, 초반에는 "필터링용 서브쿼리"와 "존재 확인용 EXISTS"를 먼저 익히는 편이 좋습니다. - 상위 쿼리의 열을 안쪽 쿼리에서 참조하면 상관 서브쿼리가 되며, 이런 형태는 관계를 자연스럽게 표현하는 데 자주 쓰입니다.
짧은 예제
text
SELECT title
FROM posts
WHERE user_id IN (
SELECT id
FROM users
WHERE active = true
);빠른 정리
| 문법 | 의미 |
|---|---|
| 서브쿼리 | 쿼리 안에 들어가는 또 다른 쿼리 |
EXISTS (...) | 결과가 한 행이라도 있으면 참 |
IN (...) | 목록 안에 포함되는지 비교 |
| 상관 서브쿼리 | 바깥 쿼리 값을 안쪽에서 참조 |
주의할 점
서브쿼리가 많아질수록 읽기 어려워질 수 있습니다. 중간 결과에 이름을 붙이고 싶다면
다음 카드의 WITH 구문처럼 CTE로 빼는 편이 더 읽기 좋을 때가 많습니다.
참고 링크
1 sources