gpt4 book ai didi

sql - 在 SQL 中,HAVING 是在 SELECT 之前还是之后处理?

转载 作者:行者123 更新时间:2023-12-03 22:53:20 26 4
gpt4 key购买 nike

我惊讶地发现以下有效:

    SELECT name, height * weight as inchpounds
FROM sashelp.class
HAVING inchpounds > 5000;

因为我认为 HAVING 子句是在 SELECT 子句之前严格处理的。这实际上是我的错误假设吗?或者这是SAS对SQL的实现所特有的?

最佳答案

严格来说,如果我没记错的话,SQL 标准定义了要在 HAVING 子句之前处理的 SELECT 子句。因此,在 SELECT 中定义的别名不能在 HAVING 子句中使用。

有关处理 SELECT 语句的顺序,请参阅我在相关问题中的回答: Using 'case expression column' in where clause ,即:

FROM -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY 

因此,在大多数 SQL 版本中,该查询将产生错误。 MySQL 是我知道的一个异常(exception),它允许这种与标准的偏差(并且在 SELECT 子句中也允许使用 GROUP BY 别名)。

正如评论中提到的@a_horse_with_no_name,大多数 SQL 产品中的查询也会由于另一个原因而失败:没有 HAVINGGROUP BY 意味着对所有行进行聚合,因此在 HAVINGSELECT 子句中只允许使用聚合函数。

查看 SAS SQL documentation and examples 后,您上面发布的查询似乎在 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 ;

关于sql - 在 SQL 中,HAVING 是在 SELECT 之前还是之后处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14123485/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com