되게 하는 사람

일이 되게 하는 사람을 지향하며, 이것저것 되게 (많이) 하는 사람입니다.

스터디

[SQL] - (NOT) IN과 (NOT) EXISTS 차이점

서홍시 2023. 1. 6. 19:37

데이터리안 데이터분석가 단톡방에서 NOT IN을 쓰는 것보다 NOT EXISTS를 쓰는 것이 row가 많은 데이터에서 더 효율적이라는 이야기가 있어, 의식적으로 쿼리를 짤때 NOT IN 대신 NOT EXISTS를 사용하려고 하고 있다. 그런데 IN 과 EXISTS의 쿼리 작동방식이 달라 주의해야할 점이 있어 그 점에 대해 기록해보려고 한다. 

 


 

IN 구문 : 실제 데이터들의 모든 값을 비교하여 일치하는지 확인 EXISTS 구문 : 해당 ROW 가 존재하는지만 확인
>> 동작방법

1. 서브쿼리를 먼저 실행하여 출력되는 모든 row(요소) 가져옴

2. 메인쿼리에서 row 하나를 가져옴

3. 2번에서 가져온 row의 값이 1번에서 가져온 IN 이하 요소와 일치되는지를 체크하고, 하나라도 일치하면 해당 메인쿼리 row를 출력

4. 2-3번을 메인쿼리의 row 갯수 만큼 반복하면서 결과 출력
(➢ 이 때문에 쿼리의 결과 반환 속도가 느려진다.)


>> 동작 방법

1. 메인 쿼리를 먼저 실행해서 출력되는 상위 row 가져옴

2. 해당 row에 대해 서브쿼리 실행해 결과가 존재하는지를 판단(TRUE/FALSE 여부)
존재한다면 TRUE가 되어 1번에서 출력된 메인 쿼리 row 출력

이때 주의점은 서브쿼리에서 TRUE가 되면 레코드가 출력되기 때문에 두 테이블에서 같은 값을 가져오려면 WHERE절로 조건을 주어야 한다.  


3. 1-2번의 과정을 반복하면서 결과 출력
>> NOT IN의 경우

NOT IN의 경우 모든 값과 일치하지 않는 값을 체크하여 반환한다.

(IN은 OR 이므로 서브쿼리 값 중 일치하는 임의의 값이 하나라도 있으면 반환하지만, 
NOT IN은 NOR(! AND)이 되어 모든 요소가 일치하지 않음을 확인)

이때 주의점은 NULL 값이 존재하면 비교연산 시 항상 UNKNOWN(FALSE) 값을 반환하기 때문에 확인이 불가능하다.

조건에 맞는 데이터가 있더라도 NULL이 존재하면 값이 제대로 반환되지 않음.

(따라서 NULL 처리를 하고 NOT IN을 사용하자.

NULL값이 있을 경우 IS NOT NULL의 조건을 WHERE절에 추가하자)
>> NOT EXISTS의 경우

NOT EXISTS의 경우 서브쿼리 내 값이 존재하지 않아야 -FALSE- 메인쿼리의 결과 출력

(EXIXTS 서브쿼리 내 값이 존재하면 -TRUE-  메인쿼리의 결과 출력)











 

 

즉, 정리하자면

  • (NOT) IN : 서브쿼리 먼저 실행 후 메인쿼리와 비교. 실제 데이터들의 모든 값을 비교하여 일치하는지 확인한다.
  • (NOT) EXISTS : 메인쿼리 먼저 실행 후 그 값을 서브쿼리와 비교. 해당 ROW 가 존재하는지만 확인하여, 서브쿼리가 TRUE 인지 FALSE인지를 체크한다.
  • NULL 과의 비교는 항상 UNKNOWN(FALSE) 값을 반환한다.

 

 

 

 

 


 

정리에 참고한 포스트들

 

 

[Oracle] IN, EXISTS, NOT IN, NOT EXISTS 특징 및 비교

다중 행(Multi Row) 서브쿼리 IN과 EXISTS 실행 순서 및 특징 1) IN : 실제 존재(일치)하는 데이터들의 모든 값까지 확인.① SubQuery를 먼저 실행하여 출력되는 그에 대한 모든 row가져옴(따라서 사실 IN뒤

hoon93.tistory.com

 

NOT IN과 NOT EXISTS의 차이점

이번달 퀴즈는 두가지 부정형 조인 NOT IN, NOT EXISTS 의 차이점을 설명하는것입니다. 문제...

blog.naver.com