程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> SQL進行排序 分組 統計的10個新技巧

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

編輯:關於MYSQL數據庫

以一種有意義的方式組織數據可能是一項挑戰。有時你需要的可能是一個簡單的排序,但是通常你需要做更多,你需要分組來進行分析和統計。幸運的是,SQL提供了大量語句和操作來進行排序,分組和摘要。下面的一些技巧將會幫助你識別什麼時候排序,什麼時候分組,什麼時候以及如何統計。對要每條語句和操作的詳細信息請查看Books Online。

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語句。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved