[SQL] 왼쪽은 NULL이 WHERE IS 가입 대 NOT이 NOT IN 대 EXISTS 사이의 차이점은 무엇입니까?
SQL왼쪽은 NULL이 WHERE IS 가입 대 NOT이 NOT IN 대 EXISTS 사이의 차이점은 무엇입니까?
이 NOT IN 당신이 중 하나를 사용하여 SQL 쿼리에서 같은 일을 할 수있는 나에게 NOT 존재하는 것, 또는 LEFT는 NULL이 WHERE IS 가입. 예를 들면 :
SELECT a FROM table1 WHERE a NOT IN (SELECT a FROM table2)
SELECT a FROM table1 WHERE NOT EXISTS (SELECT * FROM table2 WHERE table1.a = table2.a)
SELECT a FROM table1 LEFT JOIN table2 ON table1.a = table2.a WHERE table1.a IS NULL
나는 모든 구문이 올바른 가지고 있는지 확실하지 않습니다, 그러나 이들은 내가 본 일반 기술이다. 이유는 다른 통해 하나를 사용하도록 선택할 것인가? 성능은 ... 차이가 있습니까? 이들 중 어느 하나가 가장 빠른 / 가장 효율적인가요? (이 구현에 의존하는 경우, 때 각 하나를 사용해야합니까?)
해결법
-
==============================
1.간단히 말해서 :
간단히 말해서 :
NOT IN 약간의 차이가 :이 있지만 경우 일치하지 목록에서 하나의 NULL.
-
==============================
2.데이터베이스가 좋은 쿼리를 최적화하는 경우, 두 사람은 먼저 세 번째 뭔가 가까이로 변환됩니다.
데이터베이스가 좋은 쿼리를 최적화하는 경우, 두 사람은 먼저 세 번째 뭔가 가까이로 변환됩니다.
당신이 문제가되는 것과 같은 단순한 상황의 경우, 조인으로 모두가 실행됩니다으로, 거의 또는 전혀 차이가있을 수 있습니다. 더 복잡한 쿼리에서 데이터베이스는이하지에 밖으로 가입 할 수 없습니다 및 queryes 존재하지 않을 수도 있습니다. 이 경우 쿼리가 많이 느린 얻을 것이다. 반면에, 당신이 사용하는, 그래서 그냥 때문에, 사용할 수있는 인덱스가없는 경우도 심하게 수행 할 수 조인 당신이 안전하다는 것을 의미하지 않는다 가입 할 수 있습니다. 당신은 어떤 성능 문제가있을 수 있습니다 경우 알려 쿼리의 실행 계획을 검토해야합니다.
-
==============================
3.당신이 널 (null)을 피하는 가정하면, 그들은 안티 조인을 사용하여 표준 SQL을 작성하는 모든 방법이 있습니다.
당신이 널 (null)을 피하는 가정하면, 그들은 안티 조인을 사용하여 표준 SQL을 작성하는 모든 방법이 있습니다.
명백한 누락 제외하고 사용하는 것과 동일합니다 :
SELECT a FROM table1 EXCEPT SELECT a FROM table2
오라클의 참고는 MINUS 연산자 (틀림없이 더 나은 이름)을 사용합니다 :
SELECT a FROM table1 MINUS SELECT a FROM table2
독점 구문의 말하기, 또한 비 표준 동등한 가치 조사는 예를 들어, 사용중인 제품에 따라있을 수 있습니다 OUTER는 SQL 서버에서 (같은)를 적용 :
SELECT t1.a FROM table1 t1 OUTER APPLY ( SELECT t2.a FROM table2 t2 WHERE t2.a = t1.a ) AS dt1 WHERE dt1.a IS NULL;
-
==============================
4.다중 필드 기본 키 테이블에 데이터를 삽입 할 필요가, 그것은 훨씬 더 빨리 될 것이라고 생각하는 경우, 즉 "하지 테이블 '과 같은'값으로 기록을 존재"확인하지 (내가 Access에서 시도했지만 나는 어떤 데이터베이스에서 생각) -이 아니라 단지 테이블에 삽입하고 (키에 의해)를 초과하는 기록을 두 번 삽입되지 않습니다.
다중 필드 기본 키 테이블에 데이터를 삽입 할 필요가, 그것은 훨씬 더 빨리 될 것이라고 생각하는 경우, 즉 "하지 테이블 '과 같은'값으로 기록을 존재"확인하지 (내가 Access에서 시도했지만 나는 어떤 데이터베이스에서 생각) -이 아니라 단지 테이블에 삽입하고 (키에 의해)를 초과하는 기록을 두 번 삽입되지 않습니다.
-
==============================
5.성능 관점은 항상 NOT IN과 같은 역 키워드를 사용하지 마십시오, NOT EXISTS, ... 사용 가능한 모든 통해 실행에 DBMS가 필요로하는 역 항목을 확인하고 역 선택을 드롭하기 때문입니다.
성능 관점은 항상 NOT IN과 같은 역 키워드를 사용하지 마십시오, NOT EXISTS, ... 사용 가능한 모든 통해 실행에 DBMS가 필요로하는 역 항목을 확인하고 역 선택을 드롭하기 때문입니다.
from https://stackoverflow.com/questions/2246772/whats-the-difference-between-not-exists-vs-not-in-vs-left-join-where-is-null by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 권장 SQL 데이터베이스 태그의 디자인 또는 태그 [마감] (0) | 2020.03.08 |
---|---|
[SQL] 첫번째 날짜 오름차순, 널 (null)에 의해 PostgreSQL의 종류? (0) | 2020.03.08 |
[SQL] 이 집계 함수 나 GROUP BY 절 중 하나에 포함되지 않기 때문에 열 이유는 선택 목록에서 유효하지 않습니다 [중복] (0) | 2020.03.08 |
[SQL] 단일 SQL 쿼리에서 여러 행을 삽입? [복제] (0) | 2020.03.08 |
[SQL] SQL 논리 연산자 우선 순위 : AND와 OR (0) | 2020.03.08 |