MySQL之group by分组查询

有如下数据:

MySQL之group by分组查询

一个简单的分组查询案例

[En]

A simple case of grouping query

按照部门编号deptno分组,统计每个部门的平均工资。

select deptno,avg(sal) avgs
from emp
group by deptno;

结果如下:

MySQL之group by分组查询

group by关键字语法详解

MySQL之group by分组查询

group by是用于 分组查询的关键字,一般是配合 sum(),avg(),count(),max(),min()聚合函数使用的。也就是说SQL语句中只要有 group by,那么在select后面的展示字段中一般会有聚合函数(5个聚合函数)中的一个或多个函数出现。观察上图用表中的字段A进行分组后,一般就需要对表中的其它字段,使用聚合函数,这样意义更大,而不是还对字段A使用聚合函数。

当SQL语句中使用了 group by后,在select后面一定有一个字段使用了聚合函数(5个聚合函数)。但是除了这个聚合函数,select后面还可以添加其他什么字段吗?

答案肯定是可以的!但是该字段有一定的限制,并不是什么字段都可以。也就是说,当SQL语句中使用了 group by关键字后,select后面除了聚合函数,就只能是 group by后面出现的字段。也就是图中的 字段A,select后面只能存在 group by后面的字段。

分组前筛选和分组后筛选

原始表和结果集的概念

  • 原始表指的是数据库真正存在的那个表,使用【select * from 表名】查询出来的就是原始表信息。
  • 结果集指的是在SQL语句中,添加其它任何一个限制条件,最终展示给我们表,都是结果集。添加不同的限制条件,查询出来的结果集也是不同的。
  • 原始表只有一个, 结果集却是各种各样的。

where筛选和having筛选选用

  • 只要将聚合函数作为需求中的条件,就必须是分组后的筛选
    [En]

    as long as the aggregate function is used as a condition in the requirement, it must be the screening after grouping*

  • 如果可以使用预分组筛查,将优先考虑预分组筛查。(考虑性能问题)
    [En]

    if pre-grouping screening can be used, priority will be given to pre-grouping screening. (considering performance issues)*

MySQL之group by分组查询

分组前筛选

  • 查询姓名中包含S字符的,每个部门的工资之和。
select deptno,sum(sal)
from emp
where ename like '%S%'
group by deptno;

MySQL之group by分组查询
  • 查询工资大于2000的,不同部门的平均工资。
select deptno,avg(sal)
from emp
where sal > 2000
group by deptno;

MySQL之group by分组查询

分组后筛选

  • 查询部门员工个数大于3的部门编号和员工个数。
select deptno,count(*)
from emp
group by deptno
haveing count(*) > 3;

MySQL之group by分组查询
  • 查询每个最高工资大于3000的部门的部门号和最高工资。
    [En]

    query the department number and maximum wage of each department whose maximum wage is greater than 3000.*

select deptno,max(sal) maxsfrom empgroup by deptnohaving maxs count(*) > 3;

MySQL之group by分组查询

分组前筛选和分组后筛选合用

  • 查询1981年入职的,不同部门间工资的平均值大于2000的部门编号和平均值。
select deptno,avg(sal) avgs
from emp
where year(hiredate) = '1981'
group by deptno
having avgs > 2000;

MySQL之group by分组查询

分组查询(按函数分组)

  • 按员工姓名长度分组,查询每个组的员工人数,筛选员工人数超过3人的?
    [En]

    grouped according to the length of employees’ names, query the number of employees in each group, and screen those whose number of employees is more than 3?*

select length(ename) len, count(*) countsfrom empgroup by lenhaving counts > 3;

MySQL之group by分组查询

分组查询(按多个字段分组)

  • 查询各部门各工种员工的平均薪酬。
    [En]

    inquire about the average salary of employees of each type of work in each department.*

select deptno,jop,avg(sal) avgsfrom empgroup by deptno,job;

MySQL之group by分组查询

group by和order by

  • 按平均工资降序查询各部门员工平均工资
    [En]

    query the average wages of employees in each department, according to the descending order of average wages.*

select deptno,jop,avg(sal) avgsfrom empgroup by deptnoorder by avgs desc;

MySQL之group by分组查询
  • 按平均工资涨幅顺序,查询各部门员工平均工资
    [En]

    inquire about the average wages of employees in each department, according to the order of increase in average wages.*

select deptno,jop,avg(sal) avgsfrom empgroup by deptnoorder by avgs asc;

MySQL之group by分组查询

总结

  • 分组函数做条件,肯定是放在 having子句中。
  • 能用分组前筛选的,就优先考虑使用分组前筛选。( where筛选)
  • group by子句支持单个字段分组,多个字段分组(多个字段之间用逗号隔开没有顺序要求),还支持函数分组(用的较少)。

Original: https://www.cnblogs.com/pure3417/p/15224587.html
Author: pure3417
Title: MySQL之group by分组查询

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/508187/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Docker常用命令

    镜像:Docker 镜像是用于创建 Docker 容器的模板容器:容器是独立运行的一个或一组应用仓库:用来保存镜像,可以理解为代码控制中的代码仓库 一个仓库中包含多个镜像,以镜像为…

    数据库 2023年6月11日
    075
  • 线程的生命周期

    线程的生命周期​ 线程具有生命周期,其中包含 5种状态(出生状态,就绪状态,运行状态、暂停状态、死亡状态)。 出生状态就是线程被创建时的状态:当线程对象调用 start()方法 后…

    数据库 2023年6月16日
    0108
  • ansible碎碎念

    Using a SSH password instead of a key is not possible because Host Key checking is enabled…

    数据库 2023年6月11日
    062
  • js中创建正则对象时,变量中存在转义字符(’/’,’.’等)时,是否需要转义?

    使用直接量创建正则时,很方便,但是如果存在变量时,不适用。 使用正则对象(RegExp)创建时,对于变量中的转义字符不需要处理。 另外测试正则地址: https://develop…

    数据库 2023年6月11日
    098
  • mysql视图,索引

    一、视图 View 视图是一个 虚拟表,是sql语句的查询结果,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据,在使用视图时动态生成。视图的数据变化会影响到基…

    数据库 2023年6月9日
    056
  • zabbix

    1. zabbix介绍 2. zabbix特点 3. zabbix配置文件 4. 部署zabbix zabbix介绍 zabbix是一个基于WEB界面的提供分布式系统监视以及网络监…

    数据库 2023年6月14日
    065
  • Linux下的ssh、scala、spark配置

    注:笔记旨在记录,配置方式每个人多少有点不同,但大同小异,以下是个人爱好的配置方式. 平台:win10下的ubuntu虚拟机内 所用到的文件:hadoop-2.7.3.tarjdk…

    数据库 2023年6月16日
    0108
  • Linux–>定时任务调度

    指定系统在某个时间执行特点的命令或程序。 任务调度分类: crontab 选项 常用选项 选项 说明 -e 编辑crontab定时任务 -l 查询crontab任务 -r 删除当前…

    数据库 2023年6月14日
    054
  • 5_SpringMVC

    一. 什么是MVC框架 MVC全名是Model View Controller, 是模型(model), 视图(view), 控制器(controller)的缩写, 一种软件设计典…

    数据库 2023年6月11日
    090
  • 关于EF分页查询报错(Count must have a non-negative value.)的解决方案

    具体的异常信息如下,一开始没有写日志只看到错误信息:Count must have a non-negative value.,从表面意思可以看出来是Count值出现了负数,所以报…

    数据库 2023年6月9日
    079
  • 软件测试流程是什么?这题我不会啊

    转载请注明出处❤️ 作者:测试蔡坨坨 原文链接:caituotuo.top/ae4fff18.html 你好,我是测试蔡坨坨。 最近收到不少准备转行软件测试的小伙伴私信问真实企业里…

    数据库 2023年6月11日
    091
  • [springmvc]mvc的多种方式实现请求转发与重定向

    3.restful风格 RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。 RESTFUL适用于移动互联网厂商作为业务接…

    数据库 2023年6月16日
    072
  • English words chapter 20220927

    本文来自博客园,作者:ukyo–BlackJesus,转载请注明原文链接:https://www.cnblogs.com/ukzq/p/16736392.html Or…

    数据库 2023年6月11日
    074
  • MySQL InnoDB缓存

    1. 背景 对于各种用户数据、索引数据等各种数据都是需要持久化存储到磁盘,然后以”页”为单位进行读写。 相对于直接读写缓存,磁盘IO的成本相当高昂。 对于读…

    数据库 2023年6月14日
    0141
  • linux系统安装MySQL数据库安装保姆级教程及1045错误和2058问题解决

    使用Mysql的zip压缩包解压版,下载之后需进行一定的配置,才能使用它。下面对Mysql压缩包版的安装方法进行详细的描述,如有疑问或错误,望及时反馈。 首先,mysql的官方下载…

    数据库 2023年6月11日
    078
  • innoDB对MVCC的实现

    InnoDB存储引擎在 RR 级别下通过 MVCC和 Next-key Lock 来解决幻读问题: 1、执行普通 select,此时会以 MVCC 快照读的方式读取数据 在快照读的…

    数据库 2023年6月16日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球