[MSSQL] EXISTS, NOT EXISTS 사용법 쉽게 정리
- 데이터베이스/MSSQL
- 2022. 6. 1.
SQL Server에서 EXISTS 연산자는 서브쿼리에 데이터가 존재하는지 체크하고 존재할 경우 TRUE를 반환하며, 대표적으로 EXISTS 구문과 NOT EXISTS 구문이 있다. EXISTS 연산자는 IN 연산자와 비슷한 용도로 사용할 수 있으며, IN 연산자는 비교할 값을 직접 대입할 수 있지만 EXISTS 연산자는 서브쿼리만 사용할 수 있다. 서브쿼리를 사용할 경우 상황에 따라서 IN 연산자 보다 EXISTS 연산자의 성능이 좋을 수 있다.
목차 |
기본적인 EXISTS, NOT EXISTS 사용법
EXISTS
SELECT *
FROM dept a
WHERE a.deptno IN (20, 30, 40)
AND EXISTS (SELECT 1
FROM emp b
WHERE b.sal between 500 and 1300
AND b.deptno = a.deptno)
위의 쿼리문은 dept 테이블의 deptno가 EXISTS 서브쿼리에서 deptno가 존재할 때만 데이터가 조회되는 예제이다.
deptno가 서브쿼리에 1건이라도 존재하면 TRUE를 반환하며 데이터가 조회된다.
deptno '20'과 '30'은 서브쿼리에 1건 이상이 존재하기 때문에 조회가 되고, deptno '40'은 서브쿼리에 존재하지 않기 때문에 조회 데이터에서 제외된다.
NOT EXISTS
SELECT *
FROM dept a
WHERE a.deptno IN (20, 30, 40)
AND NOT EXISTS (SELECT 1
FROM emp b
WHERE b.sal between 500 and 1300
AND b.deptno = a.deptno)
NOT EXISTS는 EXISTS와 반대로 서브쿼리에 데이터가 존재하지 않을 경우 데이터가 조회된다.
NOT EXISTS도 서브쿼리에 데이터를 1건이라도 찾으면 검색을 멈추고 TRUE를 반환한다. NOT이 붙었기 때문에 (TRUE → FALSE, FALSE → TRUE) 반환 값이 반대로 바뀌어서 서브쿼리에 존재하지 않는 데이터만 조회된다.
서브쿼리에서 존재하지 않는 deptno '40'만 조회된다.
CASE 표현식에서 EXISTS 사용법
SELECT a.deptno
, a.dname
, a.loc
, CASE WHEN EXISTS (SELECT 1
FROM emp b
WHERE b.sal between 500 and 1300
AND b.deptno = a.deptno)
THEN 'Y'
ELSE 'N'
END AS exists_yn
FROM dept a
WHERE a.deptno IN (20, 30, 40)
EXISTS 연산자는 TRUE, FALSE를 반환하기 때문에 CASE 표현식의 조건으로 사용할 수 있다.
EXISTS의 서브쿼리에 데이터가 존재하면 THEN의 'Y'를 반환하고, 존재하지 않을 경우 ELSE의 'N'을 반환한다.
IN 연산자와 비교 및 EXISTS 연산자의 성능
IN 연산자도 EXISTS와 동일하게 서브쿼리를 사용하여 데이터를 비교할 수 있으며, EXISTS와 결과도 동일하다.
차이가 있다면 IN 연산자는 무조건 서브쿼리의 모든 행을 검색하여 해당 값(deptno)을 IN 연산자에 대입한다.
EXISTS 연산자는 서브쿼리에서 해당 값이 1건이라도 찾으면 검색을 멈추고 TRUE를 반환한다.
IN 연산자는 서브쿼리를 모두 검색하고, EXISTS 연산자는 찾을 때 까지만 검색한다.
서브쿼리의 데이터가 작은 경우 IN 연산자와 EXISTS 연산자의 성능은 크게 차이가 없지만, 서브쿼리에서 조회되는 데이터가 많아질수록 EXISTS 연산자를 사용하는 것이 쿼리 문의 성능이 더 좋다.