![62f9f12b577bc17511671c7e6affe0b5.png](https://i-blog.csdnimg.cn/blog_migrate/0591c86c24e84b382bd68cfc9b230bf4.jpeg)
一、聚合函数
1 count()求某列的行数
2. sum()对某列求和
3. avg() 对某列求均值
4. max(),min() 对某列求最大值和最小值
以上是5个最常用的聚合函数,返回满足要求的数值。
下图显示是这5个的功能,简单起见,我就写在一起,请注意别名的使用。
![60b845de4192cc65620883014622cc5a.png](https://i-blog.csdnimg.cn/blog_migrate/edfa814906a02a1127f1dc890f3cbbc2.png)
需要注意,所有汇总(聚合)函数后用的是*,那么会把空值也计算入内;否则,如果汇合函数有具体的列名;sum 和avg 只能计算数值类型,不能对字符串进行操作。汇总函数是支持distinct 这个去重操作的。
再举例如下: 查询课程编号为0002 的总成绩; 查询选了课程的学生人数,分别如下
![71b9d471b1fce3121b0942d1d4471bb9.png](https://i-blog.csdnimg.cn/blog_migrate/33a35e4d48702f77b6b2c7030671c108.png)
![4739eed8747a3cdda6c0d3866bfee145.png](https://i-blog.csdnimg.cn/blog_migrate/79e85855dd66e7f1303f57851ca30b03.png)
TIPS:
SQL 书写规范有几个需要注意的,语句不区分大小写,不能用全角中文符号,列名不能加单引号,也不能空格。
二, Group by 分组
聚合操作后通常需要执行分组操作显示结果,根据条件聚合之后会形成不同的结果集合,类似一些程序中对矩阵的切块操作,数据库里显然简单些,是对行进行整块的切分。SQL的操作顺序是1 查找数据,2 找到符合条件的记录 3 分组 4 运行分组后的数据的聚合操作。
下面是几个例子
![dbd7c674ed5c378c1d308b1baf25fca7.png](https://i-blog.csdnimg.cn/blog_migrate/a96a4218663e2bfccead68c529e61fc8.png)
![70eb7e428d013e18627f157b29d0717b.png](https://i-blog.csdnimg.cn/blog_migrate/76be0a3cbfd0f88401515262cd3ac1a1.png)
![84bec8025bf6974ceb081dc6d2c69c66.png](https://i-blog.csdnimg.cn/blog_migrate/e3a1544c2fe56cad29528559113b21de.png)
三、
对分组结果指定条件用 having 子句,这里不能用where。where 用来限定查询条件,而having 用来对分组的结果指定条件。
计算平均成绩大于60 的人,计算平均成绩大于70 的人
![32ca8939126aa97b1ea1b61536fd25e5.png](https://i-blog.csdnimg.cn/blog_migrate/4517ef2723250a2e4c853203c435c923.png)
![7dc211964a221c3a74d1bac6fdb91a3e.png](https://i-blog.csdnimg.cn/blog_migrate/1284f68184479d2385cf77246c2e3eb2.png)
至少选修两门课程的学生。
![cfabb007891ded9647effdf95198fa9e.png](https://i-blog.csdnimg.cn/blog_migrate/dc7546047dbccaaef208b749571ba76a.png)
查询同名同姓学生姓名并计算人数
![2c63cbc17fc1065c9a914b5f86ecffd2.png](https://i-blog.csdnimg.cn/blog_migrate/977e95be683d980ed5f947536e6afbd0.png)
如何用SQL解决业务问题,首先要理解问题,然后要分析出业务流程,第三对应SQL语句,根据流程判断是否需要聚合,排序等要求。
SQL的语句,order by 用来排序,两个顺序,升序和降序。对于一些数值型的计算结果,可以利用order by 排序。order by一定要放在最后,整个SQL查询也是最后执行排序操作。排序可以指定一个或者多个,优先级一次下降。注意,如果排序列存在空值,升序的时候,空值会把列前面。如果结果很大,可以用limit N 取出前N行。
可以再看几个练习,要求和结果见题中说明,同时可以看一下没有聚合函数和有聚合函数时候SQL的不同。
![8dd9e6ea8f46fb965f322e7aa608ab40.png](https://i-blog.csdnimg.cn/blog_migrate/16afe937e5975b4f31f1bc17c0cb3c74.png)
![7b070f1005c07b99f62905244ca0b97c.png](https://i-blog.csdnimg.cn/blog_migrate/0782ae3d4600f5233306e6123287fd33.png)
SQL的debug问题,需要知道,SQL执行的顺序是先根据from和where限定条件找到符合条件的记录,然后用group对记录进行分组,分组后做聚合操作,再把结果用having语句过滤,最后用select语句显示的并且执行order by和Limit 语句,这就是为什么group by 和having 是不能使用select 中定义的别名的,where中不能用聚合函数,因为还没有计算到。此外SQL中排序数字和字符串遵循的规律是不同的,不能混肴使用,结果可能和你想的不同。