SQL語句的執行順序

SQL語言是一門很是簡單的語言,編寫SQL只要理解其執行邏輯就能寫出正確的SQL語句!數據庫

SQL語句和其餘的編程語言最明顯的區別是處理代碼的執行順序,大多數的編程語言,代碼是按照編碼順序被處理,可是SQL語句的執行順序是不一樣的。編程

例子:編程語言

1SELECT[DISTINCT]
2FROM
3WHERE
4GROUP BY
5HAVING
6UNION
7ORDER BY

上面的例子沒有把全部的SQL語法結構都列出來,可是足夠說明SQl的語法順序和執行順序徹底不同,上述語句的執行順序爲:函數

1FROM
2WHERE
3GROUP BY
4HAVING
5SELECT
6DISTINCT
7UNION
8ORDER BY

SQL語句的執行順序值得注意的地方:編碼

1.from是SQL語句執行的第一步,數據庫執行SQL語句的第一步是將數據從硬盤加載到數據緩衝區,便於對這些數據進行操做。spa

2.select是在大部分語句執行後才執行的,嚴格說是在from和group by以後執行,這也是在where中不能使用在select中設定別名的字段做爲判斷條件的緣由。code

1 SELECT A.x + A.y AS z
2 FROM A
3 WHERE z = 10 -- z 在此處不可用,由於SELECT是最後執行的語句! 

若是想使用別名Z,有兩個選擇。要麼從新寫一遍Z表明的表達式:blog

1 SELECT A.x + A.y AS z
2 FROM A
3 WHERE (A.x + A.y) = 10

或者求助衍生表,通用數據表達式或者視圖,避免別名重用。排序

3.不管在語法上仍是執行順序上,union老是排在order by以前。不少人認爲每一個 UNION 段都能使用 ORDER BY 排序,可是根據 SQL 語言標準和各個數據庫 SQL 的執行差別來看,這並非真的。儘管某些數據庫容許 SQL 語句對子查詢(subqueries)或者派生表(derived tables)進行排序,可是這並不說明這個排序在 UNION 操做事後仍保持排序後的順序。get

注意:並不是全部的數據庫對 SQL 語句使用相同的解析方式。如 MySQL、PostgreSQL和 SQLite 中就不會按照上面第二點中所說的方式執行。

 

用一段話總結一下:

SQL Select語句完整的執行順序:
一、from子句組裝來自不一樣數據源的數據;
二、where子句基於指定的條件對記錄行進行篩選;
三、group by子句將數據劃分爲多個分組;
四、使用彙集函數進行計算;五、使用having子句篩選分組;六、計算全部的表達式;七、使用order by對結果集進行排序。八、select 集合輸出。

相關文章
相關標籤/搜索