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