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运算符来将两张表纵向联接,基本方式为:

SELECT1 , 列2 FROM1
UNION
SELECT3 , 列4 FROM2;

UNION ALL为保留重复行:

SELECT1 , 列2 FROM1
UNION ALL
SELECT3 , 列4 FROM2;

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

用AI画电路板AI EDA初探Creating WiFi Radio with CELUS: A Step-by-Step Tutorial 使用CELU.IO创建WiFi收音机:分步教程 结论:整体还不太成熟,所选器件单元是欧美思维,器件选型成本和咱们华强北还是无法比。可以关注迭代,看客就当走马观花就行了;不过里面的单元模块还带有AI提问的这个比较好,值得国内EDA从业者学习。话不多说上正文:本教程目的是让我们深入了解如何使用CELUS设计平台构建WiFi收音机实战项目。本指南的重点是使用该平台来选择正确的解决方案,并整合一个项目,让您可以将音乐和节目从互联网直接传输到您自己构建的扬声器。 阅读详情

相关推荐

RU.EXE实用指南:从基础操作到高级调试技巧

本文是RU.EXE(RW Everything)的实用指南,详细介绍了这款硬件调试工具从基础操作到高级技巧的全过程。文章阐述了RU.EXE作为直接读写硬件寄存器、内存和PCI配置空间的强大工具,如何帮助硬件工程师和开发人员高效进行底层系统调试与故障排,并强调了安全操作的重要性。

weixin_29228203的博客 246

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

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

GmwClass的博客 1308

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

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

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

子查询2

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

weixin_34148340的博客 323

SQL Union用法总结

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

9672

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

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

LiMing_0820的博客 7609

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

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

weixin_30571465的博客 6756

sql注入中的union联合查询,union select 1,2,3

sql注入中的union联合查询,union select 1,2,3

m0_51756263的博客 1万+

sql注入之select/union select

select :select 1 from table、 select count(1) from table、select sum(1) from table union select:union语句使用条件、判断字段数 union select 1,2(或union select null,null)、 判断回显位置

@一只躺平的猪@的博客 3840

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

文章目录一、组合查询二、创建组合查询2.1 使用 UNION2.2 UNION 规则2.3 包含或取消重复的行2.4 对组合查询结果排序三、小结 本文介绍如何利用 SQL UNION 操作符将多条 SELECT 语句组合成一个结果集。使用 UNION 可极大地简化复杂的 WHERE 子句,简化从多个表中检索数据的工作。 一、组合查询 多数 SQL 查询只包含从一个或多个表中返回数据的单条 SELECT 语句。但是,SQL 也允许执行多个查询(多条 SELECT 语句),并将结果作为一个查询结果集返回。 这些

Vin_c° 的专栏 3522

10-51 查询学生表中大于19岁的女生

本题目要求编写SQL语句,检索出stu表中所有年龄大于19岁的女生的记录。注意:sex为1时表示 男生,sex为0时表示女生。计算年龄时以年计算,不考虑出生月份。提示:假定当前日期为‘2020-03-01'

THK的博客 2313

SQL语法(DQL):SELECT 多表查询之Join与Union

用于实现列的合并,结果中的列来自于多张表。实现两份数据集合操作【交集、差集、全集】

qq_45269163的博客 3216

STM32F103C8T6最小系统pcb原理图库3D封装库

STM32F103C8T6最小系统pcb原理图库3D封装库

上一篇: Linux服务器上同时部署多个Tomcat方法介绍
下一篇: Java面试题整理
刘五分
博客等级 码龄9年 15粉丝 11原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值