SQL分組


建立分組:

vend_id是Vendor_id的縮寫:供應商id,products是一個存儲商品信息的表。

通過GROUP BY語句,我們可以按照供應商分組,然后組內計數

SELECT a.prod_id,a.prod_name,a.prod_price,a.prod_desc,b.num_prods
FROM products a
join 
(
SELECT vend_id,count(*) as num_prods
FROM products
group by vend_id
) b
on a.vend_id=b.vend_id
where num_prods>2

查詢提供2個以上產品的供應商的產品。

 GROUP BY的一些重要規定:

1,GROUP BY子句可以包含任意數目的列,如果在GROUP BY子句中嵌套了分組,數據將GROUP BY會在最后指定的分組上進行行匯總。

SELECT vend_id,prod_id,COUNT(*) AS num_prods
FROM products
GROUP BY vend_id,prod_id;

結果:

2,GROUP BY中的每一列必須是檢索列或者表達式。

相似問題可以查看,https://blog.csdn.net/weixin_43495390/article/details/103372662

GROUPBY不能使用別名的原因是它在select語句前執行。所以這就引出第3點

3,GROUP BY子句必須出現在WHERE子句后,ORDER BY子句之前。

4,如果分組列中包含NULL值的行,那么NULL也會作為一個分組返回。

 過濾分組:

你可能想要列出至少有兩個訂單的所有顧客。為此必須要基於組過濾,而不是個別的行進行過濾。

盡管有WHERE子句,但這個任務中WHERE不能完成任務,因為WHERE過濾的是行不是組。

那么怎么過濾分組呢?請看以下例子:

這段代碼在最后一行增加了HAVING,它的作用就是過濾掉COUNT(*)>=2的那些分組。

SELECT order_date,cust_id,count(*) as orders from orders
where date_format(order_date,'%Y%m')<=201202
group by cust_id
having count(*)>=1

進一步練習,如果想要返回在2012年2月之前的,具有兩個以上訂單的顧客。就要增加一條WHERE子句

分組和排序


Order By 和 GROUP BY的差別

差別在於GROUPBY分組的數據並不總是以分組順序輸出,因為這不是sql規范要求的。

即便DBMS總是按分組順序輸出,用戶可能會要求以不同的順序排序。

所以使用group by子句時,應該給出order by子句。不要僅依賴GROUP BY 排序數據。

舉例:輸入

SELECT order_num,count(*) as items from orderitems
GROUP BY order_num
HAVING count(*)>=3

輸出:

沒經過order by排序后。

加入items后

SELECT order_num,count(*) as items from orderitems
GROUP BY order_num
HAVING count(*)>=3
order by items;

輸出:

 

 加入order_num后:

 行按order_num排序

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM