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
'Develop' 카테고리의 다른 글
[HTML] iframe 사용법 및 내부/외부 접근 예제 (1) | 2025.02.10 |
---|---|
[jQuery] click과 touchend 차이점 및 주의사항 (2) | 2025.02.07 |
SQL INSERT 문에서 싱글 쿼테이션 입력하는 방법 (1) | 2025.02.05 |
[PostgreSQL] 순차적으로 증가하는 숫자형 컬럼 중간에 비어있는 값(누락된 값)을 조회 (2) | 2025.02.04 |
[PostgreSQL] UNIQUE Key 생성 방법 총정리 (0) | 2025.02.04 |