博客
关于我
MySQL学习-group by和having
阅读量:798 次
发布时间:2023-02-12

本文共 2773 字,大约阅读时间需要 9 分钟。

MySQL查询优化教程

基础查询

SELECT语句

SELECT 用于从数据库中检取数据,是最基本的查询语句。

SELECT column_name1, column_name2 FROM table_name;
  • column_name1, column_name2:指定需要查询的字段。
  • table_name:指定查询的表名。

WHERE过滤

WHERE 用于对结果集进行过滤,仅返回符合条件的记录。

SELECT ename, job FROM emp WHERE hiredate BETWEEN '1980-01-01' AND '1990-12-31';
  • BETWEEN 用于指定一个范围。
  • ANDOR 用于逻辑连接。

GROUP BY分组

GROUP BY 用于将结果集按照指定的字段进行分组。

SELECT job, COUNT(*) FROM emp GROUP BY job;
  • COUNT(*):统计每个分组的记录数。

HAVING过滤

HAVING 用于对分组后的结果集进行过滤。

SELECT job, MAX(sal) FROM emp GROUP BY job HAVING MAX(sal) > 1000;
  • MAX(sal):计算每个分组的最大值。
  • HAVING 适用于 GROUP BY 之后。

多字段分组查询

同时分组多个字段

如果需要对多个字段进行分组,可以将它们放在 GROUP BY 列表中。

SELECT deptno, job, MAX(sal) FROM emp GROUP BY deptno, job;
  • 结果将按 deptnojob 两个字段分组显示最大薪资。

多字段分组查询示例

想要找出每个部门不同工作岗位的最高薪资,首先需要列出数据:

SELECT deptno, job, sal FROM emp ORDER BY deptno;

执行后结果如下:

deptno job sal
10 MANAGER 2450.00
10 PRESIDENT 5000.00
10 CLERK 1300.00
20 CLERK 800.00
20 MANAGER 2975.00
20 ANALYST 3000.00
20 CLERK 1100.00
30 SALESMAN 1600.00
30 SALESMAN 1250.00
30 SALESMAN 1250.00
30 MANAGER 2850.00
30 CLERK 950.00
30 SALESMAN 1500.00

接着进行分组查询:

SELECT deptno, job, MAX(sal) FROM emp GROUP BY deptno, job;

执行后结果如下:

deptno job MAX(sal)
10 MANAGER 5000.00
10 PRESIDENT 5000.00
10 CLERK 1300.00
20 CLERK 800.00
20 MANAGER 2975.00
20 ANALYST 3000.00
20 CLERK 1100.00
30 SALESMAN 1500.00
30 MANAGER 2850.00

WHERE和HAVING的使用

组合使用WHERE和HAVING

想要找出每个部门的最高薪资且薪资大于2900的数据,可以先查出每个部门的最高薪资:

SELECT deptno, MAX(sal) FROM emp GROUP BY deptno;

执行后结果如下:

deptno MAX(sal)
10 5000.00
20 3000.00
30 2850.00

然后对结果进行过滤:

SELECT deptno, MAX(sal) FROM emp GROUP BY deptno HAVING MAX(sal) > 2900;

执行后结果如下:

deptno MAX(sal)
10 5000.00

统计部门薪资

想要找出每个部门的平均薪资且薪资大于2000的数据,首先计算平均值:

SELECT deptno, AVG(sal) FROM emp GROUP BY deptno;

执行后结果如下:

deptno AVG(sal)
10 2916.67
20 2175.00
30 2758.33

然后对结果进行过滤:

SELECT deptno, AVG(sal) FROM emp GROUP BY deptno HAVING AVG(sal) > 2000;

执行后结果如下:

deptno AVG(sal)
10 2916.67

去重操作

去重查询

使用 DISTINCT 去重字段。

SELECT DISTINCT job FROM emp;

执行后结果如下:

job
CLERK
SALESMAN
MANAGER
ANALYST
PRESIDENT

统计不同岗位数量

想要统计不同岗位的数量,可以使用 COUNT(DISTINCT)

SELECT COUNT(DISTINCT job) FROM emp;

执行后结果如下:

COUNT(DISTINCT job)
5

总结完整的DQL语句结构

完整的DQL语句结构如下:

SELECT [字段列表] FROM [表名] WHERE [条件] GROUP BY [分组字段] HAVING [过滤条件] ORDER BY [排序字段];
  • SELECT:指定要返回的字段。
  • FROM:指定数据来源。
  • WHERE:对数据进行过滤。
  • GROUP BY:对数据进行分组。
  • HAVING:对分组后的数据进行过滤。
  • ORDER BY:对结果进行排序。

完整示例

想要找出每个部门的不同工作岗位的最高薪资,并按薪资降序排列,可以使用以下语句:

SELECT deptno, job, MAX(sal) FROM emp GROUP BY deptno, job ORDER BY MAX(sal) DESC;

执行后结果如下:

deptno job MAX(sal)
10 PRESIDENT 5000.00
10 MANAGER 2450.00
10 CLERK 1300.00
20 ANALYST 3000.00
20 MANAGER 2975.00
20 CLERK 800.00
30 MANAGER 2850.00
30 SALESMAN 1500.00
30 CLERK 950.00
30 SALESMAN 1250.00

通过以上步骤,您可以逐步掌握如何使用 GROUP BYHAVING 对数据进行分组和过滤,以及如何使用 DISTINCT 去重字段。这些知识将帮助您高效地完成复杂的数据查询任务。

转载地址:http://xrbfk.baihongyu.com/

你可能感兴趣的文章
Vue输出HTML
查看>>
netty——黏包半包的解决方案、滑动窗口的概念
查看>>
Netty中Http客户端、服务端的编解码器
查看>>
Netty中使用WebSocket实现服务端与客户端的长连接通信发送消息
查看>>
Netty中实现多客户端连接与通信-以实现聊天室群聊功能为例(附代码下载)
查看>>
Netty中的组件是怎么交互的?
查看>>
Netty中集成Protobuf实现Java对象数据传递
查看>>
netty之 定长数据流处理数据粘包问题
查看>>
Netty事件注册机制深入解析
查看>>
netty代理
查看>>
Netty入门使用
查看>>
netty入门,入门代码执行流程,netty主要组件的理解
查看>>
Netty原理分析及实战(一)-同步阻塞模型(BIO)
查看>>
Netty原理分析及实战(三)-高可用服务端搭建
查看>>
Netty原理分析及实战(二)-同步非阻塞模型(NIO)
查看>>
Netty原理分析及实战(四)-客户端与服务端双向通信
查看>>
Netty发送JSON格式字符串数据
查看>>
Netty和Tomcat的区别已经性能对比
查看>>
Netty在IDEA中搭建HelloWorld服务端并对Netty执行流程与重要组件进行介绍
查看>>
Netty基础—1.网络编程基础一
查看>>