SQL语句——聚合函数、分组、子查询及组合查询

浅谈SQL注入中的-1‘ union select 1,2,3# 超详细的介绍了SQL注入语句中的 -1' union select 1,2,3# 的含义 阅读详情

一、聚合函数

聚合函数:SQL中提供的聚合函数可以用来统计、求和、求最值等等。

分类:

  • COUNT:统计行数量
  • SUM:获取单个列的合计值
  • AVG:计算某个列的平均值
  • MAX:计算列的最大值
  • MIN:计算列的最小值

首先,创建数据表如下:
这里写图片描述


1. 执行列、行计数(count):

标准格式

SELECT COUNT(<计数规范>) FROM <表名>

其中,计数规范包括:

  • * :计数所有选择的行,包括NULL值;
  • ALL 列名:计数指定列的所有非空值行,如果不写,默认为ALL;
  • DISTINCT 列名:计数指定列的唯一非空值行。

例,计算班里共有多少学生:

SELECT COUNT(*) FROM t_student;

这里写图片描述

也可加入筛选条件,如求女学生数目:

SELECT COUNT(*) FROM t_student WHERE student_sex='女';

这里写图片描述

如果要计算班级数目,就需要用到DISTINCT:

SELECT COUNT(DISTINCT student_class) FROM t_student;

这里写图片描述

DISTINCT即去重,如果不加DISTINCT则结果为表行数——5。


2. 返回列合计值(SUM):

注:sum只有ALL与DISTINCT两种计数规范,无*。

计算学生年龄之和:

SELECT SUM(student_age) FROM t_student;

这里写图片描述


3. 返回列平均值(AVG):

计算学生平均年龄:

SELECT AVG(student_age)FROM t_student;

这里写图片描述


4. 返回最大值/最小值(MAX/MIN):

求年龄最大的学生信息(最小值同理):

SELECT MAX(student_age) FROM t_student;

这里写图片描述

注:这里只能求出最大年龄,要想显示年龄最大的学生全部信息,需要用到之后的子查询。


二、数据分组(GROUP BY):

SQL中数据可以按列名分组,搭配聚合函数十分实用。
例,统计每个班的人数:

SELECT student_class,COUNT(ALL student_name) AS 总人数 FROM t_student GROUP BY (student_class);

AS为定义别名,别名的使用在组合及联接查询时会有很好的效果,之后再说。

这里写图片描述

分组中也可以加入筛选条件WHERE,不过这里一定要注意的是,执行顺序为:WHERE过滤→分组→聚合函数。牢记!

统计每个班上20岁以上的学生人数:

SELECT student_class,COUNT(student_name) AS 总人数 FROM t_student WHERE student_age >20 GROUP BY (student_class);

这里写图片描述


三、having过滤条件

之前说了分组操作、聚合函数、WHERE过滤的执行顺序,那如果我们希望在聚合之后执行过滤条件怎么办?

例,我们想查询平均年龄在20岁以上的班级

能用下面的语句吗?

SELECT student_class, AVG(student_age) FROM t_student WHERE AVG(student_age)>20 GROUP BY student_class;

结果会出错。正因为聚合函数在WHERE之后执行,所以这里在WHERE判断条件里加入聚合函数是做不到的。

这里使用HAIVING即可完成:

SELECT student_class,AVG(student_age) AS 平均年龄 FROM t_student GROUP BY (student_class) HAVING AVG(student_age)>20; 

这里写图片描述

这里再啰嗦一句

SQL的执行顺序:

  • 第一步:执行FROM
  • 第二步:WHERE条件过滤
  • 第三步:GROUP BY分组
  • 第四步:执行SELECT投影列
  • 第五步:HAVING条件过滤
  • 第六步:执行ORDER BY 排序

四、子查询:

为什么要子查询?
现有一数据表如下:
这里写图片描述

根据之前的知识我们可以查出每门科目的最高分,但是要想查出取得最高分的学生信息就做不到了。这时就需要用到子查询来取得完整的信息。

什么是子查询?子查询就是嵌套在主查询中的查询。
子查询可以嵌套在主查询中所有位置,包括SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY。
但并不是每个位置嵌套子查询都是有意义并实用的,这里对几种有实际意义的子查询进行说明。
现有表两张:一张学生表、一张班表。id相关联

这里写图片描述
这里写图片描述


1. 在SELECT中嵌套:

学生信息和班级名称位于不同的表中,要在同一张表中查出学生的学号、姓名、班级名称:

SELECT s.student_id,s.student_name,(SELECT class_name FROM t_class c WHERE c.class_id=s.class_id) FROM t_student s GROUP BY s.student_id;         

首先这条SQL语句用到了别名,写法为在FORM的表名后加上某个字符比如FROM t_student s,这样在之后调用t_student的某一列时就可以用s.student_id来强调此列来源于对应别名的那张表。

别名在子查询及联接查询中的应用有着很好效果,当两张表有相同列名或者为了加强可读性,给表加上不同的别名,就能很好的区分哪些列属于哪张表。

还有种情况就是在子查询或联接查询时,主查询及子查询均为对同一张表进行操作,为主、子查询中的表加上不同的别名能够很好的区分哪些列的操作是在主查询中进行的,哪些列的操作是在子查询中进行的,下文会有实例说明。

接下来回到上面的SQL语句中,可以看出本条子查询的嵌套是在SELECT位置(括号括起来的部分),它与学号、学生姓名以逗号分隔开并列在SELECT位置,也就是说它是我们想要查出的一列,
子查询中查出的是,班级表中的班级id与学生表中的班级id相同的行,注意 WHERE c.class_id=s.class_id 这里就是别名用法的一个很好的体现,区分开了两张表中同样列名的列。
结果
这里写图片描述
最后的GROUP BY可以理解为对重复行的去重,如果不加:
这里写图片描述


2. 在WHERE中嵌套:

现要查出C语言成绩最高的学生的信息:

SELECT * FROM t_student WHERE student_subject='C语言' AND student_score>=ALL (SELECT student_score FROM t_student WHERE student_subject='C语言') ;

结果:

这里写图片描述

这里出现了一个ALL,其为子查询运算符

分类:

  • ALL运算符
      和子查询的结果逐一比较,必须全部满足时表达式的值才为真。
  • ANY运算符
      和子查询的结果逐一比较,其中一条记录满足条件则表达式的值就为真。
  • EXISTS/NOT EXISTS运算符
      EXISTS判断子查询是否存在数据,如果存在则表达式为真,反之为假。NOT EXISTS相反。
      

在子查询或相关查询中,要求出某个列的最大值,通常都是用ALL来比较,大意为比其他行都要大的值即为最大值。

要查出C语言成绩比李四高的学生的信息:

SELECT * FROM t_student WHERE student_subject='C语言' AND student_score >(SELECT student_score FROM t_student WHERE student_name='李四' AND student_subject='C语言'); 

这里写图片描述

通过上面两例,应该可以明白子查询在WHERE中嵌套的作用。通过子查询中返回的列值来作为比较对象,在WHERE中运用不同的比较运算符来对其进行比较,从而得到结果。

现在我们回到最开始的问题,怎么查出每门课最高成绩的学生的信息:

SELECT * FROM t_student s1 WHERE s1.student_score >= ALL(SELECT s2.student_score FROM t_student s2 WHERE s1.`student_subject`=s2.student_subject);

这里就是上文提到的别名的第二种用法,主、子查询对同一张表操作,区分开位于内外表中相同的列名。

结果:

这里写图片描述


3. 子查询的分类:
  • 相关子查询

      执行依赖于外部查询的数据。
      外部查询返回一行,子查询就执行一次。

  • 非相关子查询

      独立于外部查询的子查询。
      子查询总共执行一次,执行完毕后后将值传递给外部查询。

上文提到的例子中,第一个例子求学生对应班级名的即为相关子查询,其中WHERE c.class_id=s.class_id 即为相关条件。其他的例子均只对一张表进行操作,为非相关子查询。

需要注意的是相关子查询主查询执行一回,子查询就执行一回,十分耗费时间,尤其是当数据多的时候。


五、组合查询:

通过UNION运算符来将两张表纵向联接,基本方式为:

SELECT 列1 , 列2 FROM 表1
UNION
SELECT 列3 , 列4 FROM 表2;

UNION ALL为保留重复行:

SELECT 列1 , 列2 FROM 表1
UNION ALL
SELECT 列3 , 列4 FROM 表2;

组合查询并不是太实用,所以这里只是简单提一下,不举出例子了。

SQL中子查询和group by查询 1、SQL中的子查询:在做sql题时,我们最怕遇到条件复杂的查询语句,因为大多时候需要两三个子查询来实现,而大多数同学,可以说都比较怕子查询的,以前我也被这些题目弄的云里雾里的,不过做多了这类的题目后发现,其实也有一定规律,我们可以总结一套适合自己的方法来处理,下面时我对该类题目的处理方法:有购物表如下:题目: 查询购物商品类型不只一种的购物者的信息。 我 阅读详情

相关推荐

深入理解SQL注入中的union select 1,2,3....

UNION 用于合并两个查询的结果集

渗透之路,攻防之间皆学问 2万+

子查询2

1、子查询:为什么要子查询? 现有一数据表如下: 根据之前的知识我们可以查出每门科目的最高分,但是要想查出取得最高分的学生信息就做不到了。这时就需要用到子查询来取得完整的信息。 什么是子查询?子查询就是嵌套在主查询中的查询。 子查询可以嵌套在主查询中所有位置,包括SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY。 但并不是每个位置嵌套子查询都是有...

weixin_34148340的博客 325

使用 SQL UNION 操作符将多条 SELECT 语句组合成一个结果集

SQL UNION 操作符用于合并两个或多个 SELECT 语句的结果集,并将它们组合成一个单一的结果集。每个 SELECT 语句的列数和列类型必须匹配。使用 UNION 操作符可以在一个查询中检索多个表或视图的数据,并将其作为一个整体进行处理。在本文中,我们将详细介绍如何使用 SQL UNION 操作符将多条 SELECT 语句组合成一个结果集。

GmwClass的博客 1315

SQL Union用法总结

UNION 运算符将多个 SELECT 语句的结果组合成一个结果集。 (1)使用 UNION 须满足以下条件: A:所有查询中必须具有相同的结构(即查询中的的列数和列的顺序必须相同)。 B:对应列的数据类型可以不同但是必须兼容(所谓的兼容是指两种类型之间可以进行隐式转换,不能进行隐式转换则报错)。也可以用显式转换为相同的数据类型。 (当数据类型不同时,则根据数据类型优先级规则确定所产生的数

9675

手把手拆解:储能电站如何实现‘孤岛运行’与‘黑启动’?从SVPWM控制到无缝并网

本文深入解析储能电站的孤岛运行与黑启动技术,从SVPWM控制策略到电网重构实战。通过详细的三环控制架构和黑启动五阶段技术路线,展示储能电站在电网故障时如何快速切换为独立电压源并实现电网重建。文章还探讨了虚拟惯量补偿、多站协同控制等前沿技术,为电力系统应急恢复提供关键解决方案。

weixin_30509393的博客 306

进程间通信的七种方法实战演示!值得收藏!

线程和进程间的通讯(Inter-Process Communication, IPC)是操作系统中的一个重要概念,用于实现不同进程或同一进程中的不同线程之间的数据交换和协调。以下是几个常见的进程间通信的方式:管道、消息队列、共享内存、信号、套接字、信号量、文件映射

十年饮冰,难凉热血,保持热爱,奔赴星海! 2816

SQL语句聚合函数、分组、子查询及组合查询

聚合函数: SQL中提供的聚合函数可以用来统计、求和、求最值等等。 分类: –COUNT:统计行数量 –SUM:获取单个列的合计值 –AVG:计算某个列的平均值 –MAX:计算列的最大值 –MIN:计算列的最小值 首先,创建数据表如下: 执行列、行计数(count): 标准格式 SELECT COUNT(计数规范>) FROM

LiMing_0820的博客 7613

CVAT自动标注避坑指南:如何解决Nuclio工程创建失败和镜像拉取问题

本文是一份针对CVAT自动标注部署中常见问题的实战排障指南。文章深入剖析了Nuclio工程创建失败的根源,提供了网络配置、服务状态检查等系统性解决方案,并详细讲解了如何解决gcr.io等海外镜像拉取难题,帮助开发者顺利完成CVAT自动标注环境的搭建与部署。

weixin_29207533的博客 234

SQL语句汇总(三)——聚合函数、分组、子查询及组合查询

拖了一个星期,终于开始写第三篇了。走起! 聚合函数: SQL中提供的聚合函数可以用来统计、求和、求最值等等。 分类: –COUNT:统计行数量 –SUM:获取单个列的合计值 –AVG:计算某个列的平均值 –MAX:计算列的最大值 –MIN:计算列的最小值 首先,创建数据表如下: 执行列、行计数(count): 标准格式 SELECT CO...

weixin_30571465的博客 6759

封包(一)(雷电模拟器+ProxyDroid+查尔斯3.93+WPE)

自从换了工作就没有给大家分享一些干活,在加上陪伴自己的孩子没有时间更新文章了,这只能在晚上给大家写文档了,我最近在游戏公司上班,研究封包。我把这些东西都做成了笔记,我想有些东西是大家都想弄明白d ...

寒梅独自开 1万+

小龙虾 OpenClaw 安装全攻略:本地部署 AI 智能体一步到位

OpenClaw(昵称小龙虾)是一款 MIT 开源协议的本地优先 AI 智能体执行网关,支持多平台接入、本地部署,能实现自然语言驱动的设备自动化操作,区别于纯对话 AI,可直接操控系统执行实际任务,数据全程本地存储更安全。本文带来 2026 最新版 OpenClaw 安装教程,适配 Windows/macOS/Linux 全系统,新手也能一键搞定。

lujiawei00的专栏 1976

SQL语句汇总(三)——聚合函数、分组、子查询及组合查询

聚合函数: SQL中提供的聚合函数可以用来统计、求和、求最值等等。 分类: –COUNT:统计行数量 –SUM:获取单个列的合计值 –AVG:计算某个列的平均值 –MAX:计算列的最大值 –MIN:计算列的最小值 首先,创建数据表如下: 执行列、行计数(count): 标准格式 SELECT COUNT(<计数规范>) FROM &l...

weixin_30741653的博客 1127

SpyGlass CDC实战:如何用sgdc约束文件解决跨时钟域报错(附常见错误排查)

本文详细介绍了如何使用SpyGlass CDC工具链中的sgdc约束文件解决跨时钟域(CDC)报错问题。从基础约束文件架构到复杂场景调试,涵盖了时钟域定义、复位信号约束、Waiver策略等关键技巧,并附有常见错误排查方法,帮助工程师高效处理CDC验证挑战。

loss4bartender的博客 1148

SQL语句汇总(三)——聚合函数、分组、子查询及组合查询 - Darly

–COUNT:统计行数量 –SUM:获取单个列的合计值 –AVG:计算某个列的平均值 –MAX:计算列的最大值 –MIN:计算列的最小值 首先,创建数据表如下: 执行列、行计数(count): 标准格式 SELECT COUNT(<计数规范>) FROM <表名> 其中,计数规范包括: - * :计数所有选择的行,包括NULL值; - A...

weixin_34356138的博客 105

【STK】手把手教你利用STK进行导弹和反导仿真04 - STK/MMT模块03 导弹飞行工具应用案例

飞行设置的工具栏就在附加窗口的中间,首先点击左边的General,修改这个项目的名字。然后在下拉的System中选择导弹的类型,这里我们选择远程。(4)输出数据文件到STK,任务窗口里选择Export Manager项,飞行数据输出到STK。项目可以命名为Test;(1)首先建立新项目,点击Flight菜单中的New Flight选项,见下图。首先看世界地图中间的红圈,是一个导弹形状的图标,这个图标表示的是导弹的发射点。选择下面的Export Manager,依次勾选红框的选项。我们拖动这个导弹的图标,

weixin_44184852的博客 1631

Aduino 通过I2C接口读取MPU6050模块数据

Aduino ESP9266通过I2C接口读取MPU6050模块数据 MPU6050模块 原理图 所需库:Adafruit_MPU6050 Adafruit_BusIO Adafruit Unified Sensor 接线示意图 ESP8266---MPU6050 VCC -- 3.3v GND -- GND D2 -- SDA D1 -- SCL 示例程序代码 #include <Adafruit_MPU6050.h> #include <Adafruit

perseverance51博客 621

mysql实验6语言结构_实验六 SQL语言数据查询语言DQL.pdf

实验六 SQL语言数据查询语言DQL实验六 SQL 语言数据查询语言DQL一、实验目的数据查询语言指对数据库中的数据查询、统计、分组、排序等操作。查询语句可以分为简单查询、连接查询、嵌套查询和组合查询等。本次实验了解SQL 语言的SELECT 语句对数据的查询,学会在Navicat forMySQL 中用SELECT 语句对表中的数据进行简单查询、连接查询、嵌套查询和组合查询。二、实验要求1、实验...

weixin_42371574的博客 897

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【LeetCode】【SQL】简单类别合集

题目来源:LeetCode For English ||力扣中文版 题目类别:数据库 题目难度:简单 题目范围:免会员版所有题目 目录 175.组合两个表 176.第二高的薪水 181.超过经理收入的员工 182.查找重复的电子邮箱 183.从不订购的客户 196.删除重复的电子邮箱 197.上升的温度 595.大的国家 596.超过5名学生的课 620.有趣的电影 627.交换工资 1179.重新格式化部门表 175.组合两个表 SELECT F...

Eamon 1005

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: Linux服务器上同时部署多个Tomcat方法介绍
下一篇: Java面试题整理
刘五分
博客等级 码龄10年 15粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值