sql語句中到底是先執(zhí)行select子句還是having子句?以如下示例代碼為例:
select SUM(num) AS all_num FROM table GROUP BY id HAVING all_num > 50;
登錄后復(fù)制
傳統(tǒng)的說法是先執(zhí)行having子句后執(zhí)行select子句,但該說法似乎與本例不符,因?yàn)閟elect子句中定義了”sum(num) as all_num”,似乎應(yīng)該先執(zhí)行select子句才能獲取用于having比較的all_num。
解答:
實(shí)際上,select子句在該例中的作用并不是操作數(shù)據(jù),而是對(duì)having子句篩選后的結(jié)果進(jìn)行選擇性顯示。 sql語句的執(zhí)行順序如下:
- group by 分組:根據(jù)id列將數(shù)據(jù)分組。
- sum() 聚合函數(shù)計(jì)算:計(jì)算每個(gè)組的num的總和,生成中間結(jié)果。
- having 子句篩選:根據(jù)all_num過濾中間結(jié)果,保留總和大于50的組。
- select 子句選擇:從滿足having條件的組中選擇性地展示結(jié)果,即展示滿足條件的組和對(duì)應(yīng)的all_num。
因此,select子句并非在having之前執(zhí)行,而是對(duì)其篩選后的結(jié)果進(jìn)行選擇性顯示。所以,本例中先執(zhí)行having再執(zhí)行select的說法是正確的。