改進一條Group By

1.先回顧下基礎知識:函數


Group By 對數據分組聚合,經常伴隨having使用。having能夠處理單記錄,也能夠小組爲單位處理。spa

語句:code

SELECT col
FROM table
[WHERE]
[GROUP BY]
[HAVING]
[ORDER BY [ASC]|[DESC]]blog

1.FROM子句生成數據集
2.WHERE子句過濾1生成的數據集
3.GROUP BY子句聚合2生成的數據集
4.HAVING子句過濾3生成的數據集
5.SELECT子句在4的結果上作些轉換
6.ORDER BY子句對5變換後的數據集進行排序排序

 

在SELECT子句但不在GROUP BY子句中的字段必須使用聚合函數。
聚合函數是對一組值執行計算並返回單個值得肯定性函數,如COUNT,SUM,AVG,MIN,MAX,VAR_POP,VAR_SAMP等。ci

 

 

2.正文:it


從SQL-92標準開始,強制規定了GROUP BY子句的使用,主流廠家也多數已經遵照,即:SELECT的字段,要麼在GROUP BY中已經列出,要麼使用了聚合函數。table

如:有user表,order表,想看每一個用戶的消費狀況,即按userid查詢order分組數據,咱們真正想要的是: class

SELECT u.userid,u.username,u.city,SUM(o.OrderTatal) AS total FROM user u LEFT JOIN order o ON u.userid=o.userid GROUP BY u.userid

 

但不幸,這條語句不符合GROUP BY要求,必須把SELECT中出現,但沒使用聚合函數的字段u.username,u.city加入到GROUP BY 子句中,咱們其實不關心是否對這2個字段聚合,聚合這2字段對咱們指望的結果意義也不大,但不寫會報錯,因而一般會寫成:基礎

SELECT u.userid,u.username,u.city,SUM(o.OrderTatal) AS total FROM user u LEFT JOIN order o ON u.userid=o.userid GROUP BY u.userid,u.username,u.city

 

這種列稱爲功能依賴列,這樣寫也知足了要求,但一個不足是咱們真正關心的彙總條件被淹沒了。若是時間隔得久一點或是語句複雜一點,你有把握區分出實際上是多餘的功能依賴列嗎?咱們要按每一個user彙總,也要區分具體city?有時你不得不去了解整個查詢的基礎。


改進這種類型的GROUP BY,不要讓真正關心的彙總條件被淹沒。改進後的語句:

SELECT u.userid,u.username,u.city,o.total FROM user u LEFT JOIN (SELECT t.userid,SUM(t.OrderTotal) AS Total FROM Order AS t GROUP BY t.userid) AS o ON u.userid=o.userid;
相關文章
相關標籤/搜索