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

你可能感兴趣的文章
mysql5.7的安装和Navicat的安装
查看>>
mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
查看>>
Mysql8 数据库安装及主从配置 | Spring Cloud 2
查看>>
MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
查看>>
Mysql8.0以上重置初始密码的方法
查看>>
mysql8.0新特性-自增变量的持久化
查看>>
Mysql8.0注意url变更写法
查看>>
Mysql8.0的特性
查看>>
MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
查看>>
MySQL8修改密码的方法
查看>>
MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
查看>>
mysql8的安装与卸载
查看>>
MYSQL:基础——3N范式的表结构设计
查看>>
MYSQL:基础——触发器
查看>>
mysqlbinlog报错unknown variable ‘default-character-set=utf8mb4‘
查看>>
mysqldump 参数--lock-tables浅析
查看>>
mysqldump 导出中文乱码
查看>>
mysqldump 导出数据库中每张表的前n条
查看>>
mysqldump: Got error: 1044: Access denied for user ‘xx’@’xx’ to database ‘xx’ when using LOCK TABLES
查看>>
mysqldump备份时忽略某些表
查看>>