当前位置: 首页 > 面试题库 >

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

袁奇文
2023-03-14
问题内容

我惊讶地发现以下作品:

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

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


问题答案:

严格来说,如果我没有记错的话,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 ;


 类似资料:
  • 为什么可以在where子句中包含而只保留字母? 编辑1这里是解释:

  • 我非常精通编码,但偶尔我会遇到似乎做基本相同事情的代码。我在这里的主要问题是,为什么你会使用 .() 而不是 ? 我一直在寻找,似乎找不到两者之间区别的明确定义,以及何时使用它们,何时不使用它们。 一个比另一个有什么好处,为什么我要使用一个而不是另一个??有人能给我解释一下吗?

  • 问题内容: 我在sql中有一个普遍的疑问。实际上,“ Top 1 1”将做什么?以下查询的含义是什么? SQL Server查询中选择“ TOP 1 1”和“ SELECT 1”之间的区别是什么? 问题答案: 表示在结果集中选择第一条记录 平均值返回1作为结果集 表示如果条件为true,并且从select返回了任何行,则仅返回顶部行,并且仅返回该行的整数(仅返回整数1就没有数据)。

  • 问题内容: 在Java 7的try-with-resources中,我不知道finally块和自动关闭发生的顺序。什么顺序 问题答案: 资源在捕获或最终阻塞之前被关闭。请参阅本教程。 try-with-resources语句可以具有catch并最终阻塞,就像普通的try语句一样。在try-with- resources语句中,在声明的资源已关闭之后,将运行任何catch或finally块。 要评估

  • 问题内容: 我希望通过外部服务为我的路由创建简单的身份验证检查。 我在路由对象上定义访问要求: 然后,我检查我是否有权参加活动。 实际上,它是可行的- 如果未通过身份验证的用户将其移至登录页面,如果已通过身份验证但该路由仅适用于匿名用户,则将其移至另一个页面,依此类推。 但是-这种重定向实际上是在加载控制器和模板之后发生的! 即使我未经身份验证,它也会导致我的控制器对我的REST API进行一些不

  • 在使用Hibernate和Jpa的spring boot应用程序中,我需要在saveAll()之前关闭select,以提高高记录数的性能。 我找到了一个使用JPQL的方法,性能很好(在30s内删除+保存10k条记录),但我希望继续使用hibernate和JPA。 我的期望是,当我运行用Java编写的代码时,我必须删除一个表的所有记录,然后保存另一个表的所有记录。当我以经典的方式(deleteAll