MySQL "NOT IN" 쿼리
간단한 쿼리를 실행하여 모든 행을 토해내고 싶었습니다.Table1
다른 표의 열에 주 열 값이 없는 경우(Table2
).
다음을 사용해 보았습니다.
SELECT * FROM Table1 WHERE Table1.principal NOT IN Table2.principal
이것은 구문 오류를 발생시키는 것입니다.구글 검색은 MySQL이 지원하지 않는다고 사람들이 말하는 포럼으로 이끌었다.NOT IN
아주 복잡한 것을 사용해야 합니다.정말이에요?아니면 제가 끔찍한 실수를 하고 있는 건가요?
IN 을 사용하려면 , 세트가 필요합니다.대신 다음 구문을 사용합니다.
SELECT * FROM Table1 WHERE Table1.principal NOT IN (SELECT principal FROM table2)
서브쿼리 옵션은 이미 응답되어 있습니다만, 많은 경우,LEFT JOIN
보다 빠른 방법이 될 수 있습니다.
SELECT table1.*
FROM table1 LEFT JOIN table2 ON table2.principal=table1.principal
WHERE table2.principal IS NULL
여러 테이블을 체크하여 SRKR 코멘트처럼 테이블에 존재하지 않는지 확인하려면 다음을 사용합니다.
SELECT table1.*
FROM table1
LEFT JOIN table2 ON table2.name=table1.name
LEFT JOIN table3 ON table3.name=table1.name
WHERE table2.name IS NULL AND table3.name IS NULL
없음 vs. 존재하지 않음 vs. 왼쪽 조인 / MySQL의 특수한 순서
MySQL 및 SQL Server를 제외한 다른 모든 시스템은 최적화/반환 가능
FALSE
일치하는 값이 발견되면 이 동작을 문서화하는 유일한 시스템입니다.[…] MySQL은 사용할 수 없기 때문에HASH
그리고.MERGE
결합 알고리즘, 유일한ANTI JOIN
그것은 할 수 있다NESTED LOOPS ANTI JOIN
[…]
본질적으로 []
NOT IN
는 다음 계획과 동일합니다.LEFT JOIN
/IS NULL
이러한 계획이 코드의 서로 다른 분기에 의해 실행된다는 사실에도 불구하고, 그리고 그것들은 결과에서 다르게 보입니다.EXPLAIN
알고리즘은 실제로 동일하며 쿼리는 동시에 완료됩니다.
[…]
[사용 시 성능 저하]의 정확한 원인은 알 수 없습니다.이러한 감소는 선형이며 데이터 분포, 양쪽 테이블의 값 수 등에 의존하지 않는 것 같기 때문입니다.MySQL에는 기본적으로 1개의 작업을 수행하는 3개의 코드가 있기 때문에, 그 코드는 다음과 같은 역할을 할 수 있습니다.
EXISTS
시간이 더 걸리는 일종의 추가 수표를 만들죠
[…]
MySQL은 세 가지 방법을 모두 최적화하여
NESTED LOOPS ANTI JOIN
. [ ... ] 그러나 이 세 가지 방법에서는 세 가지 다른 코드에 의해 실행되는 세 가지 다른 계획이 생성됩니다.실행하는 코드EXISTS
술어는 효율이 약 30% 저하됩니다.[ … ]그렇기 때문에 MySQL에서 결측값을 검색하는 가장 좋은 방법은 / 또는 를 사용하는 것입니다.
(추가 완료)
NOT IN
.<> ANY
, ★★★★★★★★★★★★★의 경우는,<> ALL
!
http://dev.mysql.com/doc/refman/5.0/en/any-in-some-subqueries.html
SELECT c FROM t1 LEFT JOIN t2 USING (c) WHERE t2.c IS NULL
대체할 수 없다
SELECT c FROM t1 WHERE c NOT IN (SELECT c FROM t2)
를 사용해야 합니다.
SELECT c FROM t1 WHERE c <> ANY (SELECT c FROM t2)
안타깝게도 MySql에서 "NOT IN" 절을 사용하는 데 문제가 있는 것 같습니다. 아래 스크린샷은 잘못된 결과를 반환하는 하위 쿼리 옵션을 보여 줍니다.
mysql> show variables like '%version%';
+-------------------------+------------------------------+
| Variable_name | Value |
+-------------------------+------------------------------+
| innodb_version | 1.1.8 |
| protocol_version | 10 |
| slave_type_conversions | |
| version | 5.5.21 |
| version_comment | MySQL Community Server (GPL) |
| version_compile_machine | x86_64 |
| version_compile_os | Linux |
+-------------------------+------------------------------+
7 rows in set (0.07 sec)
mysql> select count(*) from TABLE_A where TABLE_A.Pkey not in (select distinct TABLE_B.Fkey from TABLE_B );
+----------+
| count(*) |
+----------+
| 0 |
+----------+
1 row in set (0.07 sec)
mysql> select count(*) from TABLE_A left join TABLE_B on TABLE_A.Pkey = TABLE_B.Fkey where TABLE_B.Pkey is null;
+----------+
| count(*) |
+----------+
| 139 |
+----------+
1 row in set (0.06 sec)
mysql> select count(*) from TABLE_A where NOT EXISTS (select * FROM TABLE_B WHERE TABLE_B.Fkey = TABLE_A.Pkey );
+----------+
| count(*) |
+----------+
| 139 |
+----------+
1 row in set (0.06 sec)
mysql>
언급URL : https://stackoverflow.com/questions/1519272/mysql-not-in-query
'programing' 카테고리의 다른 글
서로 다른 타이밍에 서로 다른 파라미터별로 목록을 정렬하려면 어떻게 해야 합니까? (0) | 2022.11.24 |
---|---|
한 데이터베이스에서 포함된 테이블을 복사하고 다른 데이터베이스 테이블에 삽입하려고 합니다. (0) | 2022.11.24 |
Vuetify로 달력 보기 구성 요소에서 본문 제목 월 및 연도 요소를 제거합니다. (0) | 2022.11.24 |
MySQL의 참/거짓 vs 0/1 (0) | 2022.11.24 |
@InjectMocks 클래스의 메서드를 조롱하려면 어떻게 해야 합니까? (0) | 2022.11.24 |