一般情況下, mysql中使用group by,是為了聚合計算, 所以通常情況下, group by 會和聚集函數(sum(), avg(), min(), max(), count() )聯合使用,另外group by 通常會和關鍵字having配合使用.
另外作為篩選的還有where, 如果group by having 和 where都要使用的話, where先寫, group by 后寫,具體特點如下:
①查詢列表往往是 分組函數和被分組的字段 ★
②分組查詢中的篩選分為兩類
篩選的基表 使用的關鍵詞 位置
分組前篩選 原始表 where group by 的前面
分組后篩選 分組后的結果集 having group by的后面
eg:
SELECT COUNT(*),manager_id
FROM employees
WHERE manager_id IS NOT NULL
GROUP BY manager_id;
然后再來說一下關於group by的理解:
首先看一下表一:
當執行該條sql時:
SELECT name FROM test
GROUP BY name
會得到如下結果:
將這個sql分解一下,首先執行:
FROM test
GROUPBY name
這個過程我們理解為生成一個虛擬表3:
就是將name相同的多行數據,合並成一行數據.
然后執行:
select name
得到結果:
ps:執行select * 的話, 之前的版本好像是會報錯.但是我現在用的5.7.37是可以執行成功,但是這樣寫其實是有問題的, 因為name相同得id不止一行,現在應該是只返回了name相同的第一個id,number也是一樣.
因為相同的name對應多個id和name,所以這時用 * 輸出是不合理的, 這就用到了聚集函數來處理,例如count(),sun()等等
例如:
select name,sum(number)
from test
group by name
結果如下:
但是如果要用到group by多個字段的話, 就把多個字段看成一個整體,當多個字段都相同的時候才認為相同.
如group by name,number,我們可以把name和number 看成一個整體字段,以他們整體來進行分組的。如下圖:
接下來就可以配合select和聚合函數進行操作了。如執行select name,sum(id) from test group by name,number,結果如下圖:
一般情況下, group by 字段1, select 的字段中也會有字段1.
參考文章: https://blog.csdn.net/qq403580298/article/details/90756352
接下來是關於having子句.
having 是作為分組后的篩選條件,與group by搭配使用, 可以這樣理解,如果不是group by 后面的分組就是用where作為篩選條件, 如果是group by前面的篩選條件就是用where
簡單來說就是: 分組之前篩選用where, 分組之后篩選用having
所以最重要的就是判斷該篩選條件是在分組前還是分組后,如果篩選條件是和分組有關的聚合函數()相關的,那么就是分組之后的篩選
eg:
案例2:每個工種有獎金的員工的最高工資>12000的工種編號和最高工資
SELECT job_id,MAX(salary)
FROM employees
WHERE commission_pct IS NOT NULL
GROUP BY job_id
HAVING MAX(salary)>12000;
這里的最高工資>12000 就是和聚合函數相關的,所以就是分組之后的.
有時候group by之后還需要排序,一般情況下,先分組后排序.
本人新手,肯定有理解錯誤的地方,還請大家不吝賜教,多多給予批評指正!
萬般感謝!!!