数据库的DQL(3)

devtools/2025/1/22 4:13:40/

数据库的DQL(3)

分组查询

在MySQL中,group by关键字可以根据一个或多个字段对查询结果进行分组

group by 字段名

1.分组函数

有时也叫聚合函数

  • count(): 查询表中的记录数量
  • avg(): 求平均值
  • sum(): 求和
  • max():求最大值
  • min():求最小值

案例1:


mysql> select count(empno),sum(sal),avg(sal) from emp;
+--------------+----------+-------------+
| count(empno) | sum(sal) | avg(sal)    |
+--------------+----------+-------------+
|           14 | 29025.00 | 2073.214286 |
+--------------+----------+-------------+
1 row in set (0.00 sec)mysql> select  max(sal),min(sal) from emp;
+----------+----------+
| max(sal) | min(sal) |
+----------+----------+
|  5000.00 |   800.00 |
+----------+----------+
1 row in set (0.00 sec)

count函数主要功能是进行数据统计,但是在进行数据统计时,若果一张表中没有统计记录,那么coun()也会返回数据,只是这个数据是0

案例2:


mysql> select count(grade) from salgrade;
+--------------+
| count(grade) |
+--------------+
|            5 |
+--------------+
1 row in set (0.00 sec)mysql> create table tb_emp1(id int(11),name varchar(25),deptid int(11),salary float);
Query OK, 0 rows affected, 2 warnings (0.04 sec)mysql> select count(*) from tb_emp1;
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (0.00 sec)mysql> select sum(id) from tb_emp1;
+---------+
| sum(id) |
+---------+
|    NULL |
+---------+
1 row in set (0.00 sec)

若果使用其他函数,则有可能返回null值,但是count()永远都会返回一个具体的数字

2.分组统计

当数据重复时分组才有意义,一个也可以单独分一组,但是没有意义。

案例1:


mysql> select deptno,count(empno),avg(sal) from emp group by deptno;
+--------+--------------+-------------+
| deptno | count(empno) | avg(sal)    |
+--------+--------------+-------------+
|     10 |            3 | 2916.666667 |
|     20 |            5 | 2175.000000 |
|     30 |            6 | 1566.666667 |
+--------+--------------+-------------+
3 rows in set (0.00 sec)

案例2:


mysql> select job,max(sal),min(sal) from emp group by job;
+-----------+----------+----------+
| job       | max(sal) | min(sal) |
+-----------+----------+----------+
| CLERK     |  1300.00 |   800.00 |
| SALESMAN  |  1600.00 |  1250.00 |
| MANAGER   |  2975.00 |  2450.00 |
| ANALYST   |  3000.00 |  3000.00 |
| PRESIDENT |  5000.00 |  5000.00 |
+-----------+----------+----------+
5 rows in set (0.00 sec)

1.分组函数可以在没有分组的时候单独使用,可是不能出现其他的查询字段:

案例3:

#正确用法mysql> select count(empno) from emp;
+--------------+
| count(empno) |
+--------------+
|           14 |
+--------------+
1 row in set (0.00 sec)##错误用法
mysql> select empno count(empno) from emp;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'count(empno) from emp' at line 1

2.若果要进行分组,则select子句后,只能出现分组的字段和统计函数,其他字段不能出现:

案例4:

#正确用法mysql> select job ,count(empno),avg(sal) from emp group by job;
+-----------+--------------+-------------+
| job       | count(empno) | avg(sal)    |
+-----------+--------------+-------------+
| CLERK     |            4 | 1037.500000 |
| SALESMAN  |            4 | 1400.000000 |
| MANAGER   |            3 | 2758.333333 |
| ANALYST   |            2 | 3000.000000 |
| PRESIDENT |            1 | 5000.000000 |
+-----------+--------------+-------------+
5 rows in set (0.00 sec)##错误用法
mysql> select empno job ,count(empno),avg(sal) from emp group by job;
ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.emp.empno' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

3.分组函数允许嵌套,只不过需要通过字查询的方式实验:

案例5:

#按照职位分组,统计平均工资最高的工资
#先统计出各个职位的平均工资mysql> select job ,avg(sal) from emp group by job;
+-----------+-------------+
| job       | avg(sal)    |
+-----------+-------------+
| CLERK     | 1037.500000 |
| SALESMAN  | 1400.000000 |
| MANAGER   | 2758.333333 |
| ANALYST   | 3000.000000 |
| PRESIDENT | 5000.000000 |
+-----------+-------------+
5 rows in set (0.00 sec)#查询平均工资最高的工资mysql> select max(avgtb.avgsal ) from (select job,avg(sal) as avgsal from emp group by job) as avgtb;
+--------------------+
| max(avgtb.avgsal ) |
+--------------------+
|        5000.000000 |
+--------------------+
1 row in set (0.00 sec)

3.分组过滤

在MySQL中,可以使用having关键字对分组后的数据进行过滤

having 查询条件

HAVING 关键字和 WHERE 关键字都可以用来过滤数据,且 HAVING 支持 WHERE 关键字中所有的操作符和语法。

但是 WHERE 和 HAVING 关键字也存在以下几点差异:

  • 一般情况下,WHERE 用于过滤数据行,而 HAVING 用于过滤分组。

WHERE 查询条件中不可以使用聚合函数,而 HAVING 查询条件中可以使用聚合函数。

  • WHERE 在数据分组前进行过滤,而 HAVING 在数据分组后进行过滤 。

  • WHERE 针对数据库文件进行过滤,而 HAVING 针对查询结果进行过滤。也就是说,WHERE 根据数据表中的字段直接进行过滤,而 HAVING 是根据前面已经查询出的字段进行过滤。

  • WHERE 查询条件中不可以使用字段别名,而 HAVING 查询条件中可以使用字段别名。

案例1:


mysql> select ename,sal from emp having sal>1500;
+-------+---------+
| ename | sal     |
+-------+---------+
| ALLEN | 1600.00 |
| JONES | 2975.00 |
| BLAKE | 2850.00 |
| CLARK | 2450.00 |
| SCOTT | 3000.00 |
| KING  | 5000.00 |
| FORD  | 3000.00 |
+-------+---------+
7 rows in set (0.00 sec)

案例2:

mysql> select job,max(sal) from emp group by job;
+-----------+----------+
| job       | max(sal) |
+-----------+----------+
| CLERK     |  1300.00 |
| SALESMAN  |  1600.00 |
| MANAGER   |  2975.00 |
| ANALYST   |  3000.00 |
| PRESIDENT |  5000.00 |
+-----------+----------+
5 rows in set (0.00 sec)mysql> select job,max(sal) from emp group by job having job='manager';
+---------+----------+
| job     | max(sal) |
+---------+----------+
| MANAGER |  2975.00 |
+---------+----------+
1 row in set (0.00 sec)

http://www.ppmy.cn/devtools/152495.html

相关文章

深入解析人工智能中的协同过滤算法及其在推荐系统中的应用与优化

目录 什么是协同过滤算法核心原理基本步骤相似度计算代码实现详解1.流程图2.创建基础的数据结构存储用户评分数据3.计算用户相似度4.获取相似用户5.推荐方法 算法优化建议1. 数据预处理优化去除异常值和噪声数据进行数据标准化使用稀疏矩阵优化存储 2. 相似度计算优化使用局部敏…

STM32使用DSP库 Keil方式添加

文章目录 前言一、添加DSP库二、使能FPU及配置1. 使能FPU2. 增加编译的宏3.增加头文件的检索路径三. 验证1. 源码中添加2.代码测试前言 添加DSP有两种方案,本文采用的是是Keil 中添加。 一、添加DSP库 在创建好的工程中添加DSP库:步骤如下: 步骤1:选择运行环境管理; 步…

Spring参数校验,数组入参校验 :List<E>

1、程序内直接校验 参数进入控制层方法,使用具体的参数方法来验证,灵活不优雅 Objects.isNull() String.isEmpty()2、验证 单对象(Obj)使用 Validated 优雅,不灵活,对象类配置多 首先在对象类中 1、校验…

kafka学习

kafka (消息、生产者、消费者、toptic、分区、偏移量、broker、集群) Kafka是什么? 学习Kafka的目的,为了解决高吞吐量项目的需求,Kafka号称大数据的杀手锏,这款为大数据而生的消息中间件,以其百亿级tps的吞吐量名声…

nacos安装及SpringCloud整合

参考资料: 参考视频 参考demo SpringCloud-Alibaba基础框架搭建 nacos官网 nacos部署教程: 1.准备环境 - 1.64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。 - 2.64 bit JDK 1.8+;下载 & 配置。 - 3.Maven 3.2.x+;下载 & 配置。 2.版本选…

Django多线程爬虫:突破数据抓取瓶颈

Django框架以其高效、安全、可扩展性强等特点,在Web开发领域得到了广泛应用。同时,Python语言的多线程支持和丰富的库也为开发多线程爬虫提供了便利。将Django与多线程技术相结合,不仅可以利用Django的强大功能进行项目管理和数据存储&#x…

HTML中相对路径和绝对路径详解

文章目录 HTML中相对路径和绝对路径详解一、引言二、绝对路径1、定义2、使用场景3、代码示例 三、相对路径1、定义2、使用方法3、代码示例 四、使用示例1、图片路径2、CSS和JavaScript文件路径3、页面内部链接 五、总结 HTML中相对路径和绝对路径详解 一、引言 在HTML开发中&a…

MySQL面试题2025 每日20道【其四】

1、你们生产环境的 MySQL 中使用了什么事务隔离级别?为什么? 中等 在生产环境中,MySQL数据库的事务隔离级别通常由开发团队或数据库管理员根据应用的需求来设定。MySQL支持四种标准的事务隔离级别: 读未提交(Read Unc…