ホームページ >データベース >mysql チュートリアル >MySQL の「NOT IN」が空のサブクエリで失敗するのはなぜですか?

MySQL の「NOT IN」が空のサブクエリで失敗するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-29 15:48:12736ブラウズ

Why Does MySQL's `NOT IN` Fail with Empty Subqueries?

3 つのテーブルに対する MySQL "NOT IN" クエリ

クエリに、条件 Grade.ID_Courses NOT IN ( SELECT ID_Courses FROM Evaluation WHERE NAME='JOHN' and Year=1) をフィルタリングして除外します同じ NAME と Year 値を持つ、評価テーブルに存在しない、グレード テーブルの行。ただし、「JOHN」という名前が評価テーブルに存在しない場合、クエリは出力を生成しません。

なぜ NOT IN が問題になるのか

制限が 1 つありますサブクエリで NOT IN を使用すると、サブクエリの 1 つに NULL 値が含まれる場合に不整合が発生しやすくなります。これは、SQL が 3 値ロジックを採用しており、NULL は未知の値または欠損値を表すためです。 NULL 値を含む可能性のあるサブクエリに NOT IN を適用すると、結果が予測不能になったり不正確になる可能性があります。

SELECT Grade.ID_Courses,
       Course.ID_Courses,
       Grade.NAME,
       Course.NAME,
       Grade.ID_Courses,
       Evaluation.NAME,
       Evaluation.Year,
       Grade.Year
FROM Grade
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 Grade.Year = 1
  AND Evaluation.NAME IS NULL;

NOT IN の代替手段これらの問題を軽減するには、NULL 値を含む可能性のあるサブクエリでは NOT IN を使用しないことをお勧めします。代わりに、NOT EXISTS や明示的な結合など、より信頼性の高い代替手段を使用できます。たとえば、次のように NOT EXISTS 演算子を使用してクエリを書き直すことができます。明示的な結合の使用提供されたソリューションで提案されているように、WHERE 句の代わりにクエリのパフォーマンスと読みやすさを向上させることもできます。

以上がMySQL の「NOT IN」が空のサブクエリで失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。