>데이터 베이스 >MySQL 튜토리얼 >SQL 쿼리에서 NOT IN 대신 NOT EXISTS 또는 명시적 조인을 사용하는 이유는 무엇입니까?

SQL 쿼리에서 NOT IN 대신 NOT EXISTS 또는 명시적 조인을 사용하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2025-01-03 21:15:08276검색

Why Use NOT EXISTS or Explicit Joins Instead of NOT IN in SQL Queries?

SQL 쿼리에서 "NOT IN"의 위험성

한 테이블의 데이터가 다른 테이블에 존재하지 않는지 확인하는 쿼리를 시도할 때 , "NOT IN" 연산자는 특히 null을 처리할 때 예상치 못한 결과를 초래할 수 있습니다.

"NOT IN" 문제

제공된 쿼리에서 "NOT IN" 절은 하위 쿼리의 결과를 "ID_Courses" 열과 비교합니다. "등급" 테이블에서:

Grade.ID_Courses NOT IN (SELECT ID_Courses FROM Evaluation WHERE NAME='JOHN' and Year=1)

하위 쿼리가 null 값을 반환하는 경우 "NOT IN" 절은 "Year" 1의 지정된 "JOHN" 레코드가 "Grade" 테이블에 존재하는 경우에도 false로 평가됩니다. 이는 SQL의 세 값 논리가 null을 "알 수 없음"으로 해석하여 잘못된 평가로 이어지기 때문입니다.

"NOT IN"에 대한 대안

이 문제를 방지하려면 , NOT EXISTS 또는 명시적 조인과 같은 대체 방법을 사용하는 것이 좋습니다.

NOT 존재

SELECT Grade.ID_Courses, Course.ID_Courses, Grade.NAME, 
    Course.NAME, Grade.ID_Courses,
    Evaluation.NAME,
    Evaluation.Year,    
    Grade.Year
    from Grade
    LEFT JOIN Course ON Grade.ID_Courses=Course.ID_Courses
    LEFT JOIN Evaluation ON Grade.NAME=Evaluation.NAME AND GRADE.YEAR = Evaluation.YEAR
    WHERE 
    Grade.NAME='JOHN' and 
    Evaluation.NAME IS NULL
    GROUP BY Grade.ID_Courses

명시적 조인

SELECT Grade.ID_Courses, Course.ID_Courses, Grade.NAME, 
    Course.NAME, Grade.ID_Courses,
    Evaluation.NAME,
    Evaluation.Year,    
    Grade.Year
    from Grade
    LEFT JOIN Course ON Grade.ID_Courses=Course.ID_Courses
    LEFT JOIN Evaluation ON Grade.NAME=Evaluation.NAME AND GRADE.YEAR = Evaluation.YEAR
    WHERE 
    Grade.NAME='JOHN' and 
    NOT (Evaluation.NAME IS NOT NULL)
    GROUP BY Grade.ID_Courses

이러한 대안을 사용하면 쿼리가 지정된 데이터가 없는 레코드를 정확하게 식별하도록 할 수 있습니다. null 값의 존재 여부에 관계없이 다른 테이블에 존재합니다.

위 내용은 SQL 쿼리에서 NOT IN 대신 NOT EXISTS 또는 명시적 조인을 사용하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.