MySQL的分组和分组后筛选语句(十七)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL的分组和分组后筛选语句(十七)

一. MySQL的分组语句


MySQL中除了简单的查询之后,还常常使用到分组统计,如统计每一个部门有多少个员工, 每一个部门的员工最大年龄是多少, 最大工资是多少 等,分组中常常会与聚合函数一起使用,来进行统计。 分组时, 要用到 group by 命令。


select 列名1,聚合函数(列名1)
  from 表名
  where 条件语句
  group by 列名1;


  • 分组时,可以分为 单字段分组和多字段分组, 通常使用单字段分组就够了。


  • 所使用的仍然是 yuejl 数据库的 user 表。


20191210142630238.png


二. MySQL的单字段分组


  • MySQL 单字段分组使用时,通常与以下几种常见的用法:


分组函数单独使用

分组函数与聚合函数一起使用

分组函数与 having 一起使用

分组函数与 where和having 一起使用

分组函数与with rollup 一起使用


  • 下面,针对这五种情况,分别进行分析。


二.一 分组函数单独使用


  • 类似于 mysql 中的去重 distinct 功能。


  • 使用 group by 命令:


select 列名1
from 表名
group by 列名1;


  • 如 按照部门进行分组 查询


select deptId
from user
group by deptId;


20191210142645297.png


  • 注意,这个时候,是不能再查询其他的非聚集函数的,只能查询分组的 deptId 字段。


  • 如 按照 deptId 进行分组,再查询 age 字段时:


select deptId,age from user group by deptId;
Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘yuejl.user.age’
which is not functionally dependent on columns in GROUP BY clause; this is incompatible with
sql_mode=only_full_group_by


  • 可以将 age 用聚集函数括起来, 就是第二种用法。


二.二 分组函数与聚合函数一起使用


  • 所用命令:


select 列名1, 聚合函数(列名)
  from 表名
  group by 列名1;


  • 如 查询每个部门的 员工的最大年龄和员工的最小年龄


select deptId,max(age) as maxAge ,min(age) as minAge
  from user 
  group by deptId;


20191210142657441.png


二.三 分组函数与 having 一起使用


  • 在分组之后,对分组的信息进行筛选。


  • 所用命令:


select 列名1,聚合函数(列名) 
  from 表名
  group by 列名1
  having 条件;


20191210142657441.png


  • 其中,having 后面的条件,只能跟 列名1进行筛选,或者是按照 聚合函数进行筛选, 即只能按照select 查询的字段进行筛选,不能用其他的字段进行选择。 可以拼接筛选


二.三.一 用分组字段进行筛选


  • 如查询一下,各个部门的最大年龄和最小年龄,且部门编号为1 的部门信息。


select deptId,max(age) as maxAge,min(age) as minAge
  from user 
  group by deptId
  having deptId=1;


20191210142709618.png


  • 只查询出部门编号为1 的信息,其余的部门信息不查询出来。


二.三.二 用聚合函数进行筛选


  • 如查询一下,各个部门的最大年龄和最小年龄,且 最小年龄必须要大于23 .


select deptId,max(age) as maxAge,min(age) as minAge
  from user 
  group by deptId
  having minAge>23;


20191210142712308.png


  • id=1和id=3的部门信息,最小年龄为23,不符合条件,只有id=2的部门才符合条件,为24.


二.三.三 用分组字段和聚合函数进行联合筛选


  • 如 查询各个部门的最大年龄和最小年龄, 且最小年龄必须是大于23,并且只查询id=1的部门。


select deptId,max(age) as maxAge,min(age) as minAge
  from user 
  group by deptId
  having minAge>23 and deptId=1;


20191210142720665.png


  • 不存在这样的数据。


二.三.四 用其他的字段,如age 进行筛选一下 (举例 错误案例)


select deptId,max(age) as maxAge,min(age) as minAge
  from user 
  group by deptId
  having age>18;


20191210142730833.png


ERROR 1054 (42S22): Unknown column ‘age’ in ‘having clause’


  • 分组之后,是没有 age 字段的,是无法进行筛选的。


  • 可以用where 语句,在分组之前进行筛选, 即第四种形式。


二.四 分组函数与 where和having 一起使用


  select 列名1,聚集函数(列名)
  from 表名
  where 表中所有列的条件都可以
  group by 列名1
  [having 筛选条件]


  • 其中,having 语句,可以要也可以不要, 先进行where 语句的筛选之后,再对筛选的结果进行分组。


二.四.一 不要having的,只保留where 语句


如只查询部门编号为2,3的 部门的最大年龄和最小年龄。


  select deptId,max(age) as maxAge,min(age) as minAge
  from user 
  where deptId=2 or deptId=3
  group by deptId;  


20191210142753901.png


  • 会先进行where 语句进行筛选,再分组。


二.四.二 既有where 语句,又有having 语句的


  • 如 只查询部门编号为2,3的部门的最大年龄和最小年龄,且最小年龄必须要大于23.


select deptId,max(age) as maxAge,min(age) as minAge
  from user 
  where deptId=2 or deptId=3
  group by deptId
  having minAge>23;

20191210142801249.png


  • 只查询出 id=2的信息。


  • 其中, where 语句的筛选条件,用于分组前,筛选条件为整个表中的列,
  • having语句的筛选条件,用于分组后,筛选条件只能是select里面的列。


二.五 分组函数与 with rollup 一起使用


  select 列名1,聚集函数(列名)
  from 表名
  where 表中所有列的条件都可以
  group by 列名1 roll up
  [having 筛选条件] ;


  • 查询时,对分组查询后的数据,进行一次汇总。


  • 如,如只查询部门编号为2,3的 部门的年龄之和。 加上roll up 的效果。


select deptId,sum(age) as sumAge
  from user 
  where deptId=2 or deptId=3
  group by deptId with rollup;


20191210142809528.png


  • 24+46=70.


三.多字段分组


  select 列名1,列名2,聚集函数(列名)
  from 表名
  where 条件筛选
  group by 列名1,列名2
  [having 筛选条件]


  • 多字段分组,与单字段分组基本是相同的,用法也是相同的。


  • 如 按照部门的编号和性别进行分组查询,最大的年龄和最小的年龄。


  select deptId,sex,max(age),min(age)
  from user
  group by deptId,sex;


20191210142818519.png


  • 部门编号为2和3的,只有男性员工,没有女性员工。所以并不是 3*2=6 种情况,而是 3 * 2-2=4 种。


  • 关于多字段分组时,与 having,where的关联用法,老蝴蝶就不讲解了,与单字段基本相同。



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
24天前
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页等详解步骤及常见报错问题所对应的解决方法]
MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页、INSERT INTO SELECT / FROM查询结合精例等详解步骤及常见报错问题所对应的解决方法
|
2月前
|
算法 关系型数据库 MySQL
MySQL高级篇——排序、分组、分页优化
排序优化建议、案例验证、范围查询时索引字段选择、filesort调优、双路排序和单路排序、分组优化、带排序的深分页优化
MySQL高级篇——排序、分组、分页优化
|
3月前
|
SQL 关系型数据库 MySQL
SQL语句编写的练习(MySQL)
这篇文章提供了MySQL数据库中关于学生表、课程表、成绩表和教师表的建表语句、数据插入示例以及一系列SQL查询练习,包括查询、排序、聚合和连接查询等操作。
|
3月前
|
SQL 关系型数据库 MySQL
MySQL】-DQL(基本、条件、分组、排序、分页)详细版
通过这些查询方法,你可以高效地检索、分析和组织MySQL数据库中的数据,以满足各种应用需求。实践中,理解这些SQL语句的基础知识以及它们如何组合起来进行复杂的数据操作是至关重要的。
48 1
|
4月前
|
SQL 关系型数据库 MySQL
MySQL获取分组里的最新数据如何写sql
MySQL获取分组里的最新数据如何写sql
51 0
|
5月前
|
关系型数据库 MySQL 数据库
MySQL的排序、分组、合并
MySQL的排序、分组、合并
|
5月前
|
SQL 关系型数据库 MySQL
MySQL分组查询以及having筛选
MySQL分组查询以及having筛选
28 0
|
5月前
|
SQL 关系型数据库 MySQL
MySQL多表联合查询+分组+排序
MySQL多表联合查询+分组+排序
32 0
|
5月前
|
SQL 关系型数据库 MySQL
MySQL分组查询实例
MySQL分组查询实例
31 0
|
5月前
|
SQL 关系型数据库 MySQL
MySQL数据库——SQL(3)-DQL(基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询、案例练习)
MySQL数据库——SQL(3)-DQL(基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询、案例练习)
57 0
下一篇
无影云桌面