首页 >数据库 >mysql教程 >为什么 MySQL 的'NOT IN”会因空子查询而失败?

为什么 MySQL 的'NOT IN”会因空子查询而失败?

Linda Hamilton
Linda Hamilton原创
2024-12-29 15:48:12728浏览

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

对三个表进行 MySQL“NOT IN”查询

在您的查询中,您已包含条件 Grade.ID_Courses NOT IN ( SELECT ID_Courses FROM Evaluation WHERE NAME='JOHN' and Year=1) 以过滤掉成绩表中的行评估表中不存在具有相同名称和年份值的项目。但是,当评估表中不存在名称“JOHN”时,查询不会产生输出。

为什么 NOT IN 会很麻烦

一个限制在子查询中使用 NOT IN 的一个原因是,当子查询之一包含 NULL 值时,它容易出现不一致。这是因为 SQL 采用三值逻辑,其中 NULL 表示未知或缺失值。当 NOT IN 应用于可能包含 NULL 值的子查询时,结果可能会变得不可预测或不正确。

NOT IN 的替代方案

缓解这些问题,建议避免对可能包含 NULL 值的子查询使用 NOT IN。相反,可以使用更可靠的替代方案,例如 NOT EXISTS 或显式联接。

例如,您可以使用 NOT EXISTS 运算符重写查询,如下所示:

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;

使用显式联接正如所提供的解决方案中所建议的,代替 WHERE 子句还可以提高查询的性能和可读性。

以上是为什么 MySQL 的'NOT IN”会因空子查询而失败?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn