programing

MySQL "NOT IN" 쿼리

shortcode 2022. 11. 24. 21:04
반응형

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

반응형