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

时间:2016-08-05 15:46:14

标签: 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 beeing NULL。这怎么可能 ?我该怎么做才能得到预期的结果?

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

此查询的行为正确。它等同于以下内容:

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'

答案 1 :(得分:0)

您的查询会收到一条错误消息。因为MySQL会理解你是按表A中的name_ext列过滤的。

无论如何,您可以使用内部联接查询来获得预期结果。

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

希望这对你有用。