博客
关于我
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报错Can‘t create/write to file ‘/tmp/#sql_3a8_0.MYD‘ (Errcode: 28 - No space left on device)
查看>>
MySql报错Deadlock found when trying to get lock; try restarting transaction 的问题解决
查看>>
MySQL报错ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘
查看>>
Mysql报错Packet for query is too large问题解决
查看>>
mysql报错级别_更改MySQL日志错误级别记录非法登陆(Access denied)
查看>>
Mysql报错:too many connections
查看>>
MySQL报错:无法启动MySQL服务
查看>>
mysql授权用户,创建用户名密码,授权单个数据库,授权多个数据库
查看>>
mysql排序查询
查看>>
MySQL排序的艺术:你真的懂 Order By吗?
查看>>
MySQL排序的艺术:你真的懂 Order By吗?
查看>>
Mysql推荐书籍
查看>>
Mysql插入数据从指定选项中随机选择、插入时间从指定范围随机生成、Navicat使用存储过程模拟插入测试数据
查看>>
MYSQL搜索引擎
查看>>
mysql操作数据表的命令_MySQL数据表操作命令
查看>>
mysql操作日志记录查询_如何使用SpringBoot AOP 记录操作日志、异常日志?
查看>>
MySQL支持的事务隔离级别,以及悲观锁和乐观锁的原理和应用场景?
查看>>
mysql支持表情
查看>>
MySQL支撑百万级流量高并发的网站部署详解
查看>>
MySQL改动rootpassword的多种方法
查看>>