我们最常需要的是汇总数据而不是把他们实际检索出来

  • 确定表中行数(或满足某个条件或包含某个特定值的行数)
  • 确定表中行组的和
  • 找出表列(或所有行或特定列)的最大值,最小值和平均值

  聚集函数是运行在行组上,计算和返回单个值的函数。

AVG([distinct] expr)

求平均值

COUNT({*|[distinct] } expr)

统计行的数量

MAX([distinct] expr)

求最大值

MIN([distinct] expr)

求最小值

SUM([distinct] expr)

求累加和

AVG,SUM

  只用于单个列,为获得多个列的平均值要使用多个AVG,表中列值为null的行不参与计算

  要想列值为NULL的行也参与组函数的计算,必须使用IFNULL函数对NULL值做转换。

COUNT

  1. count(*):返回表中行的数量,不管列表中包含NULL值还是非NULL值,distinct不能用于count(*)
  2. count(列):返回列值非空的行的数量
  3. count(distinct 列):返回列值非空的、并且列值不重复的行的数量
  4. count(expr):根据表达式统计数据
select UNIT as '单位',
-> COUNT(TO_DAYS(DATE)=TO_DAYS(NOW()) or null) as '今日统计',
-> COUNT(YEAR(DATE)=YEAR(NOW()) or null) as '今年统计'
-> from v_jjd
-> group by JJDW;

MAX、MIN

  返回任意列的最大值,最小值(包括文本列),如果统计的列中只有NULL值,那么MAX和MIN就返回NULL

注意

  1. 每个组函数接收一个参数
  2. 默认情况下,组函数忽略列值为null的行,不参与计算
  3. 有时,会使用关键字distinct剔除字段值重复的条数
  4. 组函数不允许嵌套,例如:count(max(…))
  5. 组函数的参数可以是列或是函数表达式;
  6. 一个SELECT子句中可出现多个聚集函数

数据分组

  把数据分为多个逻辑组,以便对每个组进行聚集计算

  1. group by可以包含任意数目得列,这使得能够对分组进行嵌套
  2. 如果在group by中间套了分组,数据将在最后的分组上汇总,换句话说,建立分组时,所有指定的列都一起计算
  3. group by中的每个列都必须是检索列或有效的表达式(不能使聚合函数),必须与在select中使用相同的表达式不能使别名
  4. 除聚集计算语句外,select中的每个列都必须在group by中给出,也就是说:通过select在返回集字段中,这些字段要么就要包含在group by语句后面,作为分组的依据,要么就要被包含在聚合函数中
  5. 如果分组列中有NULL值,NULL作为一个分组返回,若有多个NULL,他们分为一组返回
  6. 使用with rollup可以得到分组及分组汇总级别(针对每个分组的值)

  sql一个执行过程:先执行的是from负责把数据库的表文件加载到内存中去,WHERE取出符合条件的记录行,生成一张临时表,select读取根据sql中有无group by没有GROUP BY时,SELECT 会根据后面的字段名称对内存中的一张临时表整列读取,有GROUP BY时,会对内存中的若干临时表分别执行SELECT,而且只取各临时表中的第一条记录,然后再形成新的临时表。这就决定了查询sql使用GROUP BY的场景下,SELECT后面跟的一般是参与分组的字段和聚合函数,否则查询出的数据要是情况而定。另外聚合函数中的字段可以是表中的任意字段,需要注意的是聚合函数会自动忽略空值得到一个结果集,然后根据分组字段,将具有相同分组字段的记录归并成了一条记录(行)。这个时候剩下的那些不存在与group by语句后面作为分组依据的字段就很有可能出现多个值,但是目前一种分组情况只有一条记录(行),一个数据格是无法放入多个数值的,所以这个时候就需要通过一定的处理将这些多值的列转化成单值,然后将其放在对应的数据格中,那么完成这个步骤的就是前面讲到的聚合函数,这也就是为什么这些函数叫聚合函数),然后having对生成的临时表再次过滤,order by对生成的临时表排序,limit取数据个数。

having与where区别

  • where过滤指定的行,在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行。
  • having过滤分组,在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件过滤出特定的组,也可以使用多个分组标准进行分组。
  • HAVING可以单独使用而不和GROUP BY配合,如果只有HAVING子句而没有GROUP BY,表中所有的行分为一组
  • HAVING子句中可以使用组函数
  • HAVING子句中的列,要么出现在一个组函数中,要么出现在GROUP BY子句中(否则出错)

order by与group by

order by group by
排序产生的输出 分组行,单输出可能不是分组的顺序
任意列可使用(甚至是非选择的列) 只能使用选择列或表达式列,而必须使用每个选择列表达式
不一定需要

如果与聚合函数一起使用(或表达式列),则必须使用

select句子顺序

子句 说明 是否必须使用
select 要返回的列或表达式 YES
from 从检索数据的表 仅在从表中选择数据时
where 行级过滤 NO
group by 分组说明 仅在按组计算聚集时使用
having 组级过滤 NO
order by 要输出排序顺序 NO
limit 要检索的行数 NO

MySQL聚合函数与数据分组的更多相关文章

  1. 第08章 MySQL聚合函数

    第08章 MySQL聚合函数 我们上一章讲到了 SQL 单行函数.实际上 SQL 函数还有一类,叫做聚合(或聚集.分组)函数,它是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值. 1 ...

  2. MySQL聚合函数、控制流程函数(含navicat软件的介绍)

    MySQL聚合函数.控制流程函数(含navicat软件的介绍) 一.navicat的引入:(第三方可视化的客户端,方便MySQL数据库的管理和维护) NavicatTM是一套快速.可靠并价格相宜的数据 ...

  3. mysql聚合函数和分组

    文章实例的数据表,来自上一篇博客<mysql简单查询>:http://blog.csdn.net/zuiwuyuan/article/details/39349611 一. 聚合函数 聚合 ...

  4. 史上最全的mysql聚合函数总结(与分组一起使用)

    1.首先我们需要了解下什么是聚合函数 聚合函数aggregation function又称为组函数. 认情况下 聚合函数会对当前所在表当做一个组进行统计. 2.聚合函数的特点 1.每个组函数接收一个参 ...

  5. MySQL聚合函数在计算时,不会自动匹配与之相对应的数据

    学习mysql过程中遇到了一个困惑,纠结了我半天时间,刚刚又重新复习了一下,终于知道问题所在 以下是一个需求: 取得平均薪水最高的部门的部门编号 代码如下: select deptno, avg(sa ...

  6. MySQL☞聚合函数/分组函数

    分组函数(聚合函数) 1.count(*/列名): a.*:求出该数据的总条数 select  count(*)  from 表名 b.列名:求出该列中列名不为null的总条数 select  cou ...

  7. MySQL 聚合函数(三)MySQL对GROUP BY的处理

    原文来自MySQL 5.7 官方手册:12.20.3 MySQL Handling of GROUP BY SQL-92和更早版本不允许SELECT列表,HAVING条件或ORDER BY列表引用未在 ...

  8. MySQL 聚合函数(一)聚合(组合)函数概述

    MySQL版本:5.7+ 本节介绍对值的集合进行操作的组合(聚合)函数.翻译自:Aggregate (GROUP BY) Function Descriptions 一.MySQL 5.7中的聚合函数 ...

  9. 【MySql】Group By数据分组

    GROUP BY 语句根据一个或多个列对结果集进行分组. 在分组的列上我们可以使用 COUNT, SUM, AVG,等函数. 因为聚合函数通过作用于一组数据而只返回一个单个值, 因此,在SELECT语 ...

随机推荐

  1. BeanUtils.copyProperties方法,当属性Date为null解决

    问题描述:org.apache.commons.beanutils user对象和formBean对象都有属性birthday,而且都是java.sql.Date类型的 当进行BeanUtils.co ...

  2. git创建后的 各种命令 总结

    .git status命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,readme.txt被修改过了,但还没有准备提交的修改. .$ git diff readme.txt    git d ...

  3. leetcode56:合并区间

    给出一个区间的集合,请合并所有重叠的区间.(解题思想来源于:https://blog.csdn.net/qq_34364995/article/details/80788049 ) 示例 1: 输入: ...

  4. day 29 socket 理论

    网络编程(socket,套接字)   服务端地址不变 ip + mac 标识唯一一台机器 ip +端口 标识唯一客户端应用程序 套接字: 网络编程   网络编程 一.python提供了两个级别访问的网 ...

  5. JavaWeb:脚本标识

    脚本标识 一.JSP表达式 1.介绍 用于向页面中输出信息 2.语法格式 <%= 表达式%> 3.注意 在"<%"和"="之间不允许有空格,但 ...

  6. IDEA PYCHARM USAGE NOTE

    初次安装使用PyCharm,在新建.py文件时会发现文件头并没有什么信息,因此,使用模板会比较方便. 方法如下: 1.打开PyCharm,选择File--Settings 2.依次选择Editor-- ...

  7. 你知道怎么用Idea抽取方法、创建class吗?

    liJ IDEA的快捷键是进行重构的利器,坊间盛传,完全使用IDEA快捷键重构的代码,是不需要写测试用例保护的 本文就分享一个使用IDEA抽取方法及创建新的class的方法 工具/原料   Intel ...

  8. Bug02_MyBatis_org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

    我出现问题的原因是: 映射xml文件名写错了. 查资料,可以有以下解决办法 按以下步骤一一执行: 1:检查xml文件所在的package名称是否和interface对应的package名称一一对应 2 ...

  9. POJ 2369 Permutations(置换群概念题)

    Description We remind that the permutation of some final set is a one-to-one mapping of the set onto ...

  10. python3:利用SMTP协议发送QQ邮件+附件

    转载请表明出处:https://www.cnblogs.com/shapeL/p/9115887.html 1.发送QQ邮件,首先必须知道QQ邮箱的SMTP服务器 http://service.mai ...