sql語句中select和having子句的執(zhí)行順序
對于sql語句中select和having子句的執(zhí)行順序,說法不一。有觀點認(rèn)為先執(zhí)行select,然后再執(zhí)行having。然而,在本文中,我們將討論另一種觀點,即先執(zhí)行having子句,再執(zhí)行select。
舉個例子,有一張表,包含以下數(shù)據(jù):
id | num |
---|---|
1 | 20 |
2 | 30 |
3 | 40 |
如果我們執(zhí)行以下sql語句:
SELECT sum(num) AS all_num FROM table_name GROUP BY id HAVING all_num > 50
登錄后復(fù)制
按照上述觀點,執(zhí)行順序如下:
- 執(zhí)行having子句:對分組求和后的結(jié)果進(jìn)行過濾,過濾出總和小于50的行,舍棄這些行。
- 執(zhí)行select子句:從剩余行中選擇出求和后的總和。
因此,在上面的示例中,id為1和2的行將被舍棄,因為它們的總和分別為20和30,小于50。只有id為3的行保留,因為它的總和為40,大于50。最終,select子句返回的結(jié)果為[40]。
這個順序可能看起來有些違反直覺,因為似乎select子句應(yīng)該在having子句之前執(zhí)行,以提供過濾所需的輸入。然而,在sql中,having子句實際上是在select子句(如果存在)執(zhí)行之前執(zhí)行的。這種執(zhí)行順序?qū)τ诖_保having子句只作用于聚合結(jié)果(例如,sum(num))而不是原始數(shù)據(jù)非常重要。