對于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))而不是原始數據非常重要。