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

发布时间:2026/7/21 8:04:16
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# ASC6.2 单列递减排序DESC--按C#成绩加分后从大到小排序 select Name,(C# 5) as C#,DB from Stu order by C# DESC6.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 507.3 固定集合查询IN匹配指定集合内的任意值替代多个OR条件--查询姓名为“李四”或“李白”的学生 select * from Stu where Name in (李四,李白)八、聚合函数内置函数核心考点聚合函数用于对一组数据进行统计计算返回单个结果值常结合分组使用8.1 统计个数COUNTCOUNT(字段)统计该字段非空值的个数COUNT(*)统计总行数包含空值行--统计Name字段非空的学生个数 select Count (Name) as 个数 from Stu --统计学生总人数包含成绩为空的行 select 总人数count(*) from Stu8.2 求和SUM仅适用于数值类型计算指定字段的总和--计算C#、DB两科的总成绩 select Sum (C#) as C#总成绩,Sum(DB) as DB总成绩 from Stu --计算每个学生的两科总成绩行级求和非聚合 select 一个人总成绩 DB C# from Stu8.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 Stu8.4 最大值MAX与最小值MIN获取数值字段的最大值和最小值同样适用于日期、字符类型按ASCII码排序--查询C#成绩的最大值 select Max(C#)from Stu --查询C#成绩的最小值 select Min(C#)from Stu九、常用类型转换函数用于不同数据类型之间的转换避免运算或拼接时出现类型错误9.1 字符串长度LEN九、常用类型转换函数 用于不同数据类型之间的转换避免运算或拼接时出现类型错误 9.1 字符串长度LEN9.2 数字转字符串STRSTR(数字, 总长度, 小数位数)将数字转为指定长度和小数位数的字符串--将数字1231233转为总长度11、保留3位小数的字符串 select STR (1231233,11,3)9.3 类型转换CASTCAST(表达式 AS 目标类型)通用类型转换函数适用范围更广--将数字123转为长度为3的nvarchar类型字符串 select CAST(123 as nvarchar(3))十、核心考点汇总背诵加号字符类型拼接数值类型求和不可混用类型。空值判断必须用IS NULL/IS NOT NULL禁止用、!。排序ORDER BY 列名 ASC/DESC多列排序按优先级执行。聚合函数Count(统计个数)、Sum(求和)、Avg(平均值)、Max(最大值)、Min(最小值)。分页TOP 固定行数 / TOP 百分比 percent。类型转换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 Score902.3 内连接表顺序交换效果不变内连接不区分表的先后顺序交换两张表的位置查询结果完全一致。--交换学生表与成绩表的顺序结果相同 select Students.StudentId,Name,Sex,Score from ScoreList inner join Students on Students.StudentId ScoreList.StudentId where Score902.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 Score90三、左外连接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六、多表查询易错考点关联条件写在ON后筛选条件写在WHERE后不可混淆若筛选条件写在ON后会影响连接结果。多张表存在同名字段如StudentId、ClassId必须通过「表名.字段名」明确区分否则报错。内连接不区分表顺序外连接左/右严格区分表顺序基准表不同结果不同。外连接中OUTER关键字可省略简写为LEFT JOIN、RIGHT JOIN不影响功能。多表连接时关联条件需一一对应如学生表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 筛选条件