Mysql:常用聚合函数、group by、having、sql执行过程
常用聚合函数
聚合函数是对一组数据、或者说是一列或一个字段数据进行计算,然后得到一个单值的结果。mysql的聚合函数其实挺多的,但实际开发中用的比较多的有5个,分别是:sum(),avg(),max(),min(),count()
sum()和avg()
sum()是用来对一组数据进行求和,avg是对一组数据进行求平均值。示例如下:
SELECT sum(salary) as totalSalary
FROM employees
SELECT avg(salary) as avgSalary
FROM employees
总结:
- 使用sum和avg只能对数字类型的字段进行计算
max()和min()
max()是获取一组数据中的最大值,min()是获取一组数据中的最小值。示例如下:
SELECT max(salary) as maxSalary,min(salary) as minSalary
FROM employees
总结:
max()和min()可以对 字符串 、 数字类型 、日期类型进行计算。字符串是根据字符串的首字母进行计较大小;a最小,z最大
count
count用来计算一组数据的个数。这个比较特殊,一般有3种写法,如下:
SELECT count(1),count(*),count(salary)
FROM employees
总结:
- count(1)和count(*)效果一样,有多少条记录则个数多少。但是count(字段)不一样,如果字段值为null,则此条记录不计算在内
- 尽量使用count(1)和count(*),少使用count(salary)
- 在innodb引擎,count(1)和count(*)的效率更高。
- avg(A) = sum(A)/count(A),始终成立;因此但凡涉及求平均数,不要立马使用avg,因为count(A)是不计算空值情况的
group by
group by 是用来对行数据进行分组的。如果不加group by,默认一张表都在同一个组中;而我们使用的聚合函数,实际上是对分组的数据进行函数计算的。下面举个简单例子:
SELECT department_id,avg(salary)
FROM employees
GROUP BY department_id
上面是对部门id进行分组,然后求部门的平均工资。
下面给大家演示一个错误的例子:
SELECT employee_id,department_id,avg(salary)
FROM employees
GROUP BY department_id
注意:使用了group by后,select后面的字段只能是group by中出现的,或者是聚合函数。就像employee_id没有出现在group by中,因此这种写法是错的
having
having的作用和where一样,都是用来过滤条件的,但和where还是有区别。简单实例:
SELECT department_id,avg(salary)
FROM employees
GROUP BY department_id
HAVING avg(salary) > 1000
直接上总结:
- having不能单独使用,必须搭配group by
- select中的组装字段别名不能在group by 和 having中使用
having和where区别
- where中不能用聚合函数,只能过滤普通条件
- having可以用聚合函数并且提倡在这里用,也可以过滤普通条件,但不建议在这里使用
sql关键字语法顺序和执行顺序
sql语法顺序
SELECT -> FROM -> ON -> WHERE -> GROUP BY -> HAVING -> ORDER BY -> LIMIT
sql执行顺序
FROM -> ON -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY -> LIMIT
看了上面的执行顺序,我们可以总结之前的结论:
select中的组件字段别名不能用在group by和having中,因为顺序
为什么having要在group by后面,因为要先分组才能使用聚合函数,having和select才能用
为啥where中不能使用聚合函数,因为where时还没有进行分组
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2020-08-12 Redis常用五大类型