SQL必知必會 筆記 第十章 分組資料,sql必知
10.1資料分組
分組允許吧資料分為多個邏輯組,以便能對每個組進行聚集計算。
10.2建立分組
SELECT vend_id,COUNT(*) AS num_prodsFROM ProductsGROUP BY vend_id;
使用GROUP BY的一些規定:
(1)GROUP BY子句可以包含任意數目的列。這使得能對分組進行嵌套,為資料分組提供更細緻的控制。
(2)如果在GROUP BY子句中嵌套了分組,資料將在最後規定的分組上進行匯總。換句話說,在建立分組時,指定的所有列都一起計算。
(3)GROUP BY子句中列出的每個列都必須是檢索列或有效運算式。如果在SELECT中使用運算式,則必須在GROUP BY子句中指定相同的運算式。不能用別名。
(4)大多數SQL實現不允許GROUP BY列帶有長度可變的資料類型。
(5)除聚集計算語句外,SELECT語句中的每個列都必須在GROUP BY子句給出。
(6)如果分組列種具有NULL值,則NULL將作為一個分組返回。如果列種有多行NULL值,它們將分為一組。
(7)GROUP BY子句必須出現在WHERE子句之後,ORDER BY子句之前。
10.3 過濾分組
WHERE過濾指定的是列而不是分組。事實上WHERE沒有分組的概念。
事實上,目前所學過的所有類型的WHERE子句都可以用HAVING來代替。唯一的差別是WHERE過濾行,而HAVING過濾分組。
SELECT cust_id,COUNT(*) AS ordersFROM OrdersGROUP BY cust_idHAVING COUNT(*) >= 2;
HAVING和WHERE的差別:這裡有另一種理解方法,WHERE在資料分組前進行過濾,HAVING在資料分組後進行過濾。這是一個重要的區別,WHERE排除的行不包括在分組中,這可能會改變計算值,從而影響HAVING子句中基於這些值過濾掉的分組。
列出具有兩個以上,價格為4以上的產品的供銷商
SELECT vend_id,COUNT(*) AS num_prodsFROM ProductsWHERE prod_price >= 4GROUP BY vend_idHAVING COUNT(*) >= 2;
使用HAVING和WHERE:HAVING和WHERE非常類似,如果不指定GROUP BY,則大多數DBMS將把它們作為相同的東西對待。不過,為了自己可以區分,應該僅在與GROUP BY子句結合使用時才使用HAVING,而WHERE子句用於標準的行級過濾。
10.4分組和排序
GROUP BY和ORDER BY的區別
不要忘記ORDER BY:一般在使用GROUP BY子句時,應該也給出ORDER BY子句。這是保證資料正確排序的唯一方法。千萬不要僅依賴GROUP BY排序資料。
檢索包含3個或3個以上物品的訂單號和訂單物品的數目
SELECT order_num,COUNT(*) AS itemsFROM OrderItemsGROUP BY order_numHAVING COUNT(*) >= 3;
為按訂購物品的數目排序輸出,需要添加ORDER BY子句
SELECT order_num,COUNT(*) AS itemsFROM OrderItemsGROUP BY order_numHAVING COUNT(*) >= 3ORDER BY items,order_num;
10.5SELECT子句的順序