对于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
登录后复制
按照上述观点,执行顺序如下:
- 执行having子句:对分组求和后的结果进行过滤,过滤出总和小于50的行,舍弃这些行。
- 执行select子句:从剩余行中选择出求和后的总和。
因此,在上面的示例中,id为1和2的行将被舍弃,因为它们的总和分别为20和30,小于50。只有id为3的行保留,因为它的总和为40,大于50。最终,select子句返回的结果为[40]。
这个顺序可能看起来有些违反直觉,因为似乎select子句应该在having子句之前执行,以提供过滤所需的输入。然而,在sql中,having子句实际上是在select子句(如果存在)执行之前执行的。这种执行顺序对于确保having子句只作用于聚合结果(例如,sum(num))而不是原始数据非常重要。