먼저 기억해야 할 것은 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
오라클에서 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 |
댓글