核心考点:字符串拼接、空值判断、常量列、分页查询、排序、模糊查询、聚合函数(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 统计个数(COUNT)
COUNT(字段):统计该字段非空值的个数;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 字符串长度(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))十、核心考点汇总(背诵)
加号(+):字符类型拼接,数值类型求和,不可混用类型。
空值判断:必须用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 Score>902.3 内连接表顺序交换(效果不变)
内连接不区分表的先后顺序,交换两张表的位置,查询结果完全一致。
--交换学生表与成绩表的顺序,结果相同 select Students.StudentId,Name,Sex,Score from ScoreList inner join Students on Students.StudentId = ScoreList.StudentId where Score>902.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 |
六、多表查询易错考点
关联条件写在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 筛选条件