300x250
SQL에서 EXISTS는 서브쿼리의 결과가 존재하는지를 확인하는 조건절입니다.
즉, EXISTS는 서브쿼리가 한 개 이상의 행을 반환하면 참(True)을 반환하고, 행을 반환하지 않으면 거짓(False)을 반환합니다.
EXISTS는 주로 데이터 존재 여부를 확인하는 데 사용되며, 서브쿼리 내부에서 실제로 데이터를 반환할 필요는 없습니다.
단순히 해당 조건을 만족하는 행이 있는지 여부만을 판단합니다.
EXISTS 구문:
SELECT column_list
FROM table_name
WHERE EXISTS
( SELECT 1 FROM another_table WHERE condition );
- EXISTS는 서브쿼리의 결과가 존재하면 참을 반환하여 WHERE 절의 조건을 만족시킵니다.
- 서브쿼리는 SELECT 뒤에 무엇을 쓰든 상관없습니다. 보통 SELECT 1처럼 단순한 값을 씁니다.
사용 예시:
1. EXISTS를 사용한 간단한 조회
다음은 Employees 테이블에서 특정 부서(Departments)에 속한 직원만을 조회하는 예시입니다.
SELECT employee_id, name
FROM Employees e
WHERE EXISTS
( SELECT 1 FROM Departments d WHERE d.department_id = e.department_id );
- 이 쿼리는 Employees 테이블에서 Departments 테이블에 부서가 존재하는 직원만을 조회합니다.
- EXISTS 절 내의 서브쿼리는 부서가 Employees.department_id와 일치하는 부서가 있는지 확인합니다.
- 서브쿼리가 조건을 만족하는 행을 하나라도 반환하면 해당 직원 정보가 출력됩니다.
2. NOT EXISTS 조건
NOT EXISTS는 서브쿼리의 결과가 없을 때 참을 반환합니다. 즉, 서브쿼리가 행을 반환하지 않으면 참으로 처리됩니다.
SELECT employee_id, name
FROM Employees e
WHERE NOT EXISTS
( SELECT 1 FROM Departments d WHERE d.department_id = e.department_id );
- 이 쿼리는 Employees 테이블에서 Departments 테이블에 해당 부서가 없는 직원만을 조회합니다.
- 즉, 부서에 속하지 않은 직원들만 결과에 포함됩니다.
3. 서브쿼리에서의 활용
다음은 Products 테이블에서 판매된 적이 없는 상품을 조회하는 예시입니다.
SELECT product_id, product_name
FROM Products p
WHERE NOT EXISTS
( SELECT 1 FROM Orders o WHERE o.product_id = p.product_id );
- Products 테이블에서 Orders 테이블에 해당 상품의 주문 기록이 없는 상품을 조회합니다.
- NOT EXISTS는 서브쿼리에서 주문 내역이 없을 때 참을 반환하므로, 판매되지 않은 상품을 확인할 수 있습니다.
# EXISTS vs IN 차이:
- EXISTS는 행 존재 여부만을 확인하기 때문에, 서브쿼리의 결과가 많더라도 성능에 크게 영향을 받지 않습니다.
- 반면, IN은 서브쿼리의 모든 결과를 메모리에 저장하여 비교하므로 데이터 양이 많으면 성능이 저하될 수 있습니다.
요약:
- EXISTS: 서브쿼리가 한 개 이상의 행을 반환하면 참(True), 그렇지 않으면 거짓(False)을 반환.
- NOT EXISTS: 서브쿼리가 행을 반환하지 않으면 참(True)을 반환.
- 주로 데이터의 존재 여부를 확인하는 데 사용.
300x250
'IT > DB' 카테고리의 다른 글
데이터베이스 SQL decode 함수 쓰는 방법 (3) | 2024.11.06 |
---|---|
데이터베이스 SQL 조건절 where 1=1 뜻 (0) | 2024.11.05 |
select 1 from 테이블 쿼리 사용하는 방법 (0) | 2024.11.02 |
데이터베이스 쿼리 범위 조회 LIMIT절 (feat.Cubrid 큐브리드) (0) | 2024.11.02 |
데이터베이스 SQL쿼리 rollup 합계 사용하는 방법 (1) | 2024.11.02 |