MySQL:group by分組數據


用到的表參考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


免責聲明!

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



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