[學習筆記]分組資料以及on/where/having的順序問題

iSQlServer發表於2010-06-07

分組:

當我們新增了一個group by子句,就向資料庫指定了from和where子句所形成的邏輯表中的哪些列要用作對行進行分組。在我們所指定的列上具有相同值的行,將會被劃分為一組(如果group by 指定的是多列,則只有當某兩行的這幾個列的值都相等時才被分到同一組)。然後可以在分組的基礎上計算聚合函式的值。在select之後出現的但沒有被應用於聚合函式的列,必須出現在group by之後。

不能把聚合函式巢狀在另一個聚合函式中

如SUM(AVG(price))是非法的

不能使用子查詢作為一個聚合函式的值表示式

AVG(select price from products )是非法的

On where having的順序問題

在多表聯接查詢時,on比where更早起作用。系統首先根據各個表之間的聯接條件,把多個表合成一個臨時表後,再由where進行過濾,然後再計算,計算完後再由having進行過濾。由此可見,要想過濾條件起到正確的作用,首先要明白這個條件應該在什麼時候起作用,然後再決定放在那裡。

所以having是最慢的。但也不是說having沒用,當必須得到計算結果之後才能進行過濾時,就要用having了。

比如可以:HAVING SUM(price) > 300 而不能:where SUM(price) > 300,因為where的時候還沒有進行sum的計算。

但你可以利用子select語句在where的過濾條件中運用聚合函式

例:

select engagementNumber

From engagements

Where ContractPrice >= (

Select avg(ContractPrice) from engagement

)

在兩個表聯接時才用on的,所以在一個表的時候,就剩下where跟having比較了。在這單表查詢統計的情況下,如果要過濾的條件沒有涉及到要計算欄位,那它們的結果是一樣的,只是where可以使用rushmore技術,而having就不能,在速度上後者要慢。

總之:on、where、having這三個都可以加條件的子句中,on是最先執行,where次之,having最後.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-664616/,如需轉載,請註明出處,否則將追究法律責任。

相關文章