聚合查询

    这个方法当然可以,但是比较弱智。对于统计总数、平均数这类计算,SQL提供了专门的聚合函数,使用聚合函数进行查询,就是聚合查询,它可以快速获得结果。

    仍然以查询students表一共有多少条记录为例,我们可以使用SQL内置的COUNT()函数查询:

    COUNT()表示查询所有列的行数,要注意聚合的计算结果虽然是一个数字,但查询的结果仍然是一个二维表,只是这个二维表只有一行一列,并且列名是COUNT()

    通常,使用聚合查询时,我们应该给列名设置一个别名,便于处理结果:

    聚合查询 - 图1

    COUNT(*)COUNT(id)实际上是一样的效果。另外注意,聚合查询同样可以使用WHERE条件,因此我们可以方便地统计出有多少男生、多少女生、多少80分以上的学生等:

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

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

    要统计男生的平均成绩,我们用下面的聚合查询:

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

    聚合查询 - 图2

    如果我们要统计一班的学生数量,我们知道,可以用SELECT COUNT(*) num FROM students WHERE class_id = 1;。如果要继续统计二班、三班的学生数量,难道必须不断修改WHERE条件来执行语句吗?

    对于聚合查询,SQL还提供了“分组聚合”的功能。我们观察下面的聚合查询:

    聚合查询 - 图3

    执行这个查询,COUNT()的结果不再是一个,而是3个,这是因为,GROUP BY子句指定了按class_id分组,因此,执行该SELECT语句时,会把class_id相同的列先分组,再分别计算,因此,得到了3行结果。

    但是这3行结果分别是哪三个班级的,不好看出来,所以我们可以把class_id列也放入结果集中:

    这下结果集就可以一目了然地看出各个班级的学生人数。我们再试试把name放入结果集:

    聚合查询 - 图4

    注意:AlaSQL并没有严格执行SQL标准,上述SQL在浏览器可以正常执行,但是在MySQL、Oracle等环境下将报错,请自行在MySQL中测试。

    也可以使用多个列进行分组。例如,我们想统计各班的男生和女生人数:

    上述查询结果集一共有6条记录,分别对应各班级的男生和女生人数。

    请使用一条SELECT查询查出每个班级的平均分:

    聚合查询 - 图5

    请使用一条SELECT查询查出每个班级男生和女生的平均分:

    使用SQL提供的聚合查询,我们可以方便地计算总数、合计值、平均值、最大值和最小值;

    聚合查询也可以添加WHERE条件。

    聚合查询 - 图6