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