MySQL数据库学习之分组函数详解

 更新时间:2022年07月24日 09:51:10   作者:世界尽头与你  
这篇文章主要为大家详细介绍一下MySQL数据库中分组函数的使用,文中的示例代码讲解详细,对我们学习MySQL有一定帮助,需要的可以参考一下

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)

到此这篇关于MySQL数据库学习之分组函数详解的文章就介绍到这了,更多相关MySQL数据库 分组函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL中存储时间的最佳实践指南

    MySQL中存储时间的最佳实践指南

    这篇文章主要给大家介绍了关于MySQL中存储时间的最佳实践,文中详细介绍了哪种存储时间的方式更好,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友可以参考下
    2021-07-07
  • MySQL5.6.31 winx64.zip 安装配置教程详解

    MySQL5.6.31 winx64.zip 安装配置教程详解

    这篇文章主要介绍了MySQL5.6.31 winx64.zip 安装配置教程详解,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-02-02
  • Mysql5.7.11绿色版安装教程图文详解

    Mysql5.7.11绿色版安装教程图文详解

    本文通过图文并茂的形式给大家展示Mysql5.7.11绿色版安装教程,非常不错,具有参考借鉴价值,需要的朋友参考下
    2017-01-01
  • JDBC连接的六步实例代码(与mysql连接)

    JDBC连接的六步实例代码(与mysql连接)

    这篇文章主要给大家介绍了关于JDBC连接的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • MySQL-group-replication 配置步骤(推荐)

    MySQL-group-replication 配置步骤(推荐)

    下面小编就为大家带来一篇MySQL-group-replication 配置步骤(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Scott 数据 映射 MySQL代码实现分享

    Scott 数据 映射 MySQL代码实现分享

    这篇文章主要介绍了Scott 数据 映射 MySQL,文章围绕Scott 数据 映射 MySQL的相关代码分享给大家,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-02-02
  • mysql 批量查询取每一组最新一条数据

    mysql 批量查询取每一组最新一条数据

    根据车牌号查询最新的一条交车记录的‘合同号’ ,这里只需要查询‘合同号’这个字段,这篇文章主要介绍了mysql 批量查询取每一组最新一条数据,需要的朋友可以参考下
    2024-02-02
  • 构建双vip的高可用MySQL集群

    构建双vip的高可用MySQL集群

    大家好,本篇文章主要讲的是构建双vip的高可用MySQL集群,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • MySQL 半同步复制的实现

    MySQL 半同步复制的实现

    半同步复制是MySQL复制的一种形式,它结合了异步复制和同步复制的特性,本文主要介绍了 MySQL 半同步复制的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-09-09
  • MySQL中Decimal类型和Float Double的区别(详解)

    MySQL中Decimal类型和Float Double的区别(详解)

    下面小编就为大家带来一篇MySQL中Decimal类型和Float Double的区别(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03

最新评论