第10課 分組資料
阿新 • • 發佈:2020-06-30
第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之間的差異。