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 중국어 웹사이트의 기타 관련 기사를 참조하세요!