Mysql数据库,分组函数篇

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: count(具体字段) 表示该字段下不为null的行数count(*) 表示整个范围的行数,因为数据库表中并不存在记录全为null的情况!😁2.分组查询GROUP BY 语句根据一个或多个列对结果集进行分组。在分组的列上我们可以使用 COUNT, SUM, AVG等函数。


1.分组函数


极值


示例表内容见此篇文章

找出最高工资:


mysql> select max(sal) from emp;
+----------+
| max(sal) |
+----------+
|  5000.00 |
+----------+
1 row in set (0.00 sec)


找出最低工资:


mysql> select min(sal) from emp;
+----------+
| min(sal) |
+----------+
|   800.00 |
+----------+
1 row in set (0.00 sec)


求和


将所有人的工资相加:


mysql> select sum(sal) from emp;
+----------+
| sum(sal) |
+----------+
| 29025.00 |
+----------+
1 row in set (0.00 sec)


平均值


求所有人的平均工资:


mysql> select avg(sal) from emp;
+-------------+
| avg(sal)    |
+-------------+
| 2073.214286 |
+-------------+
1 row in set (0.00 sec)


列数和


计算员工数量总和:


mysql> select count(ename) from emp;
+--------------+
| count(ename) |
+--------------+
|           14 |
+--------------+
1 row in set (0.00 sec)


count(具体字段) 表示该字段下不为null的行数


count(*) 表示整个范围的行数,因为数据库表中并不存在记录全为null的情况!😁


2.分组查询


GROUP BY 语句根据一个或多个列对结果集进行分组。


在分组的列上我们可以使用 COUNT, SUM, AVG等函数。

GROUP BY 语法


SELECT column_name, function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name;


请注意,在进行关键字组合的时候,他们的顺序是这样的:


select ...
from ...
where ...
group by ...
order by ...


样的顺序是不可以被更改的,且他们在Mysql内部的执行顺序是:


from 
where 
group by
select
order by


注意:分组函数在进行使用的时候要先分组才能使用🤡

那么现在出现了一个问题,如下语句看似违反了组合顺序,但是它为什么是正确的呢?


select sum(sal) from emp;


因为select在group by之后执行🤳

现在,我们来看一个分组查询的示例,找出每个工作岗位的工资和:


mysql> select job,sum(sal) from emp
    -> group by job;
+-----------+----------+
| job       | sum(sal) |
+-----------+----------+
| CLERK     |  4150.00 |
| SALESMAN  |  5600.00 |
| MANAGER   |  8275.00 |
| ANALYST   |  6000.00 |
| PRESIDENT |  5000.00 |
+-----------+----------+
5 rows in set (0.01 sec)


找出每个部门的最高薪资:


mysql> select deptno,max(sal) from emp group by deptno;
+--------+----------+
| deptno | max(sal) |
+--------+----------+
|     20 |  3000.00 |
|     30 |  2850.00 |
|     10 |  5000.00 |
+--------+----------+
3 rows in set (0.00 sec)


以上这些都是小儿科,现在我们来看看如何将两个字段进行联合分组:👀

查找每个部门不同岗位的最高薪资:


mysql> select deptno,job,max(sal)
    -> from emp
    -> group by deptno,job;
+--------+-----------+----------+
| deptno | job       | max(sal) |
+--------+-----------+----------+
|     20 | CLERK     |  1100.00 |
|     30 | SALESMAN  |  1600.00 |
|     20 | MANAGER   |  2975.00 |
|     30 | MANAGER   |  2850.00 |
|     10 | MANAGER   |  2450.00 |
|     20 | ANALYST   |  3000.00 |
|     10 | PRESIDENT |  5000.00 |
|     30 | CLERK     |   950.00 |
|     10 | CLERK     |  1300.00 |
+--------+-----------+----------+
9 rows in set (0.00 sec)


3.小练习


找出每个部门的最高薪资,要求显示最高薪资大于3000的:

请注意:如果我们想要对分完组之后的数据进行再次的过滤,需要使用having子句✨having不能单独进行使用,必须和group by进行联合使用


mysql> select deptno,max(sal)
    -> from emp
    -> group by deptno
    -> having max(sal) > 3000;
+--------+----------+
| deptno | max(sal) |
+--------+----------+
|     10 |  5000.00 |
+--------+----------+
1 row in set (0.00 sec)


如上的sql语句效率很低,我们尝试进行一个小的优化:


mysql> select deptno,max(sal)
    -> from emp
    -> where sal > 3000
    -> group by deptno;
+--------+----------+
| deptno | max(sal) |
+--------+----------+
|     10 |  5000.00 |
+--------+----------+
1 row in set (0.00 sec)


where 和 having 请优先选择where🍳

找出每个部门平均薪资大于2500的:

我们发现无法使用where实现此需求,这时只能使用having子句:


mysql> select deptno,avg(sal)
    -> from emp
    -> group by deptno
    -> having avg(sal) > 2500;
+--------+-------------+
| deptno | avg(sal)    |
+--------+-------------+
|     10 | 2916.666667 |
+--------+-------------+
1 row in set (0.00 sec)


4.大BOSS


找出每个岗位的平均薪资,要求显示平均薪资大于1500的,除了MANAGER外,要求按照平均薪资降序排列:


mysql> select job,avg(sal)
    -> from emp
    -> where job != 'MANAGER'
    -> group by job
    -> having avg(sal) > 1500
    -> order by avg(sal) desc;
+-----------+-------------+
| job       | avg(sal)    |
+-----------+-------------+
| PRESIDENT | 5000.000000 |
| ANALYST   | 3000.000000 |
+-----------+-------------+
2 rows in set (0.00 sec)
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
关系型数据库 MySQL 数据库
MySQL数据库:第六章:分组函数/聚合函数
MySQL数据库:第六章:分组函数/聚合函数
|
21小时前
|
关系型数据库 MySQL Linux
Linux CentOs7 安装Mysql(5.7和8.0版本)密码修改 超详细教程
Linux CentOs7 安装Mysql(5.7和8.0版本)密码修改 超详细教程
|
1天前
|
SQL 缓存 关系型数据库
MySQL常见问题解决和自动化安装脚本
这篇内容包含了两个主要部分:解决MySQL登录问题和处理GPG密钥问题。当MySQL密码正确但无法登录时,可以通过执行SQL命令`ALTER USER`和`flush privileges`来修改和重置密码。对于MySQL安装时的GPG密钥错误,首先需要强制删除旧的MySQL仓库包,导入新的GPG公钥,然后安装MySQL服务器。如果遇到GPG检查错误,可以使用`--nogpgcheck`参数忽略检查来安装。最后,提供了一个自动化安装MySQL的脚本,用于检查旧版本、卸载残留、安装MySQL8并启动服务。
12 1
MySQL常见问题解决和自动化安装脚本
|
5天前
|
SQL 关系型数据库 MySQL
【MySQL-3】图形化界面工具DataGrip安装&配置&使用
【MySQL-3】图形化界面工具DataGrip安装&配置&使用
|
5天前
|
关系型数据库 MySQL Linux
【MySQL-2】MySQL的下载&安装&启停&配置环境变量【一条龙教程】
【MySQL-2】MySQL的下载&安装&启停&配置环境变量【一条龙教程】
|
7天前
|
弹性计算 关系型数据库 MySQL
在线安装MySQL5.7和MySQL8.0
【4月更文挑战第30天】
24 0
|
7天前
|
存储 关系型数据库 MySQL
docker安装mysql8忽略大小写
docker安装mysql8忽略大小写
|
7天前
|
Ubuntu 关系型数据库 MySQL
Ubuntu 20.04 + mysql8 安装以及配置大小写不敏感
Ubuntu 20.04 + mysql8 安装以及配置大小写不敏感
|
7天前
|
关系型数据库 MySQL 开发工具
Docker安装mysql8.0
Docker安装mysql8.0
|
7天前
|
弹性计算 关系型数据库 MySQL
在线安装mysql-5.6
【4月更文挑战第30天】
10 0