최신 정보:
내 블로그의이 기사에서는 메소드 간의 차이점에 대해 자세히 설명합니다.
이러한 쿼리를 수행하는 세 가지 방법이 있습니다.
LEFT JOIN / IS NULL
:
SELECT *
FROM common
LEFT JOIN
table1 t1
ON t1.common_id = common.common_id
WHERE t1.common_id IS NULL
NOT EXISTS
:
SELECT *
FROM common
WHERE NOT EXISTS
(
SELECT NULL
FROM table1 t1
WHERE t1.common_id = common.common_id
)
NOT IN
:
SELECT *
FROM common
WHERE common_id NOT IN
(
SELECT common_id
FROM table1 t1
)
때 table1.common_id
Null을 허용하지 않습니다, 모든 쿼리는 의미 적으로 동일합니다.
Null을 허용 하는 경우 값이을 포함하는 목록의 값과 일치하지 않으면을 반환 하기 때문에 NOT IN
달라 집니다.IN
NOT IN
NULL
NULL
이것은 혼란 스러울 수 있지만 이에 대한 대체 구문을 기억하면 더 분명해질 수 있습니다.
common_id = ANY
(
SELECT common_id
FROM table1 t1
)
이 조건의 결과는 목록 내 모든 비교의 부울 곱입니다. 물론 단일 NULL
값은NULL
전체 결과 NULL
도 렌더링되는 결과가 생성 됩니다.
우리는 결코 그렇게 말할 수 없습니다 common_id
값 중 적어도 하나가이 (가)이므로이 목록의 내용과 동일 는 없습니다 NULL
.
다음과 같은 데이터가 있다고 가정하십시오.
common
--
1
3
table1
--
NULL
1
2
LEFT JOIN / IS NULL
및 NOT EXISTS
반환 3
, NOT IN
반환하지 않습니다 아무것도 항상 하나를로 평가하기 때문에 (FALSE
또는 NULL
).
에서 MySQL
, 비 - 널 열의 경우에, LEFT JOIN / IS NULL
그리고 NOT IN
보다 약간 (수 퍼센트)을보다 효율적NOT EXISTS
. 열이 널 입력 가능 NOT EXISTS
하면 가장 효율적입니다 (다수는 아님).
에서 Oracle
세 쿼리 모두 동일한 계획 ( ANTI JOIN
)을 생성합니다.
에서 SQL Server
, NOT IN
/ NOT EXISTS
때문에 더 효율적 LEFT JOIN / IS NULL
에 최적화되지 않을 수 ANTI JOIN
의 최적화.
에서 PostgreSQL
, LEFT JOIN / IS NULL
그리고 NOT EXISTS
보다 더 효율적이다 NOT IN
, 그들이가에 최적화 된 사인 인 Anti Join
반면, NOT IN
사용 hashed subplan
(또는 일반은 subplan
서브 쿼리 해시에 너무 큰 경우)