【MySQL】聚合查询 和 分组查询

 个人主页:♡喜欢做梦

欢迎  👍点赞  ➕关注  ❤️收藏  💬评论


目录

🌴 一、聚合查询

🌲1.概念

🌲2.聚合查询函数

COUNT()

 SUM()

AVG()

 MAX()和MIN()

🌴 二、分组查询

🍀1.GROUP BY子句

定义

语法

 🍀2.HAVING

定义

having与where的区别

🌴 三、插入查询结果

🍃语法


🌴 一、聚合查询

🌲1.概念

聚合查询:是SQL中对数据进行分组统计的操作,可以将多行数据按照特定条件合并计算,返回汇总结果。

🌲2.聚合查询函数

函数说明
COUNT()统计行数
SUM()统计数值列总和
AVG()统计数值列平均和
MAX()寻找最大值
MIN()寻找最小值
  • 除了函数COUNT(),其他如果不是数字没有意义;
  • 除了函数COUNT(),可以进行全列COUNT(*)查询,其他不可以;
  • null不参与该查询;
  • 多个聚合函数可以同时使用。

示例: 

-- 创建学生成绩表
mysql>  create table student_grade(->  id bigint auto_increment primary key,->  name varchar(20),->  chinese bigint,->  math bigint,->  english bigint);
Query OK, 0 rows affected (0.07 sec)mysql> insert into student_grade(name,chinese,math,english) values('张三',89,95,65),-> ('李四',96,88,67),('王柿子',78,91,75),('张亮',99,73,97);
Query OK, 4 rows affected (0.13 sec)
Records: 4  Duplicates: 0  Warnings: 0mysql> insert into student_grade(name,chinese,math,english) values('丽丽',null,56,89);
Query OK, 1 row affected (0.05 sec)mysql> select* from student_grade;
+----+-----------+---------+------+---------+
| id | name      | chinese | math | english |
+----+-----------+---------+------+---------+
|  1 | 张三      |      89 |   95 |      65 |
|  2 | 李四      |      96 |   88 |      67 |
|  3 | 王柿子    |      78 |   91 |      75 |
|  4 | 张亮      |      99 |   73 |      97 |
|  5 | 丽丽      |    NULL |   56 |      89 |
+----+-----------+---------+------+---------+
5 rows in set (0.00 sec)

COUNT()

mysql> select* from student_grade;
+----+-----------+---------+------+---------+
| id | name      | chinese | math | english |
+----+-----------+---------+------+---------+
|  1 | 张三      |      89 |   95 |      65 |
|  2 | 李四      |      96 |   88 |      67 |
|  3 | 王柿子    |      78 |   91 |      75 |
|  4 | 张亮      |      99 |   73 |      97 |
|  5 | 丽丽      |    NULL |   56 |      89 |
+----+-----------+---------+------+---------+
5 rows in set (0.00 sec)-- 推荐使用COUNT(*)查询
mysql> select count(*) from student_grade;
+----------+
| count(*) |
+----------+
|        5 |
+----------+
1 row in set (0.00 sec)-- 当然,也可以使用常量
mysql>  select count(1) from student_grade;
+----------+
| count(1) |
+----------+
|        5 |
+----------+
1 row in set (0.00 sec)-- 可以指定列查询,因为chinese中有null,这不会被统计在内
mysql> select count(chinese) from student_grade;
+----------------+
| count(chinese) |
+----------------+
|              4 |
+----------------+
1 row in set (0.00 sec)
  • 一般使用COUNT(*)来查询,里面也可以使用常量,当更推荐使用*;
  • 也可以指定列查询;
  • 当列中包含null,null不会被统计在内。 

 SUM()

mysql> select* from student_grade;
+----+-----------+---------+------+---------+
| id | name      | chinese | math | english |
+----+-----------+---------+------+---------+
|  1 | 张三      |      89 |   95 |      65 |
|  2 | 李四      |      96 |   88 |      67 |
|  3 | 王柿子    |      78 |   91 |      75 |
|  4 | 张亮      |      99 |   73 |      97 |
|  5 | 丽丽      |    NULL |   56 |      89 |
+----+-----------+---------+------+---------+
5 rows in set (0.00 sec)-- 查询数学成绩总和
mysql> select sum(math) from student_grade;
+-----------+
| sum(math) |
+-----------+
|       403 |
+-----------+
1 row in set (0.03 sec)-- 参数可以使用表达式
mysql> select sum(math+chinese+english) as total from student_grade;
+-------+
| total |
+-------+
|  1013 |
+-------+
1 row in set (0.04 sec)-- 查询语文成绩总和
-- 之前说到null与任何值结果相加都为null,chinese有null值但是其结果并不为null
-- 原因:在sum()求和时,null不参与运算
mysql> select sum(chinese) from student_grade;
+--------------+
| sum(chinese) |
+--------------+
|          362 |
+--------------+
1 row in set (0.00 sec)-- *一般用来取所有列,不能直接用在sun()函数里
mysql> select sum(*) from student_grade;
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 '*) from student_grade' at line 1
  • *不能直接使用sum()函数里面,一般用于计算某一列中数值的总和,也就是SUM(列名);
  • 参数可以使用表达式;
  • null不参与SUM()运算。 

AVG()

-- 查询语文成绩平均值
mysql>  select avg(chinese) from student_grade;
+--------------+
| avg(chinese) |
+--------------+
|      90.5000 |
+--------------+
1 row in set (0.00 sec)-- 查询数学成绩平均值
mysql> select avg(math) from student_grade;
+-----------+
| avg(math) |
+-----------+
|   80.6000 |
+-----------+
1 row in set (0.00 sec)-- 不能使用*
mysql> select avg(*) from student_grade;
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 '*) from student_grade' at line 1
  • 其注意事项与SUM()相似 

 MAX()和MIN()

mysql> select* from student_grade;
+----+-----------+---------+------+---------+
| id | name      | chinese | math | english |
+----+-----------+---------+------+---------+
|  1 | 张三      |      89 |   95 |      65 |
|  2 | 李四      |      96 |   88 |      67 |
|  3 | 王柿子    |      78 |   91 |      75 |
|  4 | 张亮      |      99 |   73 |      97 |
|  5 | 丽丽      |    NULL |   56 |      89 |
+----+-----------+---------+------+---------+
5 rows in set (0.00 sec)-- 查询数学成绩最大值
mysql>  select max(math) from student_grade;
+-----------+
| max(math) |
+-----------+
|        95 |
+-----------+
1 row in set (0.04 sec)-- 查询语文成绩最小值
mysql> select min(chinese) from student_grade;
+--------------+
| min(chinese) |
+--------------+
|           78 |
+--------------+
1 row in set (0.00 sec)-- 可以同时查询
mysql> select max(chinese),min(chinese) from student_grade;
+--------------+--------------+
| max(chinese) | min(chinese) |
+--------------+--------------+
|           99 |           78 |
+--------------+--------------+
1 row in set (0.00 sec)-- 使用别名
mysql> select max(chinese)数学最大值 ,min(chinese)语文最小值 from student_grade;
+-----------------+-----------------+
| 数学最大值      | 语文最小值      |
+-----------------+-----------------+
|              99 |              78 |
+-----------------+-----------------+
1 row in set (0.00 sec)

🌴 二、分组查询

🍀1.GROUP BY子句

定义

 定义:GROUP BY是SQL中用于分组聚合的核心子句,用于将查询结果按照一个或多个列的值进行分组,把具有相同列值的行归为一组。找同一组内的数据可以使用聚合函数(如COUNT、SUM、MAX、MIN)。

语法
select column1,sum(conumn2),... from table group by column1,colum3;
  • column1:分组的列名;
  • sum(column2): 没有被分组的列(需要的运算的列),如果要显示结果,需要用到聚合函数;
  • group by:分组查询的关键字;
  • column1:要分组的列名。

示例:

统计每个班级的学生数量

-- 创建学生表
mysql>  create table students(->  class_id bigint,   -- 学生所在班级->  name varchar(20)); -- 学生姓名
Query OK, 0 rows affected (0.04 sec)-- 插入
mysql>  insert into students values(1,'杨杨'),(3,'丽丽'),(1,'小美'),(2,'小帅'),(3,'王五');
Query OK, 5 rows affected (0.04 sec)
Records: 5  Duplicates: 0  Warnings: 0-- 查看学生表
mysql> select* from students;
+----------+--------+
| class_id | name   |
+----------+--------+
|        1 | 杨杨   |
|        3 | 丽丽   |
|        1 | 小美   |
|        2 | 小帅   |
|        3 | 王五   |
+----------+--------+
5 rows in set (0.00 sec)-- 分组:查看每个班级有多少学生
mysql> select class_id,count(class_id) as student_count from students group by class_id;
+----------+---------------+
| class_id | student_count |
+----------+---------------+
|        1 |             2 |
|        3 |             2 |
|        2 |             1 |
+----------+---------------+
3 rows in set (0.01 sec)-- 将其按班级编号进行升序排序
-- group by后面可以跟order by
mysql> select class_id,count(class_id) as student_count from students group by class_id order by class_id asc;
+----------+---------------+
| class_id | student_count |
+----------+---------------+
|        1 |             2 |
|        2 |             1 |
|        3 |             2 |
+----------+---------------+
3 rows in set (0.00 sec)

 🍀2.HAVING

定义

定义:对分组结果进行过滤,group by子句进行分组以后,不能使用where语句,而需要用HAVING。

-- 筛选分组后班级编号小于2的班级
mysql> select class_id,count(class_id) as student_count from students group by class_id having class_id<=2;
+----------+---------------+
| class_id | student_count |
+----------+---------------+
|        1 |             2 |
|        2 |             1 |
+----------+---------------+
2 rows in set (0.00 sec)
  • having必须和group by一起用,having要跟在group by后面; 
having与where的区别
区别wherehaving
作用对象分组前对原始数据进行筛选对分组后的结果进行筛选
使用限制不能使用聚合函数可以使用聚合函数

🌴 三、插入查询结果

插入查询结果:把一个表中的数据插入到另一个表中 

🍃语法

insert into table_name [(column1,column2,...)] 
select column1,colum2,...
from another_table
  • able_name : 被插入数据的表名;
  • another_table : 源表,即数据来源的表;
  • []:表示可写可不写,如果写了,那么colum1,colum2,...需要加上括号(),并且插入的列数量和数据类型要与被插入的列数量与数据类型相同。

示例:

将旧学生表1中的学生姓名插入到另一个表中 

-- 查看旧表学生表1找你中的信息:
mysql> select * from students;
+----------+--------+
| class_id | name   |
+----------+--------+
|        1 | 杨杨   |
|        3 | 丽丽   |
|        1 | 小美   |
|        2 | 小帅   |
|        3 | 王五   |
+----------+--------+
5 rows in set (0.02 sec)-- 创建新表
mysql> create table  new_student(-> id bigint auto_increment primary key,-> name varchar(20));
Query OK, 0 rows affected (0.09 sec)-- 将旧表中的学生名复制到新表中
mysql> insert into new_student (name) select name from students;
Query OK, 5 rows affected (0.08 sec)
Records: 5  Duplicates: 0  Warnings: 0-- 查看新表中的信息
mysql> select * from new_student;
+----+--------+
| id | name   |
+----+--------+
|  1 | 杨杨   |
|  2 | 丽丽   |
|  3 | 小美   |
|  4 | 小帅   |
|  5 | 王五   |
+----+--------+
5 rows in set (0.00 sec)

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81371.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    计算机启动流程中,都干了啥事。比如文件挂在,操作系统加载,中断向量表加载,磁盘初始化在哪阶段。

    建议在电脑上看&#xff0c;手机上格式有点问题&#xff0c;认真读&#xff0c;这方面没问题的&#xff0c;肝了一天。 目录.计算机启动详解 一.计算机启动直观图二.步骤详解前置准备磁盘初始化1.开机阶段2.执行BIOS阶段3.执行引导记录&#xff08;MBR&#xff09;阶段4.操作系…

    后端开发技术之Log日志框架

    第一章 日志原理 1.1 log发展历史 从JDK1.4开始提供java.until.logging&#xff0c;后来大佬发现JUL太难用了&#xff0c;就自己手撸了个log4j&#xff0c;后来log4j发现安全漏洞&#xff0c;加上代码结构问题难以维护&#xff0c;于是从1.2就停止更新log4j&#xff0c;并又重…

    美丽天天秒链动2+1源码(新零售商城搭建)

    什么是链动21模式&#xff1f; 链动21主要是建立团队模式&#xff0c;同时快速提升销量。是目前成员中速度最快的裂变模式。链动21模式合理合规&#xff0c;同时激励用户 公司的利润分享机制&#xff0c;让您在享受购物折扣的同时&#xff0c;也能促进并获得客观收益。 链动21模…

    Python10天冲刺-设计模型之策略模式

    策略模式是一种行为设计模式&#xff0c;它允许你在运行时动态地改变对象的行为。这种模式的核心思想是将一组相关的算法封装在一起&#xff0c;并让它们相互替换。 下面是使用 Python 实现策略模式的一个示例&#xff1a; 示例代码 假设我们有一个简单的购物车系统&#xf…

    【CTFer成长之路】XSS的魔力

    XSS闯关 level1 访问url&#xff1a; http://c884a553-d874-4514-9c32-c19c7d7b6e1c.node3.buuoj.cn/level1?usernamexss 因为是xss&#xff0c;所以对传参进行测试&#xff0c;修改?username1&#xff0c;进行访问 会发现username参数传入什么&#xff0c;welcome之后就…

    自主机器人模拟系统

    一、系统概述 本代码实现了一个基于Pygame的2D自主机器人模拟系统&#xff0c;具备以下核心功能&#xff1a; 双模式控制&#xff1a;支持手动控制&#xff08;WASD键&#xff09;和自动导航模式&#xff08;鼠标左键设定目标&#xff09; 智能路径规划&#xff1a;采用改进型…

    快速上手非关系型数据库-MongoDB

    简介 MongoDB 是一个基于文档的 NoSQL 数据库&#xff0c;由 MongoDB Inc. 开发。 NoSQL&#xff0c;指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写&#xff0c;是对不同于传统的关系型数据库的数据库管理系统的统称。 MongoDB 的设计理念是为了应对大数据量、…

    性能优化实践:启动优化方案

    性能优化实践&#xff1a;启动优化方案 在Flutter应用开发中&#xff0c;启动性能是用户体验的第一印象&#xff0c;也是应用性能优化的重要环节。本文将从理论到实践&#xff0c;深入探讨Flutter应用的启动优化方案。 一、Flutter应用启动流程分析 1. 启动类型 冷启动&…

    在文本废墟中打捞月光

    在文本废墟中打捞月光 ----再读三三的《山顶上是海》之“暗室”所理 今天是2025年5月1日&#xff0c;传统的“五一”小长假。当我早饭后“坐”在卫生间的那几分钟里&#xff0c;闺女和儿子就骑着家中仅有的两辆电动车去了图书馆。我是该做些什么&#xff1f; 于是我左手拿着三…

    C++之类和对象基础

    ⾯向对象三⼤特性&#xff1a;封装、继承、多态 类和对象 一.类的定义1. 类的定义格式2.类域 二.实例化1.对象2.对象的大小 三.this指针 在 C 的世界里&#xff0c;类和对象构成了面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;的核心框架&…

    计算机网络——HTTP/IP 协议通俗入门详解

    HTTP/IP 协议通俗入门详解 一、什么是 HTTP 协议&#xff1f;1. 基本定义2. HTTP 是怎么工作的&#xff1f; 二、HTTP 协议的特点三、HTTPS 是什么&#xff1f;它和 HTTP 有啥区别&#xff1f;1. HTTPS 概述2. HTTP vs HTTPS 四、HTTP 的通信过程步骤详解&#xff1a; 五、常见…

    使用 Java 实现一个简单且高效的任务调度框架

    目录 一、任务调度系统概述 &#xff08;一&#xff09;任务调度的目标 &#xff08;二&#xff09;任务调度框架的关键组成 二、任务状态设计 &#xff08;一&#xff09;任务状态流转设计 &#xff08;二&#xff09;任务表设计&#xff08;SQL&#xff09; 三、单机任…

    基于GPT 模板开发智能写作辅助应用

    目录 项目说明 1. 项目背景 2. 项目目标 3. 功能需求 4. 技术选型 项目结构 详细代码实现 前端代码(client) client/src/main.js client/src/App.vue client/src/components/HistoryList.vue 后端代码(server) server/app.js server/routes/api.js server/mo…

    linux 使用nginx部署next.js项目,并使用pm2守护进程

    前言 本文基于&#xff1a;操作系统 CentOS Stream 8 使用工具&#xff1a;Xshell8、Xftp8 服务器基础环境&#xff1a; node - 请查看 linux安装node并全局可用pm2 - 请查看 linux安装pm2并全局可用nginx - 请查看 linux 使用nginx部署vue、react项目 所需服务器基础环境&…

    使用huggingface_hub需要注意的事项

    在安装huggingface_hub的时候要注意如果你的python是放在c盘下时记得用管理员模式命令行来安装huggingface_hub&#xff0c;否则安装过程会报错&#xff0c;之后也不会有huggingface-cli命令。 如果安装时因为没有用管理员权限安装而报错了&#xff0c;可以先卸载huggingface-…

    Spring MVC @RequestHeader 注解怎么用?

    我们来详细解释一下 Spring MVC 中的 RequestHeader 注解。 RequestHeader 注解的作用 RequestHeader 注解用于将 HTTP 请求中的**请求头&#xff08;Request Headers&#xff09;**的值绑定到 Controller 方法的参数上。 请求头是 HTTP 请求的一部分&#xff0c;包含了关于…

    Rust 学习笔记:关于结构体的例题

    Rust 学习笔记&#xff1a;关于结构体的例题 Rust 学习笔记&#xff1a;关于结构体的例题下面的程序能通过编译吗&#xff1f;下面的程序能通过编译吗&#xff1f;下面的程序能通过编译吗&#xff1f;哪种说法最能描述 Display 和 Debug 特质之间的区别&#xff1f;下面哪个选项…

    STM32 SPI通信协议

    1. SPI协议概述 1.1 什么是SPI&#xff1f; SPI&#xff08;Serial Peripheral Interface&#xff09;是由摩托罗拉公司于1980年代提出的同步串行通信协议&#xff0c;主要用于短距离高速芯片间通信。作为四线制全双工通信协议&#xff0c;它以简单的硬件实现和高效的传输速率…

    92.一个简单的输入与显示示例 Maui例子 C#例子

    一、关于项目命名的注意事项 在开发.NET MAUI项目时&#xff0c;项目命名是一个不可忽视的细节。如果你习惯了在C#控制台或WPF项目中使用中文项目名称&#xff0c;那么在.NET MAUI中&#xff0c;你可能会遇到一些问题。我之前就因为使用中文项目名称而导致项目无法直接运行&am…

    Locate 3D:Meta出品自监督学习3D定位方法

    标题&#xff1a; Locate 3D: Real-World Object Localization via Self-Supervised Learning in 3D 摘要&#xff1a; 我们提出了 Locate 3D&#xff0c;这是一种可根据指代表达&#xff08;如“沙发和灯之间的小咖啡桌”&#xff09;在三维场景中定位物体的模型。Locate 3…