SQLSERVER之T-SQL查詢(一)

  最近想研究一下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知識。若是有不足的地方但願你們批評指正。

相關文章
相關標籤/搜索