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

你可能感兴趣的文章
Mysql学习总结(75)——并发量大、数据量大的互联网业务数据库设计军规
查看>>
Mysql学习总结(76)——MySQL执行计划(explain)结果含义总结
查看>>
Mysql学习总结(77)——温故Mysql数据库开发核心原则与规范
查看>>
Mysql学习总结(78)——MySQL各版本差异整理
查看>>
Mysql学习总结(79)——MySQL常用函数总结
查看>>
Mysql学习总结(7)——MySql索引原理与使用大全
查看>>
Mysql学习总结(80)——统计数据库的总记录数和库中各个表的数据量
查看>>
Mysql学习总结(81)——为什么MySQL不推荐使用uuid或者雪花id作为主键?
查看>>
Mysql学习总结(82)——MySQL逻辑删除与数据库唯一性约束如何解决?
查看>>
Mysql学习总结(83)——常用的几种分布式锁:ZK分布式锁、Redis分布式锁、数据库分布式锁、基于JDK的分布式锁方案对比总结
查看>>
Mysql学习总结(84)—— Mysql的主从复制延迟问题总结
查看>>
Mysql学习总结(85)——开发人员最应该明白的数据库设计原则
查看>>
Mysql学习总结(8)——MySql基本查询、连接查询、子查询、正则表达查询讲解
查看>>
Mysql学习总结(9)——MySql视图原理讲解与使用大全
查看>>
Mysql学习笔记 - 在Centos7环境下离线安装Mysql
查看>>
MySQL学习笔记十七:复制特性
查看>>
Mysql学习第一课-mysql的定义及sql语句
查看>>
mysql学号的字符长度_MYSQL--2
查看>>
mysql安全模式: sql_safe_updates
查看>>
mysql安装,卸载,连接
查看>>