• 【MySQL】聚合查询与分组查询


    我们先重建一个test库,在test库里新建一个people表(包含序列号,姓名,工资),再往表该表里新增六条数据:

    1. mysql> drop database if exists test;
    2. Query OK, 1 row affected (0.07 sec)
    3. mysql> create database test;
    4. Query OK, 1 row affected (0.00 sec)
    5. mysql> use test;
    6. Database changed
    7. mysql> create table people(
    8. -> id int primary key auto_increment,
    9. -> name varchar(20),
    10. -> careen varchar(20),
    11. -> salary int
    12. -> );
    13. Query OK, 0 rows affected (0.05 sec)
    14. mysql> insert into people value(null,"张三","老师",3000);
    15. Query OK, 1 row affected (0.01 sec)
    16. mysql> insert into people value(null,"李四","老师",4000);
    17. Query OK, 1 row affected (0.01 sec)
    18. mysql> insert into people value(null,"王五","老师",5000);
    19. Query OK, 1 row affected (0.01 sec)
    20. mysql> insert into people value(null,"赵六","医生",60000);
    21. Query OK, 1 row affected (0.00 sec)
    22. mysql> insert into people value(null,"小七","医生",70000);
    23. Query OK, 1 row affected (0.00 sec)
    24. mysql> insert into people value(null,null,null,null);
    25. Query OK, 1 row affected (0.00 sec)
    26. mysql> select * from people;
    27. +----+--------+--------+--------+
    28. | id | name | careen | salary |
    29. +----+--------+--------+--------+
    30. | 1 | 张三 | 老师 | 3000 |
    31. | 2 | 李四 | 老师 | 4000 |
    32. | 3 | 王五 | 老师 | 5000 |
    33. | 4 | 赵六 | 医生 | 60000 |
    34. | 5 | 小七 | 医生 | 70000 |
    35. | 6 | NULL | NULL | NULL |
    36. +----+--------+--------+--------+
    37. 6 rows in set (0.00 sec)

    接下来我们就针对该表进行聚合查询操作~

    ♫聚合查询

    前面我们所用的基础的查询操作只能对每行进行独立的查询操作,而要是想要查询的结果是该列所有数据的平均值,最大或最小值,则需要使用聚合查询才能做到。聚合查询需要用到聚合函数,因此,要学会聚合查询,首先得先了解下MySQL中的聚合函数。

    ♪聚合函数

    常见的聚合函数有以下几种:

    函数描述
    COUNT([DISTINCT] expr)
    返回查询到的数据的数量
    AVG([DISTINCT] expr)
    返回查询到的数据的总和,不是数字没有意义
    SUM([DISTINCT] expr)
    返回查询到的数据的平均值,不是数字没有意义
    MAX([DISTINCT] expr)
    返回查询到的数据的最大值,不是数字没有意义
    MIN([DISTINCT] expr)
    返回查询到的数据的最小值,不是数字没有意义

    知道了聚合函数,接下来就可以使用这些聚合函数进行聚合查询操作了。

    ♪查询表的行数

    查询表的行数需要用到聚合函数count():

    语法:select count(*) from 表名;

    1. mysql> select count(*) from people;
    2. +----------+
    3. | count(*) |
    4. +----------+
    5. | 6 |
    6. +----------+
    7. 1 row in set (0.00 sec)

    此外count(常量)也能查询表的行数:

    语法:select count(常量) from 表名;

    1. mysql> select count(1) from people;
    2. +----------+
    3. | count(1) |
    4. +----------+
    5. | 6 |
    6. +----------+
    7. 1 row in set (0.00 sec)

    注:

    ①.count(1)和count(*)的实现方式略有不同,count(1)是对表中的每一行都执行一次计数操作,而count(*)则是对整个表执行计数操作

    ②.查询表的行数包括全为NULL的行

    ♪查询表某一列的行数

    单独查询表某一列有几行也是需要用到count():

    语法:select count(列名/表达式) from 表名;

    1. mysql> select count(name) from people;
    2. +----------------+
    3. | count(name) |
    4. +----------------+
    5. | 5 |
    6. +----------------+
    7. 1 row in set, 5 warnings (0.00 sec)

    注:查询某一列的行数不会包含NULL数据

    ♪查询表某一列数据的和

    要想查询结果是某一列的数据和就需要用到聚合函数sum():

    语法:select sum(列名/表达式) from 表名;

    1. mysql> select sum(salary) from people;
    2. +-------------+
    3. | sum(salary) |
    4. +-------------+
    5. | 142000 |
    6. +-------------+
    7. 1 row in set (0.00 sec)

    注:只能查询数字列的和,不能求字符串/日期的和

    ♪查询表某一列数据的平均值

    要查询某一列数据的平均值就需要用到聚合函数avg():

    语法:select avg(列名/表达式) from 表名;

    1. mysql> select avg(salary) from people;
    2. +-------------+
    3. | avg(salary) |
    4. +-------------+
    5. | 28400.0000 |
    6. +-------------+
    7. 1 row in set (0.00 sec)

    注:只能查询数字列的平均值

    ♪查询表某一列数据的最大值

    要查询某一列数据的最大值就需要用到聚合函数max():

    语法:select max(列名/表达式) from 表名;

    1. mysql> select max(salary) from people;
    2. +-------------+
    3. | max(salary) |
    4. +-------------+
    5. | 70000 |
    6. +-------------+
    7. 1 row in set (0.00 sec)

    注:只能查询数字列的最大值

    ♪查询表某一列数据的最小值

    要查询某一列数据的最小值就需要用到聚合函数min():

    语法:select min(列名/表达式) from 表名;

    1. mysql> select min(salary) from people;
    2. +-------------+
    3. | min(salary) |
    4. +-------------+
    5. | 3000 |
    6. +-------------+
    7. 1 row in set (0.00 sec)

    注:只能查询数字列的最小值

    上面聚合查询的对象是所有人,要想查询的对象为同一职业的人,可以通过group by子句来实现。

    ♫分组查询

    ♪group by子句

    select中使用 group by 子句可以对指定列进行分组查询。需要满足:使用group by 进行分组查询时,select 指定的字段必须是 分组依据字段 ,其他字段若想出现在 select 中则必须包含在聚合函
    数中。

    语法:select 列名,聚合函数,... from 表名 group by 列名;

    1. -- 查询每种职业的最高薪资
    2. mysql> select careen,max(salary) from people group by careen;
    3. +--------+-------------+
    4. | careen | max(salary) |
    5. +--------+-------------+
    6. | NULL | NULL |
    7. | 医生 | 70000 |
    8. | 老师 | 5000 |
    9. +--------+-------------+
    10. 3 rows in set (0.01 sec)

    如果是不带聚合函数的分组查询,查询结果为每个分组的第一条记录:

    1. mysql> select * from people group by careen;
    2. +----+--------+--------+--------+
    3. | id | name | careen | salary |
    4. +----+--------+--------+--------+
    5. | 6 | NULL | NULL | NULL |
    6. | 4 | 赵六 | 医生 | 60000 |
    7. | 1 | 张三 | 老师 | 3000 |
    8. +----+--------+--------+--------+
    9. 3 rows in set (0.01 sec)

    分组查询还可以对分组前指定条件或对分组后指定条件:

    ♪分组前指定条件

    对筛选出来的数据进行分组查询:

    语法:select 列名,聚合函数,... from 表名 group by 列名 where 指定条件;

    1. -- 取所有工资大于3000的人,对这类人按照对应职业进行分组查询
    2. mysql> select careen,avg(salary) from people where salary>3000 group by careen;
    3. +--------+-------------+
    4. | careen | avg(salary) |
    5. +--------+-------------+
    6. | 医生 | 65000.0000 |
    7. | 老师 | 4500.0000 |
    8. +--------+-------------+
    9. 2 rows in set (0.02 sec)

    ♪分组后指定条件

    对分组查询后的数据进行筛选:

    语法:select 列名,聚合函数,... from 表名 group by 列名 having 指定条件;

    1. -- -- 按照职业进行分组查询,取查询结果中平均工资大于5000的职业
    2. mysql> select careen,avg(salary) from people group by careen having avg(salary)>5000;
    3. +--------+-------------+
    4. | careen | avg(salary) |
    5. +--------+-------------+
    6. | 医生 | 65000.0000 |
    7. +--------+-------------+
    8. 1 row in set (0.00 sec)
  • 相关阅读:
    【mysql篇-进阶篇】锁
    分享一个有意思的线程相关的程序运行题
    C语言,求一个十进制数的二进制中1出现的次数,版本2.0(另外两种方法介绍)
    Git推送和拉取Github
    6.12ctf练习
    Biomedical knowledge graph-enhanced prompt generation for large language models
    Java课程设计:基于swing的贪吃蛇小游戏
    玩转 CMS2
    前端培训栈和堆有什么区别
    分页查询慢的优化方式
  • 原文地址:https://blog.csdn.net/qq_61872165/article/details/133688782