[MSSQL] EXISTS, NOT EXISTS 사용법 쉽게 정리

SQL Server에서 EXISTS 연산자는 서브쿼리에 데이터가 존재하는지 체크하고 존재할 경우 TRUE를 반환하며, 대표적으로 EXISTS 구문과 NOT EXISTS 구문이 있다. EXISTS 연산자는 IN 연산자와 비슷한 용도로 사용할 수 있으며, IN 연산자는 비교할 값을 직접 대입할 수 있지만 EXISTS 연산자는 서브쿼리만 사용할 수 있다. 서브쿼리를 사용할 경우 상황에 따라서 IN 연산자 보다 EXISTS 연산자의 성능이 좋을 수 있다.

 

MSSQL EXISTS 사용법

목차
  1. 기본적인 EXISTS, NOT EXISTS 사용법
  2. CASE 표현식에서 EXISTS 사용법
  3. 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 연산자를 사용하는 것이 쿼리 문의 성능이 더 좋다.

 

예제쿼리(테이블포함).txt
0.00MB

 

 

[MSSQL] CASE WHEN 표현식 사용법

SQL Server에서는 조건에 따라 서로 다른 값을 반환할 수 있는 CASE 표현식을 사용할 수 있다. 프로그래밍 언어에서 if 문과 비슷하다고 생각하면 된다. 오라클의 DECODE 함수와 비슷한 기능을 하며, CAS

gent.tistory.com

 

[MSSQL] IN 연산자 사용법 (NOT IN, 서브쿼리)

SQL Server에서 OR 연산자를 사용하여 여러 개의 값을 비교하는 작업을 IN 연산자를 사용하면 아주 간단하게 쿼리문을 작성할 수 있다. IN 연산자에 입력된 값 중에서 하나라도 일치하는 것이 있으면

gent.tistory.com

 

댓글

Designed by JB FACTORY