博客
关于我
MySQL学习-group by和having
阅读量:797 次
发布时间: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/

你可能感兴趣的文章
nanoGPT 教程:从零开始训练语言模型
查看>>
NASA网站曝严重漏洞,或将沦为黑客钓鱼网站?
查看>>
Nash:轻量级、安全且可靠的脚本语言
查看>>
NAS、SAN和DAS的区别
查看>>
NAS个人云存储服务器搭建
查看>>
NAS服务器有哪些优势
查看>>
NAT PAT故障排除实战指南:从原理到技巧的深度探索
查看>>
nat 网卡间数据包转发_你是不是从来没有了解过光纤网卡,它跟普通网卡有什么区别?...
查看>>
NAT-DDNS内网穿透技术,快解析DDNS的优势
查看>>
NAT-DDNS内网穿透技术,快解析DDNS的优势
查看>>
NAT-DDNS内网穿透技术,解决动态域名解析难题
查看>>
natapp搭建外网服务器
查看>>
NativePHP:使用PHP构建跨平台桌面应用的新框架
查看>>
nativescript(angular2)——ListView组件
查看>>
NativeWindow_01
查看>>
Native方式运行Fabric(非Docker方式)
查看>>
Nature | 电子学“超构器件”, 从零基础到精通,收藏这篇就够了!
查看>>
Nature和Science同时报道,新疆出土四千年前遗骸完成DNA测序,证实并非移民而是土著...
查看>>
Nature封面:只低一毫米,时间也会变慢!叶军团队首次在毫米尺度验证广义相对论...
查看>>
Nat、端口映射、内网穿透有什么区别?
查看>>