我有简单的 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/