在SQL中,是否在SELECT之前或之后处理HAVING?
我惊讶地发现以下作品:
SELECT name, height * weight as inchpounds
FROM sashelp.class
HAVING inchpounds > 5000;
由于我认为HAVING子句严格在SELECT子句之前进行处理。这实际上是我的错误假设吗?还是这是SAS的SQL实现所特有的?
-
严格来说,如果我没有记错的话,SQL标准的define
HAVING
子句要在该SELECT
子句之前进行处理。因此,不能在inHAVING
子句中使用SELECT中定义的别名。
这是:FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY
因此,在大多数SQL版本中,该查询将产生错误。我知道MySQL是一个例外,它允许与标准的这种偏离(以及
SELECT
允许在GROUP BY
子句中使用别名的地方)。正如注释中提到的@a_horse_with_no_name一样,在大多数SQL产品中,查询也会由于其他原因而失败:这
HAVING
不GROUP BY
意味着所有行上都有聚合,因此在HAVING
和SELECT
子句中都只允许聚合函数。
在查看SAS
SQL文档和示例之后,看来您上面发布的查询在SAS
SQL中是有效的,并以此方式执行(在标准SQL中):SELECT name, height * weight AS inchpounds FROM sashelp.class WHERE height * weight > 5000;
如果我理解正确,您也可以将聚合函数与非聚合列混合使用,如下所示:
SELECT name, height, MAX(height) AS max_height FROM sashelp.class ;
将被评估为(在标准SQL中):
SELECT name, height, MAX(height) OVER () AS max_height FROM sashelp.class ;