文章目录

1、分组的概念

(1)就是按照字段的值进行划分组别并去除重复值。比如将性别进行分组,正常情况下则可以分成两组,一组是男性,一组是女性。

--按性别进行分组,查看性别
SELECT SEX
FROM STU
GROUP BY

(2)注意
分组查询的字段只能是该分组字段;
或者是使用 聚合函数 的按照该分组之后的字段。

--错误:
SELECT *
FROM STU
GROUP BY SEX

SELECT CLASS,BIRTH
FROM STU
GROUP BY SEX

--正确:
SELECT SEX
FROM STU
GROUP BY SEX

SELECT SEX,COUNT(CLASS),COUNT(BIRTH)
FROM STU
GROUP BY

2、聚合函数与分组配合使用

(1)统计 生物01 班级的女生人数

SELECT CLASS,COUNT(*) AS '女生人数'
FROM STU
WHERE CLASS='生物01' AND SEX='女'
GROUP BY CLASS

SELECT * FROM

SQL数据库语言基础之SqlServer分组查询总结_database


先进行GROUP分组,分成5个组;

再在每个组中找WHERE条件,CLASS=‘生物01’ AND SEX=‘女’;

最后列出CLASS行和对应满足WHERE条件的数量。(2)错误示范

SQL数据库语言基础之SqlServer分组查询总结_数据分析_02


不分组是无法筛选出同时满足 字段和聚合函数 条件的结果。

3、查询数据的直方图(REPLICATE())

查询选课的人数直方图:

SELECT H_CNO,REPLICATE('*', COUNT(*)*3) AS '选课人数'
FROM HOMEWORKS
GROUP BY

SQL数据库语言基础之SqlServer分组查询总结_database_03


REPLICATE()函数中的第一个参数是直方图表示的符号,第二个参数是每计算一个COUNT则增长的数量,*3表示增长3个。

因此K411表示3个人,K422表示2个人……

此外,还需要按照课程号进行分组,再每个分组(课程)中进行统计人数。

4、排序分组结果(ORDER BY放在分组后面)

按照统计的选修每个课程的人数量进行降序排列:

SELECT H_CNO,REPLICATE('*', COUNT(*)*3) AS '选课人数'
FROM HOMEWORKS
GROUP BY H_CNO
ORDER BY COUNT(*) DESC

SELECT * FROM

SQL数据库语言基础之SqlServer分组查询总结_数据库_04

5、反转查询(CASE与分组的结合)

将每个班级的男生与女生人数统计出来:

SELECT CLASS,
COUNT(case
when SEX='男' then 1
else NULL end) AS '男生人数',
COUNT(case
when SEX='女' then 1
else NULL end) AS '女生人数'
FROM STU
GROUP BY CLASS

SELECT * FROM

SQL数据库语言基础之SqlServer分组查询总结_数据分析_05

6、两个分组条件(前面的优先级高)

SELECT CLASS,COUNT(SNAME) AS '人数'
FROM STU
GROUP BY CLASS

SELECT CLASS,COUNT(SNAME) AS '人数'
FROM STU
GROUP BY CLASS,SEX

SQL数据库语言基础之SqlServer分组查询总结_sql_06


当有2个分组条件时,前面的分组条件优先级高,也就是先按照前面的字段进行分组,再按照后面的字段进行分组。

7、HAVIG子句分组条件(只查询分组的某些字段)

分组查询时将其他字段信息过滤掉,这样就可以针对性得查询字段。与where不同的是,having是在分组时就筛选出某些字段值,也就是确定了哪些分组。

having是在分组时筛选组,where是筛选结果。不过二者在很多时候可以相互替换。

注意:having中可以使用聚合函数,而where中不可以使用聚合函数。

查询 爆破01 和 生物01 班级的人数:

SELECT CLASS,COUNT(*) AS '人数'
FROM STU
GROUP BY CLASS
HAVING CLASS IN('爆破01','生物01')
ORDER BY COUNT(*) DESC

SQL数据库语言基础之SqlServer分组查询总结_sql_07

8、where、having、group by、order by的顺序

(1)SELECT
(2)FROM
(3)WHERE
(4)GROUP BY
(5)HAVING
(6)ORDER BY