1.聚合查询

     ①聚合查询,它可以快速获得结果。可以使用SQL内置的 COUNT() 函数统计查询结果集的记录个数。例如:查询 students表一共有多少条记录为。

SELECT COUNT(*) FROM students;    # COUNT(*)和COUNT(id)实际上是一样的效果。
# 查询结果
COUNT(*)      # 结果集的列名
 10

  查询的结果仍然是一个二维表,只是这个二维表只有一行一列,并且列名是 COUNT(*)。

    ② 通常,使用聚合查询时,应该给结果集的列名设置一个别名,便于处理结果。

SELECT COUNT(*) num FROM students;   -- 使用聚合查询并设置结果集的列名为num

    ③ 聚合查询同样可以使用WHERE条件,例如统计出有多少男生。

SELECT COUNT(*) boys FROM students WHERE gender = 'M';  # boys是结果集列别名

    ④ 除了COUNT()函数外,SQL还提供了如下聚合函数:

函数          	说明
SUM	         计算某一列的合计值,该列必须为数值类型
AVG              计算某一列的平均值,该列必须为数值类型
MAX	         计算某一列的最大值
MIN	         计算某一列的最小值

        注意:MAX() 和 MIN()函数并不限于数值类型。如果是字符类型,MAX() 和 MIN() 会返回 排序最后 和 排序最前 的字符。

    ⑤ 统计男生的平均成绩,使用聚合查询:

SELECT AVG(score) average FROM students WHERE gender = 'M';
 -- 结果集列别名 averag

        主要注意:如果聚合查询的 WHERE 条件没有匹配到任何行,COUNT()会返回0,而SUM()、AVG()、MAX()和MIN()会返回NULL。

     练习1:

        每页3条记录,如何通过聚合查询获得总页数?( C )

A.SELECT COUNT(*) / 3 FROM students;

B.SELECT FLOOR(COUNT(*) / 3) FROM students;

C.SELECT CEILING(COUNT(*) / 3) FROM students;

   ⑥ 分组聚合

        对于聚合查询,SQL还提供了“分组聚合”的功能。分组聚合其实就是先按要求分好组,再统计每组的记录个数。例如:要统计每个班的学生数量。

SELECT class_id, COUNT(*) num FROM students GROUP BY class_id;

        GROUP BY子句指定了按 class_id 分组,因此,执行该SELECT语句时,会把class_id相同的列先分组,再分别计算,为了查看每个班的人数可以把 class_id 列也放入结果集中。

   ⑦ 聚合查询的列中,只能放入分组的列。执行下面这条查询会得到一个语法错误,因为在任意一个分组中,只有class_id 都相同,name 是不同的,SQL引擎不能把多个 name 的值放入一行记录中。因此,会报语法错。

SELECT name, class_id, COUNT(*) num FROM students GROUP BY class_id; 
# name不是分组的列,所以会报语法错误

  ⑧ 使用多个列进行分组。例如:想统计各班的男生和女生人数。

-- 按class_id, gender分组:
SELECT class_id, gender, COUNT(*) num FROM students GROUP BY class_id,  gender;

 练习2:

          请使用一条SELECT查询查出每个班级的平均分,注意:分组的是班级。

SELECT class_id, AVG(score) average FROM students GROUP BY class_id;

练习3:

          请使用一条SELECT查询查出每个班级男生和女生的平均分,注意:分组是班级和性别。

SELECT class_id, gender, AVG(score) average FROM students GROUP BY class_id, gender;