用到的表參考https://www.cnblogs.com/july23333/p/11763375.html
group by能夠把數據分為多個邏輯組,各組內進行聚集計算,在where匹配特定行基礎上有了更大的靈活性。
例1:返回每個供應商提供的產品數,需要按照供應商id分組
SELECT vend_id,COUNT(*) AS num_items FROM products GROUP BY vend_id
有了初步印象后,介紹group by一些使用規則:
1、group by后面可以跟任意數目的列進行分組嵌套,例如按照身高和性別分組,那么170的男生和170的女生都會展開顯示出來。
2、group by子句列出的每個列都必須為檢索列或有效的表達式,不能是聚集函數,且select語句中使用了表達式那么group by子句中需要是相同的表達式,不能為別名。
反例:SELECT order_num AS orderid, SUM(quantity*item_price) AS sum_price FROM orderitems GROUP BY orderid
原因:對於大多數關系數據庫系統,如Oracle和SQLServer,GROUP BY是在SELECT子句之前執行的,不能使用在SELECT子句中定義的別名。MySQL對查詢進行了加強,可以使用,但是仍不建議使用別名,避免混淆。 另外where子句中也不能使用別名。
3、除聚集函數外,select語句中的每個列都需要在group by子句中給出。
例3:SELECT prod_id, vend_id, COUNT(*) AS num_items FROM products GROUP BY vend_id;
雖然有效,但是根據vend_id分組后的每個vend_id有多個prod_id,返回的prod_id無意義。
4、分組列中的NULL值作為一組。
5、group by子句出現在where之后,order by之前。
那么如果不想返回所有的分組結果,而希望根據某些條件進行過濾呢?這時你可能會說where,但where過濾的是指定的行,不能過濾分組。MySQL提供了另外的子句Having來解決這一問題。
例4:選出具有兩個以上價格大於10的產品的供應商
SELECT vend_id,COUNT(*) AS num_prods FROM products WHERE prod_price>=10 GROUP BY vend_id HAVING COUNT(*)>=2
你也可以理解為where在數據分組前進行過濾,having是在數據分組后過濾。
與where不同的是,having后還可以接聚集函數。
此外分組的結果不一定是按照分組順序返回,group by不保證順序,需要時應該添加order by實現。
例5:檢索訂單價格大於等於50的訂單號和訂單價格,並安裝價格排序輸出。
SELECT order_num, SUM(quantity*item_price) AS sum_price FROM orderitems GROUP BY order_num HAVING SUM(quantity*item_price)>=50
ORDER BY sum_price
結果
簡單查詢到此就介紹完了,最后總結一下select語句的書寫順序和使用順序:
書寫:select from where group by having order by limit
執行:from where group by having select distinct order by limit