主要學習GROUP BY子句和HAVING子句
1 數據分組
使用分組可以將數據分為多個邏輯組,對每個組進行聚集計算。
2 創建分組
SELECT vend_id , COUNT(*) AS num_prods FROM products GROUP BY vend_id
GROUP BY子句指示DBMS按 vend_id 排序并分組數據。這樣就會對每個vend_id而不是整個表計算num_prods一次。
GROUP BY子句指示DBMS分組數據,然后對每個組而不是整個結果集進行聚集。
通過相對位置指定列
SELECT vend_id , COUNT(*) AS num_prods FROM products GROUP BY 1
3 過濾分組
目前為止所學過的所有類型的WHERE子句都可以用HAVING來替代。唯一的差別是,WHERE過濾行,而HAVING過濾分組。HAVING支持所有的WHERE操作符。WHERE在數據分組前進行過濾,HAVING在數據后進行過濾。
SELECT cust_id ,COUNT(*) AS orders FROM orders GROUP BY cust_id HAVING COUNT(*)>=2
例子:列出具有兩個以上產品且其價格大于等于4的供應商:
SELECT vend_id,COUNT(*) AS num_prods FROM products WHERE prod_price >= 4 GROUP BY vend_id HAVING COUNT(*) >= 2
說明:使用HAVING和WHERE
HAVING與WHERE非常類似,如果不指定GROUP BY,則大多數DBMS會同等對待它們。不過,使用HAVING時應該結合GROUP BY子句,而WHERE子句用于標準的行級過濾。
4 分組和排序
一般在使用GROUP BY子句時,應該也給出ORDER BY子句。
例子:檢索包含3個及以上物品的訂單號和訂購物品的數目:
SELECT order_num,COUNT(*) AS items FROM orderitems GROUP BY order_num HAVING COUNT(*) >=3
如果按訂單物品的數量排序,需要添加ORDER BY子句,如下所示:
SELECT order_num,COUNT(*) AS items FROM orderitems GROUP BY order_num HAVING COUNT(*) >=3 ORDER BY items,order_num
ORDER BY子句還可以寫成
ORDER BY COUNT(*),order_num
或者ORDER BY 2,1
分析:使用GROUP BY子句按訂單號(order_num列)分組數據,以便COUNT(*)函數能夠返回每個訂單中的物品數目。HAVING子句過濾數據,使得只返回包含三個或更多物品的訂單。最后,用ORDER BY子句排序輸出。
5 SELECT子句順序
列舉目前所學的SELECT語句中使用時必須遵循的次序。
子句 | 說明 | 是否必須使用 |
---|---|---|
SELECT | 要返回的列或表達式 | 是 |
FROM | 從中檢索數據的表 | 僅在從表選擇數據時使用 |
WHERE | 行級過濾 | 否 |
GROUP BY | 分組說明 | 僅在按組計算聚集時使用 |
HAVING | 組級過濾 | 否 |
ORDER BY | 輸出排序順序 | 否 |