MySQL必知必會 —— 第十三章 分組數據

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;

在這裏插入圖片描述

5.select 子句語序

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章