집 >데이터 베이스 >MySQL 튜토리얼 >MySQL의 'NOT IN'이 세 개의 테이블과 NULL로 인해 실패하는 이유는 무엇이며 더 나은 대안은 무엇입니까?
세 테이블 작업 시 쿼리에 "NOT IN" 연산자 사용 특히 NULL 값을 처리할 때 문제가 될 수 있습니다. 이 문서에서는 "NOT IN" 사용과 관련된 위험을 설명하고 대체 솔루션을 제안합니다.
제공된 쿼리는 Grade와 Grade라는 두 테이블을 비교합니다. 평가, 평가에 없는 등급 기록을 식별합니다. 그러나 지정된 이름("JOHN")이 평가에 없는 경우 쿼리는 어떤 출력도 반환하지 못합니다.
이 문제를 해결하려면 , 데이터 필터링에 사용된 하위 쿼리에 NULL 값이 포함될 수 있는 경우 "NOT IN"을 사용하지 마세요. 대신 "NOT EXISTS" 또는 왼쪽 조인을 사용하는 것을 고려해 보세요.
"NOT IN" 사용의 잠재적인 위험을 살펴보겠습니다.
다음을 사용하여 mStatus 및 people 테이블을 만듭니다. 샘플 데이터:
create table mStatus ( id int auto_increment primary key, status varchar(10) not null ); insert mStatus (status) values ('single'),('married'),('divorced'),('widow'); create table people ( id int auto_increment primary key, fullName varchar(100) not null, status varchar(10) null );
Chunk1:
truncate table people; insert people (fullName,`status`) values ('John Henry','single'); select * from mstatus where `status` not in (select status from people);
예상 출력: 3행
Chunk2:
truncate table people; insert people (fullName,`status`) values ('John Henry','single'),('Kim Billings',null); select * from mstatus where status not in (select status from people);
예기치 않은 출력: 0행
다음으로 인해 두 번째 청크가 예기치 않게 행을 반환하지 않습니다. SQL의 세 가지 값 논리. 하위 쿼리에 NULL 값이 포함된 경우 "NOT IN" 표현식이 UNKNOWN으로 평가되어 모든 행이 필터링될 수 있습니다.
이 문제를 해결하려면 문제가 발생하면 "LEFT JOIN" 또는 "NOT"을 사용하세요. EXISTS":
select s.status from mstatus s left join people p on p.status=s.status where p.status is null
select s.status from mstatus s where not exists (select 1 from people where people.status=s.status)
이러한 대체 솔루션은 NULL 값을 올바르게 처리하고 원하는 출력을 제공합니다.
위 내용은 MySQL의 'NOT IN'이 세 개의 테이블과 NULL로 인해 실패하는 이유는 무엇이며 더 나은 대안은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!