Database/Oracle

[Oracle] EXISTS()와 IN()

Ma_Sand 2023. 4. 17. 22:25
반응형

EXISTS()

- 문법: EXISTS(subquery)

  - 서브쿼리만 사용 가능

- 처리 순서: 메인쿼리 -> 서브쿼리

- 서브쿼리의 결과가 단 한 건이라도 존재하면 결과값을 True, 없으면 False로 리턴하고 더이상 쿼리를 수행하지 않는다.

 

SELECT a.USER_NO
     , a.USER_NM
     , a.DEPT_NO
FROM USR a
WHERE a.JOB = 'EMPLOYEE'
AND EXISTS (SELECT 1
            FROM DEPT b
            WHERE b.USER_NO = a.USER_NO)

 

- 실행 결과

USER_NO USER_NM DEPT_NO
101 TOM 26
102 SAM 24

DEPT 테이블에서 SAM 2건, TOM 1건, JENNY 0건으로 JENNY를 제외하고 조회가 된다.

EXISTS() 내 서브쿼리의 DEPT 테이블에 데이터가 한 건이라도 존재하면 조회가 되며, SELECT절에서 조회할 컬럼은 없으므로 의미 없는 1을 작성한다.

 

 

- NOT EXISTS()

  - NULL값이 포함된다.

SELECT a.USER_NO
     , a.USER_NM
     , a.DEPT_NO
FROM USR a
WHERE a.JOB = 'EMPLOYEE'
AND NOT EXISTS (SELECT 1
                FROM DEPT b
                WHERE b.USER_NO = a.USER_NO)

 

- 실행 결과

USER_NO USER_NM DEPT_NO
100 JENNY 21

DEPT 테이블에 데이터가 존재하지 않는 JENNY만 조회가 된다.

 

 

 

IN()

- 문법: 컬럼명 IN(subquery or value)

 - 서브쿼리 또는 단순 값 사용 가능

- 처리 순서: 서브쿼리 -> 메인쿼리

- 서브쿼리에 특정 값들이 포함되어 있으면 True, 없으면 False를 리턴한다.

 

SELECT a.USER_NO
     , a.USER_NM
     , a.DEPT_NO
FROM USR a
WHERE a.JOB = 'EMPLOYEE'
AND a.USER_NO IN (SELECT b.USER_NO
                  FROM DEPT b
                  WHERE b.USER_NO = a.USER_NO)

 

- 실행 결과

USER_NO USER_NM DEPT_NO
101 TOM 26
102 SAM 24

EXISTS()와 조회 결과가 같다.

IN()은 서브쿼리 결과를 모두 수행하고, EXISTS()는 일치하는 결과가 있으면 더이상 수행하지 않으므로, 서브쿼리의 테이블에 데이터가 많다면 EXISTS()를 사용하는 것이 좋다. (쿼리 조회 속도가 월둥히 빠름)

 

 

- NOT IN()

  - NULL값이 포함되지 않는다.

SELECT a.USER_NO
     , a.USER_NM
     , a.DEPT_NO
FROM USR a
WHERE a.JOB = 'EMPLOYEE'
AND a.USER_NO NOT IN (SELECT b.USER_NO
                      FROM DEPT b
                      WHERE b.USER_NO = a.USER_NO)

 

 

 

EXISTS()와 IN()의 차이점

EXISTS()는 for break문 방식이고, IN()은 for문 방식이다.- EXISTS()는 결과값이 단 한 건이라도 존재하면 그 다음 쿼리를 수행하지 않는다.- IN()은 특정 결과값이 모두 나올 때까지 쿼리를 수행한다. => EXISTS()가 성능 면에서 IN()보다 좋다.

 

 

 

 

출처: https://gent.tistory.com/278

반응형