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)

大家都在看

  • Question07-查询学过”张三”老师授课的同学的信息

    * SELECT DISTINCT Student.* FROM Student , SC , Course , Teacher WHERE Student.SID = SC.SI…

    数据库 2023年6月16日
    059
  • 二叉树遍历的常用方法

    概述 二叉树的遍历可以说是解决二叉树问题的基础。我们常用的遍历方式无外乎就四种 前序遍历、 …

    数据库 2023年6月11日
    085
  • Mysql 的Innodb引擎和Myisam数据结构和区别

    先大体看一下MySQL的SQL layer层的一个架构流程: 简要介绍一些关键模块: [En] Give a brief description of some key modul…

    数据库 2023年5月24日
    093
  • 容器化 | 在 S3 实现定时备份

    让我们来看看该功能是如何使用的。 [En] Let’s take a look at how this feature is used. 可用 Cron 表达式(与 L…

    数据库 2023年5月24日
    072
  • 我是个怎样的人

    我是一个怎样的人 我是一个怎样的人, 我是一个虚伪的人. 我麻木的观察着这个世界, 对好坏, 真假, 我都去同样看待, 不去区分. 我是一个怎样的人, 我是一个善良的人. 我温柔的…

    数据库 2023年6月9日
    089
  • CentOS 安装 Docker CE

    CentOS 安装 Docker CE 警告:切勿在没有配置 Docker YUM 源的情况下直接使用 yum 命令安装 Docker. 准备工作 系统要求 Docker CE 支…

    数据库 2023年6月6日
    088
  • Minio的安装与使用

    Minio的安装与使用 一、Minio介绍 MinIO 是在 Apache License v2.0 下发布的高性能对象存储. 就是说是个存东西的玩意,比较方便配好启动就能访问,也…

    数据库 2023年6月6日
    0110
  • vue项目发布到docker nginx的方法总结

    我总结了以下两种方法可用 一、通过制作镜像,使用镜像生成docker 这个是比较常用的方法,制作镜像(images)后,如果还要生成docker可以直接使用镜像比较方便以下是操作步…

    数据库 2023年6月9日
    094
  • Typora + PicGo + Gitee 解放你对图片的管理

    计算机环境准备 Typora PicGo nodejs Typora官网: https://typora.io/ PicGo官网: https://picgo.github.io/…

    数据库 2023年6月9日
    087
  • 使用Ant从零开始搭建tomcat源码环境

    使用Ant从零开始搭建tomcat源码环境 视频教程 准备工作 编辑 Idea,且装上Checkstyle插件(或者其他开发工具) 编译依赖的Jar包. 开始搭建 搭建编译环境 安…

    数据库 2023年6月11日
    0103
  • 【黄啊码】MySQL入门—4、掌握这些数据筛选技能比你学python还有用-1

    大家好!我是黄啊码,今天没继续select * 了吧,如果还继续,那接下来的课程先别学,回去好好把之前的课程重复复习一遍,学明白了我们再会?废话不多说,学今天的课程之前我们先来说说…

    数据库 2023年5月24日
    090
  • 【黄啊码】PHP对接阿里云短信服务最新版(官方文档有坑,切记)

    现在百度出来的大都是1.5的版本,而阿里云短信API出到了2.0了 以下是最新教程,绝对成功,不成功。。。我再改一遍! 环境要求最低要求 PHP 5.6安装 SDK 核心库 Ope…

    数据库 2023年6月16日
    0211
  • Python–Event

    事件Event: 同进程的一样,线程的一个关键特性是每个线程都是独立运行且状态不可预测。如果程序中的其他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变…

    数据库 2023年6月9日
    076
  • 我的JAVA面试题备忘录

    以下是我收集的一些问题,有的是网上摘录的,有的是自己参加面试被问到的,有的是工作或学习时遇到的,等等。 为什么要记录这些呢? 一方面,我相信,这样做对我自己的技术提升是有帮助的。在…

    数据库 2023年6月6日
    062
  • 03-MySQL事务

    数据库事务 1、事务特性 1.1、原子性 即不可分割性,事务要么全部被执行,要么就全部不被执行 1.2、一致性 事务的执行使得数据库从一种正确状态转换成另一种正确状态 1.3、隔离…

    数据库 2023年6月16日
    0106
  • 小试牛刀:Go 反射帮我把 Excel 转成 Struct

    背景 起因于最近的一项工作:我们会定义一些关键指标来衡量当前系统的健康状态,然后配置对应的报警规则来进行监控报警。但是当前的报警规则会产生大量的误报,需要进行优化。我所负责的是将一…

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