먼저 기억해야 할 것은 NULL을 비교연산했을때 결과는 항상 NULL이라는 것이다.
NULL을 조건절에 쓰고싶으면 IS NULL, IS NOT NULL을 써야한다.
http://www.silota.com/docs/recipes/sql-null-compare-sort-coalesce-joining.html
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
'백엔드 > 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 |
댓글