DataBase/Oracle

[Oracle] EXISTS, NOT EXISTS 함수 사용법과 예시

mingmongs 2025. 6. 13. 17:34

title

ORACLE의 EXSITS는 WHERE 절에서 조건에 부합하는
데이터를 조회하기 위해 주로 사용하는데,
EXISTS를 사용하는 이유와 사용 방법, 예시를 알아보자.

 

1) EXISTS

: 서브 쿼리 조건에 만족하는 모든 데이터를 반환하는 함수이다.
주로 WHERE 절에서 조건에 맞는 데이터를 찾기 위해 사용하며,
CASE 문에서 조건으로 사용할 수도 있다.

1-1) EXISTS 특징

  • EXISTS는 결과에 부합하는 데이터를 출력,
    NOT EXISTS는 결과에 부합하지 않는 데이터를 출력함
  • 결과를 TRUE/FALSE로 반환하여 CASE문의 조건으로 사용 가능
  • IN 함수에 비해 성능이 좋아 대용량 데이터에 용이함

 

2) NOT EXISTS

: EXISTS 함수와 반대로,
서브 쿼리 조건에 만족하지 않는 데이터들만 반환하는 함수이다.

 

3) 예시

예시는 아래의 임시 테이블을 활용하여 작성해보았다.

WITH EMP_TABLE AS (
    SELECT '5020' AS EMP_NO, 'SCOOT' AS EMP_NM, '20120302' AS HIRE_DATE FROM DUAL
    UNION ALL
    SELECT '5004' AS EMP_NO, 'BLAKE' AS EMP_NM, '20100821' AS HIRE_DATE FROM DUAL
    UNION ALL
    SELECT '5001' AS EMP_NO, 'ANDREW' AS EMP_NM, '20100103' AS HIRE_DATE FROM DUAL
    UNION ALL
    SELECT '5038' AS EMP_NO, 'VICTORIA' AS EMP_NM, '20150617' AS HIRE_DATE FROM DUAL
    UNION ALL
    SELECT '5039' AS EMP_NO, 'MARY' AS EMP_NM, '20150617' AS HIRE_DATE FROM DUAL
    UNION ALL
    SELECT '5007' AS EMP_NO, 'JAMES' AS EMP_NM, '20100911' AS HIRE_DATE FROM DUAL
    UNION ALL
    SELECT '5024' AS EMP_NO, 'NICOLE' AS EMP_NM, '20120302' AS HIRE_DATE FROM DUAL
    UNION ALL
    SELECT '5003' AS EMP_NO, 'SMITH' AS EMP_NM, '20130810' AS HIRE_DATE FROM DUAL
),
SAL_TABLE AS (
    SELECT '5020' AS EMP_NO, 2100 AS SAL FROM DUAL
    UNION ALL
    SELECT '5004' AS EMP_NO, 2100 AS SAL FROM DUAL
    UNION ALL
    SELECT '5001' AS EMP_NO, 2280 AS SAL FROM DUAL
    UNION ALL
    SELECT '5006' AS EMP_NO, 3100 AS SAL FROM DUAL
    UNION ALL
    SELECT '5038' AS EMP_NO, 2900 AS SAL FROM DUAL
    UNION ALL
    SELECT '5039' AS EMP_NO, 1460 AS SAL FROM DUAL
    UNION ALL
    SELECT '5007' AS EMP_NO, 1900 AS SAL FROM DUAL
    UNION ALL
    SELECT '5024' AS EMP_NO, 1820 AS SAL FROM DUAL
    UNION ALL
    SELECT '5003' AS EMP_NO, 2450 AS SAL FROM DUAL
)
SELECT A.*, B.SAL
FROM EMP_TABLE A
LEFT JOIN SAL_TABLE B
    ON A.EMP_NO = B.EMP_NO
ORDER BY A.EMP_NO;

 

테이블 데이터

img1

 

 

3-1) CASE WHEN EXISTS

예시

SELECT A.*,
       CASE WHEN EXISTS ( SELECT 1
                            FROM EMP_TABLE B
                           WHERE A.EMP_NO = B.EMP_NO
                            AND HIRE_DATE LIKE '2010%'
                        ) THEN 'Y' ELSE 'N' END AS FLAG
FROM SAL_TABLE A


결과값

img2

 

3-2) WHERE EXISTS

예시

SELECT *
FROM SAL_TABLE A
WHERE A.SAL > 2400
AND EXISTS ( SELECT B.EMP_NO 
               FROM EMP_TABLE B 
              WHERE A.EMP_NO = B.EMP_NO
            );

 

결과값

img3



3-3) WHERE NOT EXISTS

예시

SELECT *
FROM SAL_TABLE A
WHERE A.SAL > 2400
AND NOT EXISTS ( SELECT B.EMP_NO 
               FROM EMP_TABLE B 
              WHERE A.EMP_NO = B.EMP_NO
            );

 

결과값

img4

 

 

[reference]

https://honeyteacs.tistory.com/53
https://sein-jh.tistory.com/176