news 2026/7/21 8:04:11

SQL 进阶查询与聚合函数 +SQL 多表查询(内连接、左外连接、右外连接)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SQL 进阶查询与聚合函数 +SQL 多表查询(内连接、左外连接、右外连接)

核心考点:字符串拼接、空值判断、常量列、分页查询、排序、模糊查询、聚合函数(Count/Sum/Avg/Max/Min)、类型转换函数

适配表结构:Stu(Name, Address, C#, DB),其中C#、DB为成绩字段

一、加号(+)的双重用法(易错点)

加号在SQL中功能由操作数类型决定,区分数值运算和字符串拼接

--场景1:字符串拼接(操作数为字符类型) --将姓名和地址拼接为一列展示 select 姓名和地址=Name+'['+Address+']' from Stu where C#>60 --场景2:数值求和(操作数为数字类型) --计算C#和DB两科成绩之和 select 总和 = C# + DB from Stu where C# >60

注意:若其中一个操作数为字符串、另一个为数字,会触发隐式转换,转换失败则报错。

二、空值判断(IS NULL / IS NOT NULL)

空值(NULL)不能用=、!=判断,必须用IS NULL或IS NOTNULL

--先插入一条C#成绩为空的数据 insert into Stu (Name,Address) values ('李白','鸡儿你几时') --查询C#成绩为空的学生 select * from Stu where C# is NULL --拓展:查询C#成绩不为空的学生 --select * from Stu where C# is NOT NULL

三、常量列(无中生有新增列)

查询时自定义固定值列,仅用于展示,不修改数据库真实表结构

--新增“学校”列,所有行该列值均为“州市” select Name,Address,学校='州市' from Stu

四、分页查询(TOP关键字)

TOP用于限制查询结果行数,支持固定行数和百分比,是分页查询基础

--场景1:查询前2条数据 select top 2 Name,Address from Stu --场景2:查询前50%的数据(按总行数比例截取) select top 50 percent Name,Address from Stu

五、查询结果运算(成绩加分处理)

查询时对数值字段进行算术运算,不修改数据库原始数据

--将C#成绩在查询结果中加5分,重命名列名为C# select Name,(C#+5) as C#,DB from Stu

六、排序查询(ORDER BY)

对查询结果按指定列排序,默认递增(ASC),可指定多列排序

6.1 单列递增排序(ASC,可省略)

--按C#成绩(加分后)从小到大排序 select Name,(C# +5) as C#,DB from Stu order by C# ASC

6.2 单列递减排序(DESC)

--按C#成绩(加分后)从大到小排序 select Name,(C# +5) as C#,DB from Stu order by C# DESC

6.3 多列排序(优先级递减)

先按第一列排序,若第一列值相等,再按第二列排序

--先按C#成绩递减,C#成绩相等时按DB成绩递减 select Name,(C# +5) as C#,DB from Stu order by C# DESC,DB DESC

七、基础筛选查询(复习巩固)

7.1 模糊查询(LIKE)

匹配包含指定字符的结果,%代表任意多个字符

--查询姓名以“李”开头的学生 select * from Stu where Name like '李%'

7.2 范围查询(BETWEEN...AND...)

闭区间查询,包含左右边界值,适用于数值、日期类型

--查询C#成绩在30到50之间的学生 select * from Stu where C# between 30 and 50

7.3 固定集合查询(IN)

匹配指定集合内的任意值,替代多个OR条件

--查询姓名为“李四”或“李白”的学生 select * from Stu where Name in ('李四','李白')

八、聚合函数(内置函数,核心考点)

聚合函数用于对一组数据进行统计计算,返回单个结果值,常结合分组使用

8.1 统计个数(COUNT)

COUNT(字段):统计该字段非空值的个数;COUNT(*):统计总行数(包含空值行)

--统计Name字段非空的学生个数 select Count (Name) as 个数 from Stu --统计学生总人数(包含成绩为空的行) select 总人数=count(*) from Stu

8.2 求和(SUM)

仅适用于数值类型,计算指定字段的总和

--计算C#、DB两科的总成绩 select Sum (C#) as C#总成绩,Sum(DB) as DB总成绩 from Stu --计算每个学生的两科总成绩(行级求和,非聚合) select 一个人总成绩 = DB+ C# from Stu

8.3 平均值(AVG)

计算数值字段的平均值,自动忽略NULL值

--方式1:手动计算C#平均成绩(总和/总人数) select c#平均成绩 = Sum(C#) /count(*) from Stu --方式2:使用AVG函数(推荐,自动忽略空值) select AVG(C#) as c#平均成绩 from Stu --计算DB平均成绩(手动计算,按Name非空行数统计) select DB平均成绩 = Sum(DB) /count(Name) from Stu

8.4 最大值(MAX)与最小值(MIN)

获取数值字段的最大值和最小值,同样适用于日期、字符类型(按ASCII码排序)

--查询C#成绩的最大值 select Max(C#)from Stu --查询C#成绩的最小值 select Min(C#)from Stu

九、常用类型转换函数

用于不同数据类型之间的转换,避免运算或拼接时出现类型错误

9.1 字符串长度(LEN)

九、常用类型转换函数 用于不同数据类型之间的转换,避免运算或拼接时出现类型错误 9.1 字符串长度(LEN)

9.2 数字转字符串(STR)

STR(数字, 总长度, 小数位数):将数字转为指定长度和小数位数的字符串

--将数字1231233转为总长度11、保留3位小数的字符串 select STR (1231233,11,3)

9.3 类型转换(CAST)

CAST(表达式 AS 目标类型):通用类型转换函数,适用范围更广

--将数字123转为长度为3的nvarchar类型字符串 select CAST(123 as nvarchar(3))

十、核心考点汇总(背诵)

  1. 加号(+):字符类型拼接,数值类型求和,不可混用类型。

  2. 空值判断:必须用IS NULL/IS NOT NULL,禁止用=、!=。

  3. 排序:ORDER BY 列名 ASC/DESC,多列排序按优先级执行。

  4. 聚合函数:Count(统计个数)、Sum(求和)、Avg(平均值)、Max(最大值)、Min(最小值)。

  5. 分页:TOP 固定行数 / TOP 百分比 percent。

  6. 类型转换:LEN(长度)、STR(数字转字符串)、CAST(通用转换)。

十一、易错踩坑点

  • 聚合函数会自动忽略NULL值,手动计算平均值时需注意空值影响。

  • TOP百分比是按查询结果总行数的比例截取,非原表总行数。

  • 多列排序时,列的顺序决定优先级,先写的列优先级更高。

  • 类型转换时,目标类型长度不足会导致数据截断(如CAST(1234 as nvarchar(3))结果为123)。

SQL 多表查询(内连接、左外连接、右外连接)

核心考点:内连接(INNER JOIN)、左外连接(LEFT OUTER JOIN)、右外连接(RIGHT OUTER JOIN)、多表关联条件、表别名使用、连接条件与筛选条件区别

适配表结构:Students(StudentId, Name, Sex, ClassId)、ScoreList(StudentId, Score)、Class(ClassId, ClassName)

一、多表查询基础概念

多表查询通过关联字段(通常是主键与外键)将多张表的数据关联起来,实现一次性查询多张表的相关信息,核心是明确表之间的关联关系和连接类型。

注意:多张表存在同名字段时,需通过「表名.字段名」区分,避免字段歧义。

二、内连接(INNER JOIN)—— 交集查询

2.1 核心定义

内连接用于查询多张表中满足关联条件的公共数据,相当于数学中的“交集”,仅返回两张表中同时存在、匹配关联条件的记录。

2.2 基础内连接(两张表)

--查询成绩大于90分的学生信息(关联学生表与成绩表) --Students.StudentId:通过表名区分同名字段 --INNER JOIN ... ON:内连接语法,ON后跟关联条件 select Students.StudentId,Name,Sex,Score from Students inner join ScoreList on Students.StudentId = ScoreList.StudentId where Score>90

2.3 内连接表顺序交换(效果不变)

内连接不区分表的先后顺序,交换两张表的位置,查询结果完全一致。

--交换学生表与成绩表的顺序,结果相同 select Students.StudentId,Name,Sex,Score from ScoreList inner join Students on Students.StudentId = ScoreList.StudentId where Score>90

2.4 多表内连接(三张表)

依次关联多张表,每关联一张表就添加一个INNER JOIN和对应的关联条件,逐步拓展查询范围

--查询成绩大于90分的学生信息及对应班级名称(关联学生表、成绩表、班级表) select Students.StudentId,Name,Sex,Score,ClassName from ScoreList inner join Students on Students.StudentId = ScoreList.StudentId --学生表与成绩表关联 inner join Class on Class.ClassId= Students.ClassId --学生表与班级表关联 where Score>90

三、左外连接(LEFT OUTER JOIN)—— 左表基准查询

3.1 核心定义

左表为基准,先查询左表中满足筛选条件的所有记录;若左表中的某条记录在右表中找不到匹配的关联记录,右表对应的字段值自动填充为NULL。

语法:左表 LEFT OUTER JOIN 右表 ON 关联条件(OUTER可省略,简写为LEFT JOIN)。

3.2 基础左外连接

--查询所有男生的学生信息及成绩(无成绩则成绩为NULL) --左表:Students(学生表),右表:ScoreList(成绩表) select Students.StudentId,Name,Sex,Score from Students left outer join ScoreList on Students.StudentId = ScoreList.StudentId where Sex = '男'

3.3 左外连接表顺序交换(结果改变)

左外连接区分表的先后顺序,交换左表和右表后,基准表改变,查询结果也会发生变化。

--交换后,左表变为ScoreList(成绩表),仅返回有成绩的男生记录(无成绩的男生不会显示) select Students.StudentId,Name,Sex,Score from ScoreList left outer join Students on Students.StudentId = ScoreList.StudentId where Sex = '男'

四、右外连接(RIGHT OUTER JOIN)—— 右表基准查询

4.1 核心定义

右表为基准,先查询右表中的所有记录;若右表中的某条记录在左表中找不到匹配的关联记录,左表对应的字段值自动填充为NULL。

语法:左表 RIGHT OUTER JOIN 右表 ON 关联条件(OUTER可省略,简写为RIGHT JOIN)。

4.2 基础右外连接

--查询所有班级及对应学生信息(无学生的班级,学生字段为NULL) --左表:Students(学生表),右表:Class(班级表) select Students.StudentId,Name,Sex,ClassName from Students right outer join Class on Students.ClassId = class.ClassId

五、三种连接方式核心区别(必背)

连接类型

查询基准

返回结果

无匹配记录处理

内连接(INNER JOIN)

无基准,双向匹配

两张表的公共数据(交集)

无匹配则不返回该记录

左外连接(LEFT JOIN)

左表

左表所有满足筛选条件的记录 + 右表匹配记录

右表字段填充为NULL

右外连接(RIGHT JOIN)

右表

右表所有记录 + 左表匹配记录

左表字段填充为NULL

六、多表查询易错考点

  1. 关联条件写在ON后,筛选条件写在WHERE后,不可混淆;若筛选条件写在ON后,会影响连接结果。

  2. 多张表存在同名字段(如StudentId、ClassId),必须通过「表名.字段名」明确区分,否则报错。

  3. 内连接不区分表顺序,外连接(左/右)严格区分表顺序,基准表不同结果不同。

  4. 外连接中,OUTER关键字可省略,简写为LEFT JOIN、RIGHT JOIN,不影响功能。

  5. 多表连接时,关联条件需一一对应(如学生表ClassId关联班级表ClassId),避免关联错误导致结果异常。

七、语法速记模板

--内连接 select 表1.字段1,表2.字段2 from 表1 inner join 表2 on 表1.关联字段 = 表2.关联字段 where 筛选条件 --左外连接 select 表1.字段1,表2.字段2 from 表1 left join 表2 on 表1.关联字段 = 表2.关联字段 where 筛选条件 --右外连接 select 表1.字段1,表2.字段2 from 表1 right join 表2 on 表1.关联字段 = 表2.关联字段 where 筛选条件 --多表连接 select 表1.字段1,表2.字段2,表3.字段3 from 表1 inner join 表2 on 表1.关联字段 = 表2.关联字段 inner join 表3 on 表2.关联字段2 = 表3.关联字段2 where 筛选条件
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/21 8:02:10

Java 19新特性解析与企业级版本选择策略

1. Java版本演进与市场现状分析Java作为全球使用最广泛的编程语言之一,其版本迭代一直备受开发者关注。2023年9月,Oracle正式发布了Java 19,带来了7个重要特性更新。然而有趣的是,根据最新的开发者调查报告显示,生产环…

作者头像 李华
网站建设 2026/7/21 8:01:30

SVG转PDF技术方案与性能优化实践

1. SVG转PDF的核心需求与应用场景 矢量图形格式SVG(Scalable Vector Graphics)因其无损缩放特性在Web设计、工程制图等领域广泛应用。但遇到文档归档、打印输出等场景时,PDF(Portable Document Format)因其跨平台一致性…

作者头像 李华
网站建设 2026/7/21 8:00:05

FastJson反序列化漏洞解析与防御实践

1. 事件背景:FastJson的安全隐患浮出水面那天下午三点,我正在处理一个普通的业务需求变更,突然收到监控系统发来的连续告警。起初以为是常规的性能波动,但当我看到"反序列化异常"这个关键词时,后背瞬间冒出了…

作者头像 李华
网站建设 2026/7/21 7:59:28

AI在软件开发中的角色演进:从代码生成到流程管理

1. 项目概述:AI在软件开发中的角色演进 十年前我第一次接触AI辅助编程时,还只是个简单的代码补全工具。如今在GitHub Copilot等工具的日常使用中,我逐渐意识到AI正在从"代码生成器"进化为"流程管理者"。这种转变不仅改变…

作者头像 李华
网站建设 2026/7/21 7:56:12

Vue+SpringBoot健身房管理系统实战:从环境搭建到核心业务开发

如果你是一名Java或前端开发者,正在寻找一个能真正跑起来、功能完整、且能写进简历的实战项目,那么这篇文章就是为你准备的。市面上很多“管理系统”源码要么过于简单(增删改查套个壳),要么过于复杂(微服务…

作者头像 李华