SQL語言是一門很是簡單的語言,編寫SQL只要理解其執行邏輯就能寫出正確的SQL語句!數據庫
SQL語句和其餘的編程語言最明顯的區別是處理代碼的執行順序,大多數的編程語言,代碼是按照編碼順序被處理,可是SQL語句的執行順序是不一樣的。編程
例子:編程語言
1 •SELECT[DISTINCT] 2 •FROM 3 •WHERE 4 •GROUP BY 5 •HAVING 6 •UNION 7 •ORDER BY
上面的例子沒有把全部的SQL語法結構都列出來,可是足夠說明SQl的語法順序和執行順序徹底不同,上述語句的執行順序爲:函數
1 •FROM 2 •WHERE 3 •GROUP BY 4 •HAVING 5 •SELECT 6 •DISTINCT 7 •UNION 8 •ORDER 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 集合輸出。