为什么要将HAVING子句中的比较从'='更改为'<'没有匹配时更改输出?

时间:2015-07-02 05:14:43

标签: mysql

在以下查询中,将HAVING子句中的比较运算符从“=”更改为“<”当查询返回时,没有结果更改输出,以便返回1行(所有NULL)或没有返回行。

有人可以解释为什么这种行为如证明的那样?理想情况下,我希望第一个查询返回0行,但如果不将它包装在另一个查询中以排除NULL,那将会很好。

查询:

SELECT `templates`.* 
FROM `templates` 
INNER JOIN `items` ON `items`.`template_id` = `templates`.`id` 
HAVING COUNT(items.id) = 0

结果:

NULL,NULL,NULL...
(1 row(s) returned)

与之相比:

查询:

SELECT `templates`.* 
FROM `templates` 
INNER JOIN `items` ON `items`.`template_id` = `templates`.`id` 
HAVING COUNT(items.id) < 0

结果:

(0 row(s) returned)

但是,HAVING COUNT(items.id) < 1的这种变化会返回NULL行:

查询:

SELECT `templates`.* 
FROM `templates` 
INNER JOIN `items` ON `items`.`template_id` = `templates`.`id` 
HAVING COUNT(items.id) < 1

结果:

NULL,NULL,NULL...
(1 row(s) returned)

1 个答案:

答案 0 :(得分:1)

简单,count()函数永远不会返回负数。您的情况是having count(items.id) < 0,这意味着having 0 < 0始终是false。但是having count(items.id)=0可以是真实的意思,或count(items.id)<1可以是真的意味着0 = 0或0 <1是真的。

mysql> select 1 from test  having count(id)=0;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.29 sec)

mysql> select 1 from test having count(id)<0;
Empty set (0.00 sec)