建立分組:
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排序
