Develop

[PostgreSQL] EXISTS 쿼리 사용법과 예제

issuemaker99 2025. 2. 6. 13:45
728x90

1. EXISTS란?

EXISTS는 PostgreSQL에서 특정 서브쿼리의 결과가 존재하는지 여부를 확인하는 데 사용하는 조건문입니다. 만약 서브쿼리가 한 개 이상의 행을 반환하면 TRUE를 반환하고, 그렇지 않으면 FALSE를 반환합니다.

이는 주로 WHERE 절에서 사용되며, 특정 조건을 만족하는 데이터가 존재하는지 빠르게 검사하는 데 유용합니다.

 

2. EXISTS 기본 사용법

기본 구문:

SELECT column1, column2, ...
FROM table_name
WHERE EXISTS (
    SELECT 1 FROM another_table WHERE condition
);

 

위 구문에서 EXISTS 안에 들어가는 서브쿼리는 단순히 존재 여부만 확인하면 되기 때문에 SELECT 1을 사용합니다. 즉, 실제 데이터를 반환하는 것이 아니라 해당 조건을 만족하는 행이 있는지만 검사합니다.


3. EXISTS 예제

예제 1: 고객이 주문을 했는지 확인하기

테이블 구조:

  • customers (고객 테이블)
    • id (고객 ID, 기본 키)
    • name (고객 이름)
  • orders (주문 테이블)
    • id (주문 ID, 기본 키)
    • customer_id (고객 ID, 외래 키)
    • order_date (주문 날짜)

목표: 주문을 한 적이 있는 고객만 조회하기

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

 

설명:

  • customers 테이블에서 고객을 조회합니다.
  • EXISTS 서브쿼리를 이용하여 orders 테이블에서 해당 고객이 주문을 한 적이 있는지 확인합니다.
  • orders 테이블에서 customer_id customers 테이블의 id와 일치하는 데이터가 하나라도 있으면 EXISTS TRUE가 되어 해당 고객이 결과에 포함됩니다.

예제 2: 서브쿼리 없이 존재 여부 확인하기

EXISTS를 사용하지 않고 JOIN으로 같은 결과를 얻을 수도 있습니다.

SELECT DISTINCT c.name
FROM customers c
JOIN orders o ON c.id = o.customer_id;

 

하지만 EXISTS를 사용할 경우 불필요한 조인을 피할 수 있어 성능이 더 나아질 수 있습니다.


4. NOT EXISTS 사용법

NOT EXISTS는 특정 조건을 만족하는 데이터가 존재하지 않을 경우 TRUE를 반환합니다.

예제 3: 주문을 한 적이 없는 고객 찾기

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

 

이 쿼리는 orders 테이블에 주문 기록이 없는 고객만 조회합니다.


5. EXISTS vs IN vs JOIN 성능 비교

1) EXISTS vs IN

둘 다 특정 조건을 만족하는 데이터가 존재하는지 확인하는 데 사용될 수 있지만, 차이점이 있습니다.

  • EXISTS는 서브쿼리를 실행하다가 조건을 만족하는 첫 번째 행을 찾으면 즉시 종료합니다.
  • IN은 서브쿼리가 반환하는 모든 결과를 먼저 가져온 후 비교를 수행합니다.
-- EXISTS 사용
SELECT name FROM customers c
WHERE EXISTS (
    SELECT 1 FROM orders o WHERE o.customer_id = c.id
);

-- IN 사용
SELECT name FROM customers
WHERE id IN (SELECT customer_id FROM orders);

 

대체로 서브쿼리 결과가 큰 경우 EXISTS가 더 효율적입니다.

2) EXISTS vs JOIN

  • JOIN은 두 테이블을 결합하여 필요한 데이터를 조회하는 방식입니다.
  • EXISTS는 존재 여부만 확인하기 때문에 불필요한 데이터 조회를 방지할 수 있습니다.

일반적인 성능 원칙:

  • 데이터가 많을 때는 EXISTS JOIN보다 성능이 좋을 수 있음
  • 결과가 많다면 JOIN이 더 적절할 수도 있음

 

LIST