SQL Group By & Having
1. 定義
慕課解釋:
Group By
用于數(shù)據(jù)分組,一般與聚合函數(shù)一起使用,對(duì)分組后的數(shù)據(jù)進(jìn)行聚合操作。由于 Where 無(wú)法與聚合函數(shù)一起搭配使用,因此 SQL 增加Having
指令。
2. 前言
本小節(jié),我們將一起學(xué)習(xí)Group By
和Having
。
SQL 不僅提供數(shù)據(jù)操作功能相關(guān)的指令,而且也提供了一些指令進(jìn)行數(shù)據(jù)統(tǒng)計(jì)和分析。如,Group By 提供了分組功能對(duì)數(shù)據(jù)分門(mén)別類,Having 可以與聚合函數(shù)搭配用于篩選數(shù)據(jù)。
本小節(jié)測(cè)試數(shù)據(jù)如下,請(qǐng)先在數(shù)據(jù)庫(kù)中執(zhí)行:
DROP TABLE IF EXISTS imooc_user;
CREATE TABLE imooc_user
(
id int PRIMARY KEY,
username varchar(20),
age int,
score int
);
INSERT INTO imooc_user(id,username,age,score)
VALUES (1,'peter', 18, 100),(2,'pedro', 24, 500),
(3,'jerry', 24, 500),(4,'mike', 18, 100),(5,'tom', 20, 1000);
提示: 如果你還不熟悉聚合函數(shù),請(qǐng)先閱讀聚合函數(shù)小節(jié)。
3. Group By
Group By 會(huì)根據(jù) By 后面的數(shù)據(jù)字段來(lái)分組,并且根據(jù)給定的聚合函數(shù)來(lái)分組進(jìn)行聚合操作。
使用語(yǔ)法如下:
SELECT [agg] FROM [table_name] GROUP BY [col];
其中agg
表示聚合函數(shù),table_name
表示數(shù)據(jù)表名稱,col
表示字段名稱。
3.1 例1 單字段Group By
請(qǐng)書(shū)寫(xiě) SQL 語(yǔ)句,將imooc_user
表中的用戶通過(guò)age
進(jìn)行分組,并返回每個(gè)分組的用戶數(shù)。
分析:
題干中明確指出根據(jù) age 進(jìn)行分組,因此 Group By 應(yīng)該后接 age,統(tǒng)計(jì)每個(gè)分組的用戶數(shù)使用聚合函數(shù) Count。
語(yǔ)句:
整理可得語(yǔ)句如下:
SELECT age, COUNT(*) FROM imooc_user GROUP BY age;
結(jié)果如下:
+-----+----------+
| age | COUNT(*) |
+-----+----------+
| 18 | 2 |
| 24 | 2 |
| 20 | 1 |
+-----+----------+
提示:
COUNT(*)
在數(shù)據(jù)庫(kù)層面有專門(mén)的優(yōu)化,其性能跟COUNT(1)
大致相同。
3.2 例2 多字段 Group By
Group By 不僅支持單字段分組,同時(shí)也支持多字段分組。
請(qǐng)書(shū)寫(xiě) SQL 語(yǔ)句,使用 age 和 score 字段對(duì)imooc_user
表中的用戶進(jìn)行分組,并返回每個(gè)分組的用戶數(shù)。
分析:
題干中明確指出根據(jù) age 和 score 進(jìn)行分組,因此 Group By 應(yīng)該后接 age,score,統(tǒng)計(jì)每個(gè)分組的用戶數(shù)使用聚合函數(shù) Count。
語(yǔ)句:
整理可得語(yǔ)句如下:
SELECT age, score, COUNT(*) FROM imooc_user GROUP BY age, score;
結(jié)果如下:
+-----+-------+----------+
| age | score | COUNT(*) |
+-----+-------+----------+
| 18 | 100 | 2 |
| 24 | 500 | 2 |
| 20 | 1000 | 1 |
+-----+-------+----------+
4. Having
Having 不能單獨(dú)出現(xiàn),須于聚合函數(shù)搭配使用,且常與 Group By 一起出現(xiàn)。Having 本身并無(wú)其他含義,它的主要功能是替代 Where。
使用語(yǔ)法如下:
SELECT [agg] FROM [table_name] GROUP BY [col] HAVING [condition];
其中agg
表示聚合函數(shù),table_name
表示數(shù)據(jù)表名稱,col
表示字段名稱,condition
表示過(guò)濾條件。
4.1 例3 使用 Having
請(qǐng)書(shū)寫(xiě) SQL 語(yǔ)句,將imooc_user
表中的用戶通過(guò) age 進(jìn)行分組,并返回每個(gè)分組的用戶數(shù),且每個(gè)分組的用戶數(shù)必須大于1
。
分析:
題干中明確指出根據(jù) age 進(jìn)行分組,因此 Group By 應(yīng)該后接 age,統(tǒng)計(jì)每個(gè)分組的用戶數(shù)使用聚合函數(shù) Count,且使用 Having 過(guò)濾。
語(yǔ)句:
整理可得語(yǔ)句如下:
SELECT age, COUNT(*) FROM imooc_user GROUP BY age HAVING COUNT(*) > 1;
結(jié)果如下:
+-----+----------+
| age | COUNT(*) |
+-----+----------+
| 18 | 2 |
| 24 | 2 |
+-----+----------+
5. 小結(jié)
- Group By 和 Having 常被用于數(shù)據(jù)分析和統(tǒng)計(jì),是可視化和報(bào)表的利器。
- Having 局限于聚合函數(shù),它無(wú)法使用在其它場(chǎng)景下。