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語句的第一步是將數據從硬盤加載到數據緩沖區,便於對這些數據進行操作。
2.select是在大部分語句執行后才執行的,嚴格說是在from和group by之后執行,這也是在where中不能使用在select中設定別名的字段作為判斷條件的原因。
1 SELECT A.x + A.y AS z 2 FROM A 3 WHERE z = 10 -- z 在此處不可用,因為SELECT是最后執行的語句!
如果想使用別名Z,有兩個選擇。要么重新寫一遍Z代表的表達式:
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 操作過后仍保持排序后的順序。
注意:並非所有的數據庫對 SQL 語句使用相同的解析方式。如 MySQL、PostgreSQL和 SQLite 中就不會按照上面第二點中所說的方式執行。
用一段話總結一下:
SQL Select語句完整的執行順序:
1、from子句組裝來自不同數據源的數據;
2、where子句基於指定的條件對記錄行進行篩選;
3、group by子句將數據划分為多個分組;
4、使用聚集函數進行計算;
5、使用having子句篩選分組;
6、計算所有的表達式;
7、使用order by對結果集進行排序。
8、select 集合輸出。