mysql - 为什么 mysql 将 NULL 值与 WHERE 条件中的任何字符串匹配?

标签 mysql

我有简单的 MySQL 表(针对这个问题进行了简化):

table A - id int, name varchar(255), id_b int
table B - id int, name varchar(255)

我在表 A 中有这些值:

1, 'a1', 10
2, 'a2', 11
3, 'a3', 12

我在表 B 中有这些值:

21, 'b1'
22, 'b2'
23, 'b3'

我有这个查询:

SELECT A.name, (SELECT B.name FROM B WHERE B.id = A.id_b) AS name_ext FROM  A WHERE name_ext = 'something';

我期望得到空结果,但相反,我从表 A 中得到了所有 3 行,其中 name_ext 的值为 NULL。这怎么可能 ?我应该怎么做才能获得预期的结果?

提前感谢您的帮助。

最佳答案

此查询运行正常。它等效于以下内容:

SELECT A.name, B.name 
FROM A
LEFT OUTER JOIN B ON B.id = A.id_b
WHERE A.name_ext = 'something'

如果没有匹配项,则外连接会将 B.* 中的所有列返回为 NULL。但是查询的结果对于A的每一行仍然有一行。

同样在您的版本中:

SELECT A.name, (SELECT B.name FROM B WHERE B.id = A.id_b) AS name_ext
FROM A WHERE name_ext = 'something';

不管怎样,主查询都会为 A 的每一行返回一行。 如果子查询在 B 中找到匹配项,则返回该匹配项。否则,如果找不到匹配项,查询仍会返回一行,并且 B 中缺少匹配项会在第二列中显示为 NULL。

如果您希望查询返回 在 B 中具有匹配项的行,请使用:

SELECT A.name, B.name 
FROM A
INNER JOIN B ON B.id = A.id_b
WHERE A.name_ext = 'something'

关于mysql - 为什么 mysql 将 NULL 值与 WHERE 条件中的任何字符串匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38793173/

相关文章:

php - 如何使用 Ajax for MYSQL 插入、编辑、删除、显示条目?

mysql - N-per-group 与 JOIN

php - 当 POST 字段为空时,将 NULL 插入外键

php - 如何使用 PHP/MYSQL 在单个查询中执行 SELECT 和 INSERT?

c++ - SQL连接和GUI问题

mysql - 使用 MySQL CURDATE() 和 CURTIME() 返回即将到来但未通过的结果

mysql - 每日基金数据表结构

javascript - 无法将 jQuery var 获取到 PHP

mysql - 以编程方式获取自动增量主键列

mysql - 升级到 MariaDB 5.5 后,连接在一段时间不活动后会被删除