PostgreSQL조회와 필터링

서브쿼리와 EXISTS

다른 쿼리의 결과를 조건이나 값으로 재사용하는 서브쿼리와, 존재 여부 판단에 강한 EXISTS 패턴을 함께 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

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