如果我们要统计一张表的数据量,例如,想查询students表一共有多少条记录,难道必须用SELECT * FROM students查出来然后再数一数有多少行吗?
这个方法当然可以,但是比较弱智。对于统计总数、平均数这类计算,SQL提供了专门的聚合函数,使用聚合函数进行查询,就是聚合查询,它可以快速获得结果。
仍然以查询students表一共有多少条记录为例,我们可以使用SQL内置的COUNT()函数查询:
![9643c70b6540c71f6e8099dbdb62e3b8.png](https://i-blog.csdnimg.cn/blog_migrate/27814a54410c074b2c16b4e5ddacf2ad.jpeg)
COUNT(*)表示查询所有列的行数,要注意聚合的计算结果虽然是一个数字,但查询的结果仍然是一个二维表,只是这个二维表只有一行一列,并且列名是COUNT(*)。
通常,使用聚合查询时,我们应该给列名设置一个别名,便于处理结果:
![55c65b2a495b171e204bc8f1b0c45f82.png](https://i-blog.csdnimg.cn/blog_migrate/c60a3192641f2806ac4d86859e5e690a.jpeg)
![2c89ff4c69a2b507f19eb9efa13191fa.png](https://i-blog.csdnimg.cn/blog_migrate/c4cc994330b84b524ef18a766e568867.jpeg)
分组
如果我们要统计一班的学生数量,我们知道,可以用SELECT COUNT(*) num FROM students WHERE class_id = 1;。如果要继续统计二班、三班的学生数量,难道必须不断修改WHERE条件来执行SELECT语句吗?
对于聚合查询,SQL还提供了“分组聚合”的功能。我们观察下面的聚合查询:
![1fa3be94a28ab755ca4f01fa16ad7cdb.png](https://i-blog.csdnimg.cn/blog_migrate/3685452413ec49342b82798d4b23f13f.jpeg)
执行这个查询,COUNT()的结果不再是一个,而是3个,这是因为,GROUP BY子句指定了按class_id分组,因此,执行该SELECT语句时,会把class_id相同的列先分组,再分别计算,因此,得到了3行结果。
但是这3行结果分别是哪三个班级的,不好看出来,所以我们可以把class_id列也放入结果集中:
![f0b01bcd0a4d86b2099577d5c6dc8e64.png](https://i-blog.csdnimg.cn/blog_migrate/5fbfd34bba3bcdeb64580f6bd063a6a1.jpeg)
![726eebb48c786e5f83910f0dcf8a444d.png](https://i-blog.csdnimg.cn/blog_migrate/1f4523bd47ee55629c2cd094dcf1a5ac.jpeg)
![2cf80959801bbdd5b7f660cb6faeeb74.png](https://i-blog.csdnimg.cn/blog_migrate/485952e7bc22dfda3643a5eeb9b1b3ab.jpeg)
小结
使用SQL提供的聚合查询,我们可以方便地计算总数、合计值、平均值、最大值和最小值;
聚合查询也可以添加WHERE条件。