복붙노트

[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. ==============================

    1.간단히 말해서 :

    간단히 말해서 :

    NOT IN 약간의 차이가 :이 있지만 경우 일치하지 목록에서 하나의 NULL.

  2. ==============================

    2.데이터베이스가 좋은 쿼리를 최적화하는 경우, 두 사람은 먼저 세 번째 뭔가 가까이로 변환됩니다.

    데이터베이스가 좋은 쿼리를 최적화하는 경우, 두 사람은 먼저 세 번째 뭔가 가까이로 변환됩니다.

    당신이 문제가되는 것과 같은 단순한 상황의 경우, 조인으로 모두가 실행됩니다으로, 거의 또는 전혀 차이가있을 수 있습니다. 더 복잡한 쿼리에서 데이터베이스는이하지에 밖으로 가입 할 수 없습니다 및 queryes 존재하지 않을 수도 있습니다. 이 경우 쿼리가 많이 느린 얻을 것이다. 반면에, 당신이 사용하는, 그래서 그냥 때문에, 사용할 수있는 인덱스가없는 경우도 심하게 수행 할 수 조인 당신이 안전하다는 것을 의미하지 않는다 가입 할 수 있습니다. 당신은 어떤 성능 문제가있을 수 있습니다 경우 알려 쿼리의 실행 계획을 검토해야합니다.

  3. ==============================

    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. ==============================

    4.다중 필드 기본 키 테이블에 데이터를 삽입 할 필요가, 그것은 훨씬 더 빨리 될 것이라고 생각하는 경우, 즉 "하지 테이블 '과 같은'값으로 기록을 존재"확인하지 (내가 Access에서 시도했지만 나는 어떤 데이터베이스에서 생각) -이 아니라 단지 테이블에 삽입하고 (키에 의해)를 초과하는 기록을 두 번 삽입되지 않습니다.

    다중 필드 기본 키 테이블에 데이터를 삽입 할 필요가, 그것은 훨씬 더 빨리 될 것이라고 생각하는 경우, 즉 "하지 테이블 '과 같은'값으로 기록을 존재"확인하지 (내가 Access에서 시도했지만 나는 어떤 데이터베이스에서 생각) -이 아니라 단지 테이블에 삽입하고 (키에 의해)를 초과하는 기록을 두 번 삽입되지 않습니다.

  5. ==============================

    5.성능 관점은 항상 NOT IN과 같은 역 키워드를 사용하지 마십시오, NOT EXISTS, ... 사용 가능한 모든 통해 실행에 DBMS가 필요로하는 역 항목을 확인하고 역 선택을 드롭하기 때문입니다.

    성능 관점은 항상 NOT IN과 같은 역 키워드를 사용하지 마십시오, NOT EXISTS, ... 사용 가능한 모든 통해 실행에 DBMS가 필요로하는 역 항목을 확인하고 역 선택을 드롭하기 때문입니다.

  6. 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