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()보다 좋다.