• 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时还没有进行分组

  • 相关阅读:
    http://www.rehack.cn/techshare/webbe/php/3391.html
    SQL 百万级数据提高查询速度的方法
    开学收好这 17 种工具 App,让你新学期学习更有效率
    Git文件常见下标符号说明
    JS模块化开发
    前端路由的实现方式
    单页应用和多页应用
    使用chrome远程调试设备及调试模拟器设备
    移动端实现弹出框渐显和渐隐效果
    前端实现手机相册或照相预览图片及压缩图片的方法
  • 原文地址:https://www.cnblogs.com/ibcdwx/p/16545873.html
Copyright © 2020-2023  润新知