1. 程式人生 > >SQL必知必會-筆記(六)分組數據

SQL必知必會-筆記(六)分組數據

概念 item 問題: 問題 技術 tro 大於 class 圖片

為什麽需要分組?

先來看一個問題,如果需要返回供應商DLL01提供的產品數目,SQL如下:

select count(*) from Products where vend_id = ‘DLL01‘;

那麽如果要返回每個供應商提供的產品數目呢?這時就可以使用分組將數據分為多個邏輯組,對每個組進行聚集計算。

select vend_id, count(*) as num_prods from Products group by vend_id;

技術分享圖片
註意,GROUP BY必須出現在WHERE之後,ORDER BY之前

過濾分組

再來看一個問題,如果需要檢索出每個客戶的訂單數量,根據上面所學,SQL如下:

select cust_id, count(*) as orders from Orders group by cust_id;

技術分享圖片

現在有個新的問題,需要檢索出兩個訂單以上的客戶,怎麽做?
像這樣?

select cust_id, count(*) as orders from Orders group by cust_id where count(*) >=2;

很明顯,這是錯誤寫法,因為WHERE是過濾指定的行,沒有分組的概念。過濾分組需要使用HAVING

select cust_id, count(*) as orders from Orders group by cust_id having count(*) >=2;

可以這麽理解,WHERE在數據分組前進行過濾,HAVING在數據分組後進行過濾。

  • 問題:檢索出具有兩個以上產品且價格大於等於4的供應商
  • 解:
select vend_id, count(*) as num_prods from Products where prod_price >= 4 group by vend_id having count(*) >=2;

技術分享圖片

最後再來看一個問題,

  • 問題:檢索出包含3個或更多物品的訂單號以及訂購物品的數量,且按照訂購物品的數量排序
  • 解:
select order_num,count(*) as items from OrderItems group by order_num having count(*) >=3 order by items,order_num;

SQL必知必會-筆記(六)分組數據