基本上是因为它们是出于不同目的而定义的。该WHERE
子句用于记录过滤,该HAVING
子句设计用于通过 (GROUP BY
)进行过滤。在第二个查询中,GROUP BY
正在使用隐式过滤,因此,例如,如果将另一列添加到SELECT
子句中,最终将得到不同的结果。
基于马丁·史密斯(Martin Smith)的更正
HAVING
创建允许过滤产生的行GROUP BY
。如果未GROUP BY
指定no ,则将整个结果视为一个组。
如果既未指定a<where clause>
也未<group by clause>
指定a,则令T为前一个的结果<from clause>
或者
…如果未<group by clause>
指定,则该组为整个表格
现在关于ALIAS:
有关搜索条件中列引用的WHERE子句的规范说:
<column reference>
直接包含在中的每个<search condition>
应明确引用T 或作为外部引用。
请参阅:7.6<where clause>
,语法规则1。
有关搜索条件中列引用的HAVING子句的规范说:
<column reference>
直接包含在中的 每个<search condition>
应明确引用T 或作为外部引用。
请参阅:7.8<having clause>
,语法规则1。
和 被定义为:
在a中引用的列<group by clause>
是分组列。
因此,总而言之,WHERE
必须引用表的一列,而HAVING
子句必须引用行组的分组列。