![62af2111363879626f017bddcecef0e0.png](https://i-blog.csdnimg.cn/blog_migrate/ff253491cb54ba5a8796a0b65a1d5a7e.jpeg)
一、SQL聚合函数
- AVG() - 返回集合的平均值。
- COUNT() - 返回集合中的项目数。
- MAX() - 返回集合中的最大值。
- MIN() - 返回集合中的最小值
- SUM() - 返回集合中所有或不同值的总和。
除COUNT()函数外,SQL聚合函数忽略null值。
这里在mayan:SQL初体验建立的数据库基础之上进行操作
ex:
1.查询课程编号为"0002"的总成绩
![9fe440fad28d3d821f2021dbc54257b6.png](https://i-blog.csdnimg.cn/blog_migrate/dfe76da4d1b19351f559b4fd41728e76.jpeg)
2.查询选课学生总数
![3ceae4e2ff50b3519c0451692bafedd0.png](https://i-blog.csdnimg.cn/blog_migrate/5abba0f6a4686f406e09201791d56533.jpeg)
二、分组
因为聚合函数对一组值进行操作,所以它通常与SELECT语句的GROUP BY子句一起使用。 GROUP BY子句将结果集划分为值分组,聚合函数为每个分组返回单个值。基本语句结构如下:
SELECT c1, aggregate_function(c2)
FROM table
WHERE ...
GROUP BY c1
![8ce7d6de1ea9e4cba8f2cc6a5bc26498.png](https://i-blog.csdnimg.cn/blog_migrate/d834fb57a2d90c78766d6d86bcab07be.jpeg)
ex:
1.查询各科成绩最高和最低分
![a4571747f05b022e80d5adefbbb1386d.png](https://i-blog.csdnimg.cn/blog_migrate/9d5e1c76445fd9df4cdd03aff630de74.jpeg)
2.查询每门课程被选修学生数
![f8db03d2a957bf7172013bc5d129cac4.png](https://i-blog.csdnimg.cn/blog_migrate/5dca2063dc7933822bdaabfae24aba99.jpeg)
3.查询男生女生人数
![5a31f9db9656e62716fc50c303e98222.png](https://i-blog.csdnimg.cn/blog_migrate/8941f9f3eb9df7568188eab6218df698.jpeg)
三、对分组结果指定条件
![9e189ae12875c33ad7416c7cd8bc54ad.png](https://i-blog.csdnimg.cn/blog_migrate/f8ff088d89f2f893704ec83035afee00.jpeg)
ex:
1.查询平均成绩大于60分学生的学号和平均成绩
![825f93f705e499840c6f2a24b439b22e.png](https://i-blog.csdnimg.cn/blog_migrate/25e51d5d440a90f656aeee1fe8ac9be1.jpeg)
2.查询至少选修两门课程的学生学号
![f9a952dbf0f84b7147ae86316f4a1659.png](https://i-blog.csdnimg.cn/blog_migrate/3d8bfde9e236df67afad55259920e612.jpeg)
3.查询同名同姓学生名单并统计同名人数
![d994b5cd67c5e3e53fbb7b4f996f585b.png](https://i-blog.csdnimg.cn/blog_migrate/7d38e6817dad4eba58bb1cc4bff4f444.jpeg)
四、如何用SQL解决业务问题
- 翻译成大白话
- 写出分析思路
- 写出对应SQL语句
ex:如何计算平均成绩大于80的各科成绩
1.如何计算每门课程平均成绩,并且平均成绩大于等于80分
2.
![09aee5c4e905a99099cd65e4552892bb.png](https://i-blog.csdnimg.cn/blog_migrate/4c0488c28d2674c0c68a0625faefb8ff.jpeg)
3.
![f85513525d179be5b553ad7bbd69663a.png](https://i-blog.csdnimg.cn/blog_migrate/99f36a140dc840143d2a1760ecfe94a2.jpeg)
五、对查询结果排序
1.运用函数
降序(从大到小):desc
升序(从小到大):asc
2.示例
![cf9879946512e8bc74906d3fd7fa91ed.png](https://i-blog.csdnimg.cn/blog_migrate/da6174a3e639d2132e8de3e76323ceb5.jpeg)
![9192cd668a87b699e28666b8ed995198.png](https://i-blog.csdnimg.cn/blog_migrate/aacf62200c2cb4e0f1600d80b814637b.jpeg)
![c766fa88c1ef48012ac78aa80676f9ec.png](https://i-blog.csdnimg.cn/blog_migrate/e6fb9a351540342b2ca4aa7cc74b359b.jpeg)
![00eac0a08b40231a43f130f68297001f.png](https://i-blog.csdnimg.cn/blog_migrate/3dc8b9ac0e5fefa99b0b33d1d50d93c6.jpeg)
![ad74849d3bcc4d04c288a79a90a10f7e.png](https://i-blog.csdnimg.cn/blog_migrate/6a84289670ed2d171e1703b059ba8465.jpeg)
![a4bfd82463e9a5076209f618561a61de.png](https://i-blog.csdnimg.cn/blog_migrate/45f6573216cdaf6294a127b6e32e4127.jpeg)
3.ex:
3.1.查询及格课程并按课程号从大到小排列
![189f7c56638544c3c7dd741808eb86c3.png](https://i-blog.csdnimg.cn/blog_migrate/d13dbf5cda53d3f72477df9d521925e9.jpeg)
注意:Where 是一个约束声明,使用Where约束来自数据库的数据,Where是在结果返回之前起作用的,Where中不能使用聚合函数。
Having是一个过滤声明,是在查询返回结果集以后对查询结果进行的过滤操作,在Having中可以使用聚合函数。
在查询过程中聚合语句(sum,min,max,avg,count)要比having子句优先执行。而where子句在查询过程中执行优先级高于聚合语句。
HAVING子句可以让我们筛选成组后的各组数据,WHERE子句在聚合前先筛选记录.也就是说作用在GROUP BY 子句和HAVING子句前;而 HAVING子句在聚合后对组记录进行筛选。HAVING一般与GROUP BY连用。
3.2查询每门课程的平均成绩,结果按平均成绩升序排序。平均成绩相同时,按课程号降序排列
![b12488d0f58127b0c3a107d92dc61b45.png](https://i-blog.csdnimg.cn/blog_migrate/6e4efed0142c246dc9cf619de6ef8d94.jpeg)
五、如何看懂SQL报错信息
![bf190d658d1f2ea39a97a3ae57d7ee9d.png](https://i-blog.csdnimg.cn/blog_migrate/8874740a376f25e8560356ef5bfebf38.jpeg)
![e641f59f99f185facd4652c11d4b7af9.png](https://i-blog.csdnimg.cn/blog_migrate/7d292032750c67aa82ca13a2dc086981.jpeg)
六、总结
![28ecf9396c7ab92d33e46b27348dfc2b.png](https://i-blog.csdnimg.cn/blog_migrate/a91f6817898ce816d5f000bd480fc61e.jpeg)