Hello! 欢迎来到小浪云!


SQL语句中,having子句是在select子句之前执行的吗?


avatar
小浪云 2024-11-11 68

SQL语句中,having子句是在select子句之前执行的吗?

sql语句select和having子句的执行顺序

对于sql语句中select和having子句的执行顺序,说法不一。有观点认为先执行select,然后再执行having。然而,在本文中,我们将讨论另一种观点,即先执行having子句,再执行select。

举个例子,有一张表,包含以下数据:

id num
1 20
2 30
3 40

如果我们执行以下sql语句:

SELECT sum(num) AS all_num FROM table_name GROUP BY id HAVING all_num > 50
登录后复制

按照上述观点,执行顺序如下:

  1. 执行having子句:对分组求和后的结果进行过滤,过滤出总和小于50的行,舍弃这些行。
  2. 执行select子句:从剩余行中选择出求和后的总和。

因此,在上面的示例中,id为1和2的行将被舍弃,因为它们的总和分别为20和30,小于50。只有id为3的行保留,因为它的总和为40,大于50。最终,select子句返回的结果为[40]。

这个顺序可能看起来有些违反直觉,因为似乎select子句应该在having子句之前执行,以提供过滤所需的输入。然而,在sql中,having子句实际上是在select子句(如果存在)执行之前执行的。这种执行顺序对于确保having子句只作用于聚合结果(例如,sum(num))而不是原始数据非常重要。

相关阅读