group by 深入總結

2021-06-22 15:41:39 字數 2651 閱讀 5602



一、不相容的語法問題。

先看使用如下sql:select count(*),town from `players` 結果會報錯。從這裡涉及到sql的乙個原則:值的集合與乙個行mysql認為是不相容的。這裡,count(*)的結果是乙個值。而town列出的結果是很多行,也就是值組成的集合。所以,兩者不不相容的。

而如果加上group by,就不一樣了,如下:

select count(*),town from `players` group by ***

上面的sql,並沒有報錯。因為使用了group by子句後,count(*),town所顯示的結果不一樣了。count((*)是根據group by子句的要求進行聚合,結果是值組成的集合。右邊顯示對應的城市(雖然不一定正確和得出子句想要的結果,但語法上通過的)。最後,sql所表示的實際意思是:統計出每個性別所對應多少行。

二、更好地理解group by的內部機制

假如語句是 select ***,name from `players` group by ***

結果如下:

name     ***

王滔  "空值"     

劉惠   女

王小明 男

假如語句是 select name from `players` group by ***

結果如下:

name

王滔劉惠

王小明假如語句是 select *** from `players` group by ***,

結果就是:

***

"空值"女男

理解:group by的原理是將其指定列的值一致的行歸為一組。那麼,空值也歸為一組。

實質上,使用了group by,上面三個sql語句原理是一樣的,只是select子句告訴mysql需要的取出的列有不同

select *** from `players` group by *** 與 select ***,name from `players` group by ***沒什麼區別。

因為group by已經指定了操作方式,select需要顯示行的那些列,隨時指定。可以理解早就按照group by的要求將所有行就已經分組好了,之後根據需要取每行的哪一列的值了。

通俗理解group by:根據group by指定的列,列值如果相同行劃分到一組中去。

一直認為,使用group by顯示最後的結果應該是下面這樣的:

字段值   a組

字段值   a組

字段值   b組

字段值   b組

實際情況卻不是這樣

先看測試的乙個例子

group by指定乙個字段:select * from `fanwe_goods` group by cate_id

大致結果顯示類似:

cate_id 其他欄位....

40       ....

41       ....

46       ....

48       ....

說明,根據類別cate_id進行分組。結果,每個類只顯示了一行資料。

group by指定多個字段:select * from `fanwe_goods` group by cate_i,city_id

結果是將多行取出來了(整個表的所有行沒有取出)。結果類似:

cate_id   city_id

40     16

40     20

41     16

41     20

還有一些行和其他欄位的值省略了

看cate_id和city_id的值,都有重複的值。不知道怎麼計算的,取出的結果還是有意外。

結論:1.group by 後面指定的列不止乙個。當我使用如下語句時,也出現了多行的結果(將該組的所有行都列出來了):

select * from players group by ***, town

2.假如group by 後面只指定了一列,那麼即使乙個組有多行值。也不會全部取出,只取出乙個。這樣的情況,是什麼原因?

3.分組後,如果select子句想取出某個字段,那麼它不可能將都屬於a組的記錄都取出來。只是從a組中取出乙個代表性的值出來。不知道原因,大概是:已經按照group by的規則進行分組後,如果想取出所有

資料,mysql變得無所適從。group by只有在需要進行統計的的時候非常有效。

"group by 字段列表"

表示根據後面的字段來分組,如果只有1個字段,那只是根據這個欄位的值來進行一次分組就可以了;若後面有多個字段,那表示根據多字段的值來進行層次分組,分組層次從左到右,即先按第1個字段分組,然後在第1個字段值相同的記錄中,再根據第2個字段的值進行分組;接著第2個字段值相同的記錄中,再根據第3個字段的值進行分組......依次類推。

使用經驗:group by常常跟聚合函式count進行使用,這樣實現按照分組進行統計的效果。比如:需要統計每個地方的商品數量。那麼就按照地方進行分組(同乙個地方的先劃到一組中),之後使用統計函式,就

是針對組的成員進行統計了。

進行分組之後的好處,是方便按組別進行統計,並不能實現像上面效果(按組別顯示出所有行)。如果不是需要進行統計,使用group by,我認為就沒有實際意義,因為此時取出的結果比較意外,並不是自己想

要的。也得不到如下結果:

字段值   a組

字段值   a組

字段值   b組

字段值   b組

group by 深入總結

這裡寫鏈結內容 一 不相容的語法問題。先看使用如下sql select count town fromplayers結果會報錯。從這裡涉及到sql的乙個原則 值的集合與乙個行mysql認為是不相容的。這裡,count 的結果是乙個值。而town列出的結果是很多行,也就是值組成的集合。所以,兩者不不相...

group by後使用rollup子句總結

完後感覺也沒什麼的,很簡單的。下面按我的理解簡單總結一下 一 如何理解group by後帶rollup子句所產生的效果 group by後帶rollup子句的功能可以理解為 先按一定的規則產生多種分組,然後按各種分組統計資料 至於統計出的資料是求和還是最大值還是平均值等這就取決於select後的聚合...

group by 後使用 rollup 子句總結

一 如何理解group by後帶 rollup子句所產生的效果 group by 後帶 rollup 子句的功能可以理解為 先按一定的規則產生多種分組,然後按各種分組統計資料 至於統計出的資料是求和還是最大值還是平均值等這就取決於select後的聚合函式 因此要搞懂group by 後帶 rollu...