>데이터 베이스 >MySQL 튜토리얼 >MySQL의 'NOT IN'이 세 개의 테이블과 NULL로 인해 실패하는 이유는 무엇이며 더 나은 대안은 무엇입니까?

MySQL의 'NOT IN'이 세 개의 테이블과 NULL로 인해 실패하는 이유는 무엇이며 더 나은 대안은 무엇입니까?

DDD
DDD원래의
2024-12-31 05:49:091027검색

Why Does MySQL's

MySQL “NOT IN” 쿼리 세 테이블

세 테이블 작업 시 쿼리에 "NOT IN" 연산자 사용 특히 NULL 값을 처리할 때 문제가 될 수 있습니다. 이 문서에서는 "NOT IN" 사용과 관련된 위험을 설명하고 대체 솔루션을 제안합니다.

문제

제공된 쿼리는 Grade와 Grade라는 두 테이블을 비교합니다. 평가, 평가에 없는 등급 기록을 식별합니다. 그러나 지정된 이름("JOHN")이 평가에 없는 경우 쿼리는 어떤 출력도 반환하지 못합니다.

솔루션

이 문제를 해결하려면 , 데이터 필터링에 사용된 하위 쿼리에 NULL 값이 포함될 수 있는 경우 "NOT IN"을 사용하지 마세요. 대신 "NOT EXISTS" 또는 왼쪽 조인을 사용하는 것을 고려해 보세요.

"NOT IN" 사용의 잠재적인 위험을 살펴보겠습니다.

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

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