[SQL] postgreSQL EXISTS

Dev_sheep·2025년 6월 15일
  • 쿼리의 문법 중에 EXISTS가 존재한다. 이에 대해 IN과 함께 비교하면서 알아보자

EXISTS

  • 말 그대로 서브쿼리에서 반환하는 값이 존재하는지에 대한 여부를 판단해주는 역할을 한다.

    • 특정 조건의 일치 여부에 대해 true/false를 반환
  • 주로 EXISTS를 사용하는 것이 성능이 좋다.

    • 찾는 조건이 하나라도 있으면 true 반환
  • 종종 SELECT 1을 해주는데, 이유는 무슨 값을 넣어주던 상관 없기에 형식 상 1을 넣어준다

EXISTS vs IN 동작

  • 존재하는 여부에 대해서 IN과 비교
[ EXISTS ]

SELECT *
FROM customers c
WHERE EXISTS (
    SELECT 1
    FROM orders o
    WHERE o.customer_id = c.id
);

[ IN ]
SELECT *
FROM customers
WHERE id IN (
    SELECT customer_id
    FROM orders
);
  • 여기서 EXISTS가 IN보다 성능이 좋은 이유를 나열해보자
    • IN은 내부 쿼리를 먼저 모두 수행하고 나서 리스트로 만들고, 이후 외부 쿼리의 각 행이 포함되는지 비교한다.
    • SELECT customer_id FROM orders 에서 예를 들어 {1, 2, 5, 7}이 나왔다면
    • 외부 쿼리 ⇒ customers.id IN {1, 3, 4, 5, ...} 에서 고객들이 포함됐는지, 안됐는지 비교해서 반환을 해준다.
    • 반면, EXISTS는 외부쿼리에서 내부쿼리로 하나씩 검사한다.
      • 각 행마다 하위 쿼리를 실행해서 만족하는 행이 있는지 확인한다.
      • 외부 쿼리를 돌면서 customers의 n번 고객이 하위 쿼리에서 있다면 포함한다.
      • 그래서 이러한 동작형태에 따라 존재 여부 만 보기 때문에 보다 효율적이라고 한다.

EXISTS vs IN NULL

  • IN의 경우 NULL이 포함되면 원하지 않는 결과가 나올 수 있다
idnamescore
1abc100
2defnull
3ghinull
  • 여기서 쿼리가 SELECT * FROM students WHERE score IN (100, null)
  • 위와 같이 되면 결과는 모두 나올 것이라는 예상과는 다르게 첫 번째 행인 name에 abc와 score가 100인 행만이 반환된다.
  • NULL은 값이 아니기 때문에 포함여부나 비교 등에서 UNKNOWN 으로 보아서 값 반환이 없는 것으로 보인다.
  • 그래서 IN을 할 때는 IS NULL, IS NOT NULL 등을 활용하는 것이 오류 방지에 좋다.
profile
기록과 공유

0개의 댓글