java8 多个字段分组_MySQL基础之分组查询
在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基础之分组查询相关推荐
- mysql 连接 分组_MySQL 基础 (四) 分组查询及连接查询
MySQL 基础 (四) 分组查询及连接查询 MySQL 基础(四) 进阶 5 分组查询 语法: SELECT 分组函数, 列(要求出现在 group by 的后面) FROM 表 [where 筛选 ...
- mysql select查询字段_MySQL基础:SELECT查询语句
Blog:博客园 个人 概述 SELECT语句用于从表中选取/查询数据,结果被存储在一个结果表中(称为结果集). 语法格式 SELECT [ALL | DISTINCT | DISTINCTROW ] ...
- mysql sum计算效率很慢_MySQL基础之分组函数
分组函数主要用于统计,又称为聚合函数.统计函数或组函数. 常见的分组函数有: SUM(expr) 求和AVG([DISTINCT] expr) 求平均值MAX(expr) 求最大值MIN(expr) ...
- mysql 查询指定字段数据_MySQL使用select语句查询指定表中指定列(字段)的数据
本文介绍mysql数据库中执行select查询语句,查询指定列的数据,即指定字段的数据. 再来回顾一下sql语句中的select语句的语法: select 语句的基本语法: select from w ...
- mysql 子查询多个字段_MySql基础
本文章目标 一.为什么要学习数据库 二.数据库的相关概念 DBMS.DB.SQL 三.数据库存储数据的特点 四.初始MySQL MySQL产品的介绍 MySQL产品的安装 ...
- mysql 分组求和_MySql基础语法
SQL语句分类 DDL:数据定义语言,用来定义数据库对象:库.表.列等 DML:数据操作语言,用来定义数据库记录(数据) DCL:数据控制语言,用来定义访问权限和安全级别: DQL:数据查询语言,用来 ...
- MYSQL数据库字段关联_MySQL数据库基础——操作关系表、连接查询
MySQL数据库基础入门--day11 一.操作关联表 1.关联关系: 关联关系有:多对一.多对多和一对多. 一对一关联关系可以应用在以下几方面: (1)分割具有很多列的表 (2)由于安全原因而隔离表 ...
- java多字段排序,java8 stream多字段排序的实现
很多情况下sql不好解决的多表查询,临时表分组,排序,尽量用java8新特性stream进行处理 使用java8新特性,下面先来点基础的 List list; 代表某集合 //返回 对象集合以类属性一 ...
- MySQL中定义fk语句_MySQL基础篇/第3篇:MySQL基本操作语句.md · qwqoo/MySQL-Review - Gitee.com...
### 第3篇:MySQL基本操作语句 - MySQL基础操作 #### 排序检索数据 - 之前的数据没有进行排序,其是按照默认在数据表中的数据返回的 - SELECT语句的ORDER BY 子句进行 ...
最新文章
- 卷积神经网络基础:(6)卷积神经网络原理
- python字符串打印教学_python字符串格式化教你正确打印 : D
- 实时记录运动轨迹插件_智慧工地:“全能安全帽”自带WiFi 可实时拍摄通话
- 大型油烟机清洗机器人_高利洁大型油烟机清洗设备简介
- Exchanger和无GC的Java
- 如何在CDN边缘节点执行你的JavaScript?
- js实现kmp算法_字符串匹配算法KMP算法
- 计算机与工程建设项目结合,计算机科学与技术在工程建设项目管理中应用.doc...
- 架构设计文档规范文档
- 【转载】opencl中设备内存
- PHP yield简介
- 电力系统建模与仿真, 地理接线图,配电图,电力系统组态与监控,电力调度,自动控制,VBScript脚本控制,JavaScript脚本控制, 潮流分析2018...
- 一元二次方程求根。当a=0时,输出“It is not a quadratic equation \n“;当a不等于0时,输出“一对共轭复根: “x1 = %.2f+%.2fi, x2 = %.2f
- Pr 音频效果参考:立体声声像、时间与变调
- 世链投研|链游操作指南之MIR4
- 【产品】什么是虚位密码及其用途
- 【Excel2019(十七):数学函数】【Round函数+Roundup函数+Rounddown函数+Int函数+Mod函数】
- 线代笔记:行列式的性质及定理
- 网络协议之TCP和UDP
- 站群服务器金手指排名稳定,黑帽seo手法使用金手指:黑帽SEO,常见的SEO作弊手...