1.分組數據
首先返回供應商1003提供的產品數目:
select count(*) as num_prods
from products
where vend_id = 1003;
2. 創建分組
組是在SELECT語句的GROUP BY子句中建立的。
select vend_id,count(*) as num_prods
from products
group by vend_id;
在具體使用GROUP BY子句前,需要知道一些重要的規定。
❑ GROUP BY子句可以包含任意數目的列。這使得能對分組進行嵌套,爲數據分組提供更細緻的控制。
❑ 如果在GROUP BY子句中嵌套了分組,數據將在最後規定的分組上進行彙總。換句話說,在建立分組時,指定的所有列都一起計算(所以不能從個別的列取回數據)。
❑ GROUP BY子句中列出的每個列都必須是檢索列或有效的表達式(但不能是聚集函數)。如果在SELECT中使用表達式,則必須在GROUP BY子句中指定相同的表達式。不能使用別名。
❑ 除聚集計算語句外,SELECT語句中的每個列都必須在GROUP BY子句中給出。
❑ 如果分組列中具有NULL值,則NULL將作爲一個分組返回。如果列中有多行NULL值,它們將分爲一組。
❑ GROUP BY子句必須出現在WHERE子句之後,ORDER BY子句之前
3. 過濾分組
除了能用GROUP BY分組數據外,MySQL還允許過濾分組,規定包括哪些分組,排除哪些分組。例如,可能想要列出至少有兩個訂單的所有顧客。爲得出這種數據,必須基於完整的分組而不是個別的行進行過濾。
select cust_id,count(*) as orders
from orders
group by cust_id
having count(*) >= 2;
HAVING支持所有WHERE操作符 在第6章和第7章中,我們學習了WHERE子句的條件(包括通配符條件和帶多個操作符的子句)。所學過的有關WHERE的所有這些技術和選項都適用於HAVING。它們的句法是相同的,只是關鍵字有差別。
HAVING和WHERE的差別 這裏有另一種理解方法,WHERE在數據分組前進行過濾,HAVING在數據分組後進行過濾。這是一個重要的區別,WHERE排除的行不包括在分組中。這可能會改變計算值,從而影響HAVING子句中基於這些值過濾掉的分組
4. 分組和排序
雖然GROUP BY和ORDER BY經常完成相同的工作,但它們是非常不同的
說明GROUP BY和ORDER BY的使用方法,請看一個例子。下面的SELECT語句類似於前面那些例子。它檢索總計訂單價格大於等於50的訂單的訂單號和總計訂單價格:
select order_num,sum(quantity*item_price) as ordertotal
from orderitems
group by order_num
having sum(quantity*item_price) >= 50;
爲按總計訂單價格排序輸出,需要添加ORDER BY子句,如下所示:
select order_num,sum(quantity*item_price) as ordertatal
from orderitems
group by order_num
having sum(quantity*item_price) >= 50
order by ordertotal;