最近想研究一下SQL語句,因而看了一下《SQLSERVER技術內幕》。因爲剛剛開始看,因此順便總結一下。spa
在SQLSERVER中,經常使用的無非就是SELECT、FROM、JOIN、WHERE、ON、HAVING、ORDER BY、GROUP BY、DISTINCT等。可是SQL語句在SQLSERVER中具體是如何執行的呢?排序
首先看一個SQL語句:ci
SELECT C.customerid,COUNT(O.orderid) AS numorders博客
FROM dbo.Customers AS Cit
LEFT OUTER JOIN dbo.Orders AS O原理
ON C.customerid=O.customeridselect
WHERE C.city='Madrid'技術
GROUP BY C.customerid總結
HAVING COUNT(O.orderid)<3客戶端
ORDER BY numorders;
此SQL語句是書上的例子,借用一下。
這個SQL語句很好理解,只是一個簡單的查詢語句,可是具體的在SQLSERVER中是如何運行的呢?
首先,SQL語句在運行時必定是首先運行FROM子句(你們必定有此經歷:在SQLSERVER中寫語句時,select 列名 from 這個時候列名是沒有提示的。當寫上SELECT * FROM Table_Name,當再次修改*號時,有了列名提示。因此此項能夠證實在SQLSERVER中先執行的是FROM子句)。當FORM表中存在多張表時,進行笛卡爾積的運算,生成一張臨時表T1。
第二,將臨時表T1中的結果經過ON 條件過濾生成臨時表T2。
第三,執行OUTER JOIN操做,將沒法匹配的行插入到臨時表T2中,生成臨時表T3。
第四,執行WHERE子句,過濾不符合條件的記錄生成臨時表T4。
第五,執行GROUP BY子句,將T4表中的記錄進行分組,生成臨時表T5。
第六,執行HAVING子句,過濾T5表中的記錄,生成臨時表T6。
再執行SELECT子句,將T6表中記錄過濾不須要的字段,生成臨時表T7。執行DISTINCT子句將T7臨時表中的重複行刪除,生成臨時表T8。最後執行ORDER BY子句,將T8中的記錄進行排序,進行輸出。
整個SQL語句的執行順序到這兒才執行完畢。在這個過程當中總共生成了8張表。其中T1~T7臨時表都不能被客戶端或者用戶進行使用。當充分理解SQL語句在SQLSERVER中的執行順序後,會使咱們對SQL的運行原理有了更充分的理解,這對於書寫SQL語句又很大的幫助。
在隨後的博客中,我將繼續談本身以及經過書本得到的SQL知識。若是有不足的地方但願你們批評指正。