1. 程式人生 > >SQL進行排序、分組、統計的10個新技巧

SQL進行排序、分組、統計的10個新技巧

今天在新客網看到一片好文章,是關於sql排序,分組和統計的技巧方面的!特拿來與大家分享!呵呵

1.使用排序使資料有序

通常,你的所有資料真正需要的僅僅是按某種順序排列。SQL的ORDER BY語句可以以字母或數字順序組織資料。因此,相似的值按組排序在一起。然而,這個分組時排序的結果,並不是真的分組。ORDER BY顯示每條記錄而分組可能代表很多記錄。

2.進行分組除去重複值

排序和分組之間的最大區別是:排序的資料顯示所有記錄(在限定標準範圍之內),而分組資料不是顯示所有記錄。GROUP BY語句對於同樣的值只顯示一條記錄。例如,下面的語句中的GROUP BY語句對資料來源中重複出現的資料只返回唯一的zip編碼列。

SELECT ZIP FROM Customers GROUP BY ZIP

只包括由GROUP BY和SELECT語句共同定義的那些記錄,換句話說,SELECT列表必須滿足GROUP BY列表,但是有一個例外就是SELECT列表可以包含聚合函式(GROUP BY語句不允許使用聚合函式)。需要注意的是GROUP BY語句不會對結果分組進行排序。為了使分組按字母或數字有序排列,需要新增ORDER BY語句。此外,在GROUP BY語句中不能引用使用了別名的欄位。分組欄目必須是潛在的資料,但它們並不需要顯示在結果中。

3.在分組之前進行資料篩選

你可以新增一個WHERE語句來篩選有GROUP BY所得分組中的資料。例如,下面的語句只返回肯塔基州顧客的唯一ZIP編碼列。

SELECT ZIP FROM CustomersWHEREState = 'KY' GROUP BY ZIP

必須注意的是WHERE語句是在GROUP BY語句求值之前進行資料過濾的。與GROUP BY語句一樣,WHERE語句也不支援聚合函式。

4.返回所有分組

當你使用WHERE語句過濾資料時,結果分組中只顯示你指定的那些記錄,而符合分組定義但是不滿足過濾條件的資料不會包含在某個分組中。當你想在分 組中包含所有資料時新增關鍵字ALL即可,這時WHERE條件就不起作用。例如,在前面的例子中新增關鍵字ALL就會返回所有的ZIP分組,而不是僅在肯 塔基州的那些。

SELECT ZIP FROM CustomersWHEREState = 'KY' GROUP BY ALL ZIP

這樣看來,這兩個語句存在衝突,你可能不會以這種方式使用關鍵字ALL。當你使用聚合函式計算某一列時,使用ALL關鍵字可能會很方便。例如,下面的語句計算每個肯塔基州ZIP中的顧客數,同時,還會顯示其它的ZIP值。

SELECT ZIP, Count(ZIP) AS KYCustomersByZIP FROM 
CustomersWHEREState = 'KY' GROUP BY ALL ZIP

結果分組包括潛在資料中的所有ZIP值,然而,對於那些不是肯塔基州ZIP分組的聚合列(KYCustomersByZIP)將會顯示0。遠端查詢不支援GROUP BY ALL。

5.分組後篩選資料

WHERE語句在GROUP BY語句之前進行計算。當你需要在分組之後篩選資料時,可以使用HAVING語句。通常情況下,WHERE語句和HAVING語句的返回結果是一樣的,但 是值得注意的是這兩個語句不可互換。當你迷惑時,可以遵循下面的說明:使用WHERE語句過濾記錄,使用HAVING語句過濾分組。

一般情況,你會使用HAVING語句和某個聚合函式計算一個分組。例如,下面的語句返回一個唯一的ZIP編碼列,但是可能不會包含潛在資料來源中所有的ZIP。

SELECT ZIP, Count(ZIP) AS CustomersByZIP FROM 
Customers GROUP BY ZIP HAVING Count(ZIP) = 1

只有那些包含一位顧客的分組顯示在結果中。

6.進一步瞭解WHERE和HAVING語句

如果你對何時應該使用WHERE,何時使用HAVING仍舊很迷惑,請遵照下面的說明:

WHERE語句在GROUP BY語句之前;SQL會在分組之前計算WHERE語句。

HAVING語句在GROUP BY語句之後;SQL會在分組之後計算HAVING語句。

7.使用聚合函式統計分組資料

分組資料可以幫助我們分析資料,但是有時我們可能需要更多的資訊而不僅僅是分組。你可以使用聚合函式來統計分組資料。例如,下面的語句顯示每批訂購單的總價錢。

SELECT OrderID, Sum(Cost * Quantity) AS OrderTotal 
FROM Orders GROUP BY OrderID
對於其它的分組來說,SELECT和GROUP BY列必須匹配。而SELECT語句包含聚合函式時這一規則是一個例外.

8.統計聚合資料

你可以繼續統計資料為每個分組顯示一個分類統計。SQL的ROLLUP操作符可以為每個分組顯示一個額外的分類統計。這個分類統計是使用聚合函式計算每個分組中的所有記錄得到的結果。下面的語句為每個分組計算OrderTotal:

SELECT Customer, OrderNumber, Sum(Cost * Quantity) 
AS OrderTotal FROM Orders GROUP BY Customer,
OrderNumber WITH ROLLUP

對於有兩個分別為20和25 OderTotal值的分組,ROLLUP顯示一個OrderTotal值45。ROLLUP結果中的第一條記錄是唯一的,因為它是計算所有分組記錄,這個值是整個記錄集的總值。

ROLLUP在聚合函式中不支援 DISTINCT,也不支援GROUP BY ALL語句。

9.統計每個列

CUBE操作符比ROLLUP更進一步,它返回每個分組中重複值的個數。它的結果和ROLLUP相同,但是對每位客戶的每一列CUBE包含一個額外的記錄。下面的語句顯示每個分組的統計和額外每位客戶的統計。

SELECT Customer, OrderNumber, Sum(Cost * Quantity) 
AS OrderTotal FROM Orders GROUP BY Customer,
OrderNumber WITH CUBE

CUBE可以給最綜合的統計。它不僅完成聚合和ROLLUP的功能,還可以計算定義分組的其它列,換句話說,CUBE統計每個可能的列組合。

CUBE不支援GROUP BY ALL語句。

10:對統計結果排序

當CUBE的結果令人迷惑時(它經常是這樣),可以新增一個GROUPING函式,如下所示:

SELECT GROUPING(Customer), OrderNumber, 
Sum(Cost * Quantity) AS OrderTotal FROM Orders GROUP
BY Customer, OrderNumber WITH CUBE

結果中每行包含兩個額外的值:

值1表示左邊的值是一個統計值,是ROLLUP或CUBE的操作符。

值0表示左邊的值是一條由最初的GROUP BY語句產生的詳細記錄。