1. 程式人生 > 實用技巧 >第10課 分組資料

第10課 分組資料

第10課 分組資料

10.1 資料分組

使用分組可以將資料分為多個邏輯組,對每個組進行聚集計算。

10.2 建立分組

分組是使用SELECT語句的GROUP BY子句建立的。

SELECT vend_id, COUNT(*) AS num_prods
FROM Products
GROUP BY vend_id;

這就會對每個vend_id而不是整個表計算num_prods一次。

GROUP BY子句指示DBMS分組資料,然後對每個組而不是整個結果集進行聚集。

10.3 過濾分組

WHERE過濾行,而HAVING過濾分組。

SELECT cust_id, COUNT(*) AS orders
FROM Orders
GROUP BY cust_id
HAVING COUNT(*) >= 2;

說明:HAVING和WHERE的差別
這裡有另一種理解方法,WHERE在資料分組前進行過濾,HAVING在資料分組後進行過濾。這是一個重要的區別,WHERE排除的行不包括在分組中。這可能會改變計算值,從而影響HAVING子句中基於這些值過濾掉的分組。

SELECT vend_id, COUNT(*) AS num_prods
FROM Products
WHERE prod_price >= 4
GROUP BY vend_id
HAVING COUNT(*) >= 2;

WHERE子句過濾所有prod_price至少為4的行,然後按vend_id分組資料,HAVING子句過濾計數為2或2以上的分組。

10.4 分組和排序

GROUP BY和ORDER BY經常完成相同的工作,但它們非常不同,理解這一點很重要。

ORDER BY GROUP BY
對產生的輸出排序 對行分組,但輸出可能不是分組的順序
任意列都可以使用(甚至非選擇的列也可以使用) 只可能使用選擇列或表示式列,而且必須使用每個選擇列表達式
不一定需要 如果與聚集函式一起使用列(或表示式),則必須使用

要按訂購物品的數目排序輸出,需要新增ORDER BY子句,如下所示:

SELECT order_num, COUNT(*) AS items
FROM OrderItems
GROUP BY order_num
HAVING COUNT(*) >= 3
ORDER BY items, order_num;

在這個例子中,使用GROUP BY子句按訂單號(order_num列)分組資料,以便COUNT(*)函式能夠返回每個訂單中的物品數目。HAVING子句過濾資料,使得只返回包含三個或更多物品的訂單。最後,用ORDER BY子句排序輸出。

10.5 SELECT子句順序

在SELECT語句中使用時必須遵循的次序,列出迄今為止所學過的子句。

子  句 說  明 是否必須使用
SELECT 要返回的列或表示式
FROM 從中檢索資料的表 僅在從表選擇資料時使用
WHERE 行級過濾
GROUP BY 分組說明 僅在按組計算聚集時使用
HAVING 組級過濾
ORDER BY 輸出排序順序

10.6 小結

我們看到了如何使用HAVING子句過濾特定的組,還知道了ORDER BY和GROUP BY之間以及WHERE和HAVING之間的差異。