본문 바로가기
백엔드/SQLD

IN, NOT IN, EXISTS, NOT EXISTS에서 NULL의 동작

by 1005ptr 2020. 11. 11.
반응형

먼저 기억해야 할 것은 NULL을 비교연산했을때 결과는 항상 NULL이라는 것이다.

NULL을 조건절에 쓰고싶으면 IS NULL, IS NOT NULL을 써야한다.

http://www.silota.com/docs/recipes/sql-null-compare-sort-coalesce-joining.html

 

SQL's NULL values: comparing, sorting, converting and joining with real values · Advanced SQL · SILOTA

SQL Recipes Data Cleansing SQL's NULL values: comparing, sorting, converting and joining with real values SQL's NULL values: comparing, sorting, converting and joining with real values SQL's NULL value is a major point of confusion. The premise of NULL is

www.silota.com

1. IN, EXISTS

IN과 EXISTS는 인식에 큰 문제가 없다. 포함되는것만 나오니까.

설명하자면,

null값을 =로 비교하려고 하면 항상 false가 나온다. 그래서 null은 내부 쿼리에 널이 있든 없든 안나온다.

 

2. NOT IN

NOT IN 은 내부 쿼리의 모든 데이터에 대해서 같지 않음을 비교한다.
같지 않으면 true이고 모두 true가 나와야 not in을 만족하는 것

근데 null 비교 연산은 false가 나오니까 --> 같은게 있는거
IN 내부 쿼리에 null이 들어있으면 항상 같은게 있는게 된다. --> 아무것도 안나온다.

 

3. NOT EXISTS

NOT EXISTS는 외부 쿼리의 데이터를 하나하나 서브 쿼리로 돌려보는 것

내부 쿼리를 돌려 보니까 null이 들어가면 조건문이 false가 된다.

그래서 외부쿼리의 null도 출력된다.(내부쿼리의 데이터랑은 상관없음)

 

 

4. 공급자, 확인자

인터넷을 뒤지고 다니다 보니

외부 쿼리 IN 내부 쿼리 : 내부 쿼리가 외부 쿼리에 데이터를 공급한다 하여 내부 쿼리는 공급자 역할

외부 쿼리 EXISTS 내부 쿼리 : 외부 쿼리가 내부 쿼리에 데이터를 공급하기 때문에 내부 쿼리는 확인자 역할

 

5. IN과 EXISTS의 동작 방식

4번 설명을 보다 보니 IN과 EXISTS의 동작 방식도 알게 됐다.

  • IN
    • IN(내부 쿼리) --> IN('A', 'B', 'C') 식으로 외부 쿼리에 데이터를 공급하고 외부 쿼리는 공급 받은 데이터를 확인한다.
  • EXISTS
    • 외부 쿼리에서 데이터를 조회하여 EXISTS 내부 쿼리에 하나하나 공급해서 체크한다.
    • 두번째 링크에서 EXISTS는 외부쿼리 전체탐색이 발생한다는 설명이 있다.
    • 다른 글에서도 보면 NOT EXISTS 성능 문제로 NOT IN으로 갈아탔다는 설명이 있는걸로 보아 EXISTS에서 전체탐색이 되는게 성능을 떨어뜨리는것으로 생각된다.

https://wjheo.tistory.com/entry/IN%EA%B3%BC-NOT-IN%EC%9D%98-%ED%95%A8%EC%A0%95

 

IN과 NOT IN의 함정

1. IN 의 함정 -hobby가 null 이거나 '낚시'인 경우를 in을 이용하여 표현하면 다음과 같다. hobby in ( null, '낚시') hobby가 null 이거나 '낚시'인 row들이 선택될 것이라 기대하지만, 결과는 '낚시'인 경우만

wjheo.tistory.com

https://bencrow.tistory.com/entry/%EC%98%A4%EB%9D%BC%ED%81%B4%EC%97%90%EC%84%9C-not-exists-not-in-minus%EC%9D%98-%EC%84%B1%EB%8A%A5%EC%B0%A8%EC%9D%B4

 

오라클에서 not exists, not in, minus의 성능차이

이 문제는 오라클만의 문제가 아니고 거의 모든 RDBMS 제품들에 대해 공통적인 문제입니다. 일단 SQL 튜닝에서는 모든 상황에 항상 맞는 것은 없습니다. 즉, SQL 튜닝엔 왕도가 없다는 말입니다. 수

bencrow.tistory.com

 

반응형

'백엔드 > SQLD' 카테고리의 다른 글

제약조건[CHECK]  (0) 2020.11.22
제약조건[IDENTITY]  (0) 2020.11.22
GROUP BY, GROUPING SETS, ROLLUP, CUBE  (0) 2020.11.22
TRUNC, CEIL, FLOOR, ROUND  (0) 2020.11.18
NULLIF, COALESCE, NVL, NVL2, DECODE, CASE  (0) 2020.11.12

댓글