公司的實習生小夥子不理解group by,我就發表一下自己的拙見,順便當作筆記,日後常加翻閱。
記住下面三句話即可!
1、分組的作用就是為了做聚合,不聚合的分組有什麼意義呢!
2、分組的select中「如果存在」字段,那麼select中的字段必須和分組條件中的字段「完全一致」,否則查詢出來的結果沒有意義!
3、分組的聚合函式的引數可以是任何內容,不一定必須是分組條件中的字段!
-- 例子
mysql>
select
*from tb_user;
+----+------+--------+--------+
| id | name | gender |
status|+
----+------+--------+--------+|1
| 張三 | 男 |1|
|2| 李四 | 女 |1|
|3| 王五 | 男 |0|
|4| 趙六 | 女 |1|
|5| 田七 | 男 |0|
+----+------+--------+--------+
-- 查詢結果沒有意義
mysql>
select
*from tb_user group
by gender;
+----+------+--------+--------+
| id | name | gender |
status|+
----+------+--------+--------+|2
| 李四 | 女 |1|
|1| 張三 | 男 |1|
+----+------+--------+--------+
-- 這麼寫是有一點意義的。就是可以看出gender欄位的取值有幾種,意義不大。
mysql>
select gender from tb_user group
by gender;
+--------+
| gender |
+--------+
| 女 |
| 男 |
+--------+
-- 查詢結果沒有意義
mysql>
select gender,
status
from tb_user group
by gender,
status;+
--------+--------+
| gender |
status|+
--------+--------+
| 女 |1|
| 男 |0|
| 男 |1|
+--------+--------+
-- 分組和聚合函式配合才有意義,下面是典型的分組查詢
mysql>
select gender,
count(1
)from tb_user group
by gender;
+--------+----------+
| gender |
count(1
)|+--------+----------+
| 女 |2|
| 男 |3|
+--------+----------+
-- select中沒有group by後面的字段,查詢結果無意義
mysql>
select
`name`
from tb_user group
by gender;
+------+
| name |
+------+
| 李四 |
| 張三 |
+------+
-- 這尼瑪還是沒有意義
mysql>
select
`name`
,gender from tb_user group
by gender;
+------+--------+
| name | gender |
+------+--------+
| 李四 | 女 |
| 張三 | 男 |
+------+--------+
-- select後面如果有欄位,就必須和group by後面的字段完全一致。下面不一致,查詢結果沒有意義。
-- 下面的count()函式的引數不用非得寫為gender,因為count()計算的是每組的所有記錄。
-- group by是將乙個表拆分成多個表,聚合函式是將多條記錄合併成一條結果集。因此分組之後count(),就計算出了每組一共多少條記錄。
mysql>
select
`name`
,gender,
count(1
)from tb_user group
by gender;
+------+--------+----------+
| name | gender |
count(1
)|+------+--------+----------+
| 李四 | 女 |2|
| 張三 | 男 |3|
+------+--------+----------+
-- 下面是乙個典型的分組語句。
-- select後面「如果有」字段,那麼必須和group by的字段「完全一致」。
-- 分組的聚合函式中可以寫任何內容,就當作一張完整的小表來進行聚合即可。
-- 見下圖。
mysql>
select gender,
count(1
)from tb_user group
by gender;
+--------+----------+
| gender |
count(1
)|+--------+----------+
| 女 |2|
| 男 |3|
+--------+----------+
如何理解group by
寫在前面的話 用了好久group by,今天早上一覺醒來,突然感覺group by好陌生,總有個筋別不過來,為什麼不能夠select from table group by id,為什麼一定不能是 而是某乙個列或者某個列的聚合函式,group by 多個字段可以怎麼去很好的理解呢?不過最後還是轉過來...
理解group by(小示例)
group by 是分組查詢,一般 group by 是和 聚合函式配合使用,你可以想想 用了group by 按 item.itemnum 這個字段分組,那其他字段內容不同,變成一對多又改如何顯示呢,比如下面所示 a b 1 abc 1 bcd 1 asdfg select a,b from ta...
理解GROUP BY和聚合函式
先來看下表1,表名為test 表1執行如下sql語句 selectnamefromtest groupbyname 你應該很容易知道執行的結果,沒錯,就是下表2 表2可是為了能夠更好的理解 group by 多個列 和 聚合函式 的應用,我建議在思考的過程中,由表1到表2的過程中,增加乙個虛構的中間...