최신 정보:
내 블로그의이 기사에서는 메소드 간의 차이점에 대해 자세히 설명합니다.
이러한 쿼리를 수행하는 세 가지 방법이 있습니다.
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_idNull을 허용하지 않습니다, 모든 쿼리는 의미 적으로 동일합니다.
Null을 허용 하는 경우 값이을 포함하는 목록의 값과 일치하지 않으면을 반환 하기 때문에 NOT IN달라 집니다.INNOT INNULLNULL
이것은 혼란 스러울 수 있지만 이에 대한 대체 구문을 기억하면 더 분명해질 수 있습니다.
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서브 쿼리 해시에 너무 큰 경우)