SQL

在SQL中,是否在SELECT之前或之后处理HAVING?

发布于 2021-04-20 22:42:20

我惊讶地发现以下作品:

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

由于我认为HAVING子句严格在SELECT子句之前进行处理。这实际上是我的错误假设吗?还是这是SAS的SQL实现所特有的?

关注者
0
被浏览
61
1 个回答
  • 面试哥
    面试哥 2021-04-20
    为面试而生,有面试问题,就找面试哥。

    严格来说,如果我没有记错的话,SQL标准的defineHAVING子句要在该SELECT子句之前进行处理。因此,不能在inHAVING子句中使用SELECT中定义的别名。
    这是:

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

    因此,在大多数SQL版本中,该查询将产生错误。我知道MySQL是一个例外,它允许与标准的这种偏离(以及SELECT允许在GROUP BY子句中使用别名的地方)。

    正如注释中提到的@a_horse_with_no_name一样,在大多数SQL产品中,查询也会由于其他原因而失败:这HAVINGGROUP BY意味着所有行上都有聚合,因此在HAVINGSELECT子句中都只允许聚合函数。


    在查看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 ;
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看