大家讲道理2017-04-17 14:42:18
我之前也考慮過這個問題。
結論是:網路上給的資料都是大概的針對整個sql來說,而並非針對mysql.
mysql的處理方式是中間產生虛擬表(或稱為臨時表),而這個虛擬表的產生的列靠的就是select,所以猜測類似having之後的操作,其實內部已經根據select產生了虛擬表,列自然也是as後的。
迷茫2017-04-17 14:42:18
sqlserver
一:查詢的邏輯執行順序
(1) FROM < left_table>
(3) < join_type> JOIN < right_table> (2) ON < join_condition>
(4) WHERE < where_condition>
(5) GROUP BY < group_by_list>
(6) WITH {cube | rollup}
(7) HAVING < having_condition>
(8) SELECT (9) DISTINCT (11) < top_specification> < select_list>
(10) ORDER BY < order_by_list>
標準的SQL 的解析順序為:
(1).FROM 子句 組裝不同資料來源的資料
(2).WHERE 子句 基於指定的條件對記錄進行篩選
(3).GROUP BY 子句 將資料分割為多個分組
(4).使用聚合函數進行計算
(5).使用HAVING子句篩選分組
(6).計算所有的表達式
(7).使用ORDER BY對結果集進行排序
二 執行順序:
1.FROM:對FROM子句中前兩個表執行笛卡爾積產生虛擬表vt1
2.ON:對vt1表應用ON篩選器只有滿足< join_condition> 為真的行才被插入vt2
3.OUTER(join):如果指定了OUTER JOIN保留表(preserved table)中未找到的行將行作為外部行添加到vt2 生成t3如果from包含兩個以上表則對上一個聯結生成的結果表和下一個表重複執行步驟和步驟直接結束
4.WHERE:對vt3應用 WHERE 篩選器只有使< where_condition> 為true的行才被插入vt4
5.GROUP BY:按GROUP BY子句中的列列表對vt4中的行分組產生vt5
6.CUBE|ROLLUP:把超組(supergroups)插入vt6 產生vt6
7.HAVING:對vt6應用HAVING篩選器只有使< having_condition> 為true的群組才插入vt7
8.SELECT:處理select列表產生vt8
9.DISTINCT:將重複的行從vt8中移除產生vt9
10.ORDER BY:將vt9的行依order by子句中的列列表排序產生一個遊標vc10
11.TOP:從vc10的開始處選擇指定數量或比例的行產生vt11 並傳回呼叫者