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

总结:

  1. 使用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

总结:

  1. count(1)和count(*)效果一样,有多少条记录则个数多少。但是count(字段)不一样,如果字段值为null,则此条记录不计算在内
  2. 尽量使用count(1)和count(*),少使用count(salary)
  3. 在innodb引擎,count(1)和count(*)的效率更高。
  4. 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

直接上总结:

  1. having不能单独使用,必须搭配group by
  2. select中的组装字段别名不能在group by 和 having中使用

having和where区别

  1. where中不能用聚合函数,只能过滤普通条件
  2. having可以用聚合函数并且提倡在这里用,也可以过滤普通条件,但不建议在这里使用

sql关键字语法顺序和执行顺序

sql语法顺序

SELECT -> FROM -> ON -> WHERE -> GROUP BY -> HAVING -> ORDER BY -> LIMIT

sql执行顺序

image

FROM -> ON -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY -> LIMIT

看了上面的执行顺序,我们可以总结之前的结论:

select中的组件字段别名不能用在group by和having中,因为顺序
为什么having要在group by后面,因为要先分组才能使用聚合函数,having和select才能用
为啥where中不能使用聚合函数,因为where时还没有进行分组

posted @ 2022-08-12 11:35  爱编程DE文兄  阅读(351)  评论(0编辑  收藏  举报