一、不相容的語法問題。
先看使用如下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...