在MySQL 查询 语句中,允许使用 GROUP BY 子句对结果分组。

GROUP BY语法:

select 分组函数, 列(要求在group by 子句后面)from 表名【where 条件】group by 分组的列【order by 子句】

准备一个表,和一些数据。员工表,表名emp,包含姓名(ename)、工作(job)、工资(sal)、 部门编号(deptNo)等字段。

 CREATE TABLE `emp` ( `id` int(255) NOT NULL AUTO_INCREMENT, `ename` varchar(255) DEFAULT NULL, `job` varchar(255) DEFAULT NULL, `sal` int(11) DEFAULT NULL, `deptNo` int(11) DEFAULT NULL, `hiredate` datetime NOT NULL, `bonus` int(11) DEFAULT NULL, `orderNo` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8

准备好的一些测试数据

简单分组

假设有一个需求:查询每个部门的员工人数。

使用count函数可以查询个数,select count(*) from emp 将整个表看作一组,返回整个表的行数。此时要求查询每个部门的员工人数,意味着要在整个emp表再按部门分组,有几个部门就分几个小组,然后再统计部门的人数。

可以这样写:

mysql> select count(*),deptNo  from emp group by deptNo;+----------+--------+| count(*) | deptNo |+----------+--------+| 2 | 1 || 2 | 2 | | 2 | 3 | | 2 | 4 | | 2 | 5 | +----------+--------+

deptNo是部门编号,所以以此列作为分组的列。前面是员工数量,后面是部门编号。

再如,查询每个部门的平均工资

mysql> select avg(sal),deptNo from emp group by deptNo;+-----------+--------+| avg(sal) | deptNo |+-----------+--------+| 4000.0000 | 1 || 4100.0000 | 2 || 3250.0000 | 3 || 4000.0000 | 4 || 3500.0000 | 5 |+-----------+--------+

有条件的分组查询

1、比如第一个问题改一下,查询每个部门有奖金的员工人数(即bonus这列,其有两个值,null和非null)

此时可以这样查

mysql> select count(*),deptNo  from emp  where bonus is not null  group by deptNo;+----------+--------+| count(*) | deptNo |+----------+--------+| 1 | 1 || 1 | 2 || 1 | 3 || 1 | 4 || 1 | 5 |+----------+--------+

奖金是筛选条件,条件涉及的字段bonus是在emp表中,也就是原始表中,此时就可以在where中使用,并且在group by 之前。

2、再有一个问题,要求查询员工人数大于1的部门。

第一步,我们可以先查出每个部门的人数

第二步,根据第一步的结果上进行筛选哪个部门员工人数大于1

查询部门员工人数select count(*),deptNo from emp group by deptNo;

此时我们发现,根据原始表的字段,我们无法找出哪个部门的员工人数大于1,只能是根据分组之后的结果集进行筛选,此时添加条件不能在group by之前,否则会报错。

mysql> select count(*),deptNo  from emp  where count(*) > 1  group by deptNo;ERROR 1111 (HY000): Invalid use of group function

是group by分组之后再筛选,所以条件也在group by 子句后面,也不能再用where,而是用关键词having

mysql> select count(*),deptNo  from emp  group by deptNo  having count(*) > 1;+----------+--------+| count(*) | deptNo |+----------+--------+| 2 | 1 || 2 | 2 || 2 | 3 || 2 | 4 || 2 | 5 |+----------+--------+

筛选条件在分组前添加还是在分组后添加,可以看它能不能使用原始表中的列来确定。

分组前 原始表字段,在group by前面,用where关键词,分组后 分组的结果集,在group by后面,用having关键词。

如果用分组函数作条件,肯定是在group by后面。

优先使用分组前筛选。

按函数分组或者表达式分组

如按员工姓名的长度进行分组,查询每个长度的员工人数。

mysql> select count(*),length(ename)  from emp group by length(ename);+----------+---------------+| count(*) | length(ename) |+----------+---------------+| 4 | 4 || 1 | 5 || 3 | 6 || 1 | 7 || 1 | 8 |+----------+---------------+

按多个字段分组

如按部门、工作分组,查询员工数量

mysql> select count(*),deptNo,job  from emp  group by deptNo,job;+----------+--------+-------------+| count(*) | deptNo | job |+----------+--------+-------------+| 1 | 1 | accountant || 1 | 1 | auditor || 1 | 2 | cashier || 1 | 2 | operator || 1 | 3 | engineer || 1 | 3 | secretary || 1 | 4 | buyer || 1 | 4 | electrician || 1 | 5 | interpreter || 1 | 5 | janitor |+----------+--------+-------------+

有多个字段,加在group by后面用逗号分隔即可,两者值相同的字段才会分到一组中。字段在分组的顺序随意,没有要求。

添加排序

如查询每个部门的平均工资,按照降序排序

mysql> select avg(sal),deptNo  from emp  group by deptNo  order by avg(sal) desc;+-----------+--------+| avg(sal) | deptNo |+-----------+--------+| 4100.0000 | 2 || 4000.0000 | 4 || 4000.0000 | 1 || 3500.0000 | 5 || 3250.0000 | 3 |+-----------+--------+

如果没有limit,order by 子句一定在查询语句的最后。

java8 多个字段分组_MySQL基础之分组查询相关推荐

  1. mysql 连接 分组_MySQL 基础 (四) 分组查询及连接查询

    MySQL 基础 (四) 分组查询及连接查询 MySQL 基础(四) 进阶 5 分组查询 语法: SELECT 分组函数, 列(要求出现在 group by 的后面) FROM 表 [where 筛选 ...

  2. mysql select查询字段_MySQL基础:SELECT查询语句

    Blog:博客园 个人 概述 SELECT语句用于从表中选取/查询数据,结果被存储在一个结果表中(称为结果集). 语法格式 SELECT [ALL | DISTINCT | DISTINCTROW ] ...

  3. mysql sum计算效率很慢_MySQL基础之分组函数

    分组函数主要用于统计,又称为聚合函数.统计函数或组函数. 常见的分组函数有: SUM(expr) 求和AVG([DISTINCT] expr) 求平均值MAX(expr) 求最大值MIN(expr) ...

  4. mysql 查询指定字段数据_MySQL使用select语句查询指定表中指定列(字段)的数据

    本文介绍mysql数据库中执行select查询语句,查询指定列的数据,即指定字段的数据. 再来回顾一下sql语句中的select语句的语法: select 语句的基本语法: select from w ...

  5. mysql 子查询多个字段_MySql基础

    本文章目标 ​ 一.为什么要学习数据库 ​ 二.数据库的相关概念 ​ DBMS.DB.SQL ​ 三.数据库存储数据的特点 ​ 四.初始MySQL ​ MySQL产品的介绍 ​ MySQL产品的安装 ...

  6. mysql 分组求和_MySql基础语法

    SQL语句分类 DDL:数据定义语言,用来定义数据库对象:库.表.列等 DML:数据操作语言,用来定义数据库记录(数据) DCL:数据控制语言,用来定义访问权限和安全级别: DQL:数据查询语言,用来 ...

  7. MYSQL数据库字段关联_MySQL数据库基础——操作关系表、连接查询

    MySQL数据库基础入门--day11 一.操作关联表 1.关联关系: 关联关系有:多对一.多对多和一对多. 一对一关联关系可以应用在以下几方面: (1)分割具有很多列的表 (2)由于安全原因而隔离表 ...

  8. java多字段排序,java8 stream多字段排序的实现

    很多情况下sql不好解决的多表查询,临时表分组,排序,尽量用java8新特性stream进行处理 使用java8新特性,下面先来点基础的 List list; 代表某集合 //返回 对象集合以类属性一 ...

  9. MySQL中定义fk语句_MySQL基础篇/第3篇:MySQL基本操作语句.md · qwqoo/MySQL-Review - Gitee.com...

    ### 第3篇:MySQL基本操作语句 - MySQL基础操作 #### 排序检索数据 - 之前的数据没有进行排序,其是按照默认在数据表中的数据返回的 - SELECT语句的ORDER BY 子句进行 ...

最新文章

  1. 卷积神经网络基础:(6)卷积神经网络原理
  2. python字符串打印教学_python字符串格式化教你正确打印 : D
  3. 实时记录运动轨迹插件_智慧工地:“全能安全帽”自带WiFi 可实时拍摄通话
  4. 大型油烟机清洗机器人_高利洁大型油烟机清洗设备简介
  5. Exchanger和无GC的Java
  6. 如何在CDN边缘节点执行你的JavaScript?
  7. js实现kmp算法_字符串匹配算法KMP算法
  8. 计算机与工程建设项目结合,计算机科学与技术在工程建设项目管理中应用.doc...
  9. 架构设计文档规范文档
  10. 【转载】opencl中设备内存
  11. PHP yield简介
  12. 电力系统建模与仿真, 地理接线图,配电图,电力系统组态与监控,电力调度,自动控制,VBScript脚本控制,JavaScript脚本控制, 潮流分析2018...
  13. 一元二次方程求根。当a=0时,输出“It is not a quadratic equation \n“;当a不等于0时,输出“一对共轭复根: “x1 = %.2f+%.2fi, x2 = %.2f
  14. Pr 音频效果参考:立体声声像、时间与变调
  15. 世链投研|链游操作指南之MIR4
  16. 【产品】什么是虚位密码及其用途
  17. 【Excel2019(十七):数学函数】【Round函数+Roundup函数+Rounddown函数+Int函数+Mod函数】
  18. 线代笔记:行列式的性质及定理
  19. 网络协议之TCP和UDP
  20. 站群服务器金手指排名稳定,黑帽seo手法使用金手指:黑帽SEO,常见的SEO作弊手...

热门文章

  1. leetcode题目解析(js)--链表
  2. 分布式存储与传统SAN、NAS的优、劣对比
  3. 开源视频直播软件介绍
  4. 一位从业20年的程序员分享积累的20条编程经验
  5. MySQL优化 之 Discuz论坛优化
  6. 遵循Modbus协议通过Usb(Ch375)通信的上位机传输问题
  7. linux修改open files:ulimit、file-max
  8. linux常用命令:系统目录说明及命令ls,cp,touch,history,gparted分区
  9. arthas命令使用示例:monitor监视指定方法的执行情况
  10. Scala模式匹配(类似Java的switch)