SQL Server 子查询与表连接实战指南
掌握 SQL Server 的复杂数据检索需要深入理解子查询嵌套机制和多表连接(Join)原理。本文将系统梳理从独立标量/集合子查询到各种表连接模式的实战用法。
1. 子查询的核心概念与应用
子查询是指嵌套在其他 SQL 语句(如 SELECT、INSERT、UPDATE 或 DELETE)内部的查询语句。外部查询依赖于内部查询返回的结果集来进行进一步的数据筛选或处理。根据是否依赖外部查询的值,可分为独立子查询和相关子查询。
第1步:编写独立子查询
独立子查询在执行时不依赖外部查询的参数,可单独运行并返回结果供外部查询使用。主要包含以下两种常见形式:
- 独立单值(标量)子查询:内部查询只返回一个单一的值,通常配合等号(
=)使用。
Select testID,stuID,testBase,testBeyond,testPro
from Score
where stuID=(
select stuID from Student where stuName='Kencery'
)
- 独立多值子查询:内部查询可能返回多行记录,通常配合
IN操作符使用。
Select testID,stuID,testBase,testBeyond,testPro
from Score
where stuID in(
select stuID from Student where stuName='Kencery'
)
注意事项:编写子查询时务必使用圆括号包裹内部查询;必要时为表名指定别名以提升可读性,例如使用 AS alias_name 语法。
2. 表连接(Table Join)基础
表连接是将两个或多个表基于特定条件合并为一个结果集的过程。这与 UNION 不同,UNION 是纵向合并结构相同的表,而表连接通常是横向合并具有共享字段关系的表。
第2步:实现交叉连接(Cross Join)
交叉连接用于获取两张表的笛卡尔积,即第一张表中的每一行与第二张表中的每一行进行配对组合。
- 准备测试数据:创建两张包含数值类型的表并插入测试数据。
use Test
go
create table testNum1 (
Num1 int
);
create table testNum2 (
Num2 int
);
insert into testNum1 values(1),(2),(3)
insert into testNum2 values(4),(5)
- 执行交叉连接查询:
select * from testNum1 cross join testNum2
自交叉实现:若需要对同一张表进行自交叉配对,需对表进行两次取别名操作:
select t1.num1,t2.num2 from testNum1 as t1 cross join testNum2 as t2
警告:虽然可以使用逗号(,)代替 CROSS JOIN,但这种写法不仅过时,而且容易产生歧义。建议使用明确的 JOIN 声明,以便在语法错误时获得准确的报错反馈。
第3步:实施内连接(Inner Join)
内连接是在交叉连接的基础上增加约束条件,仅返回两表中满足连接条件的匹配记录。
语法格式:SELECT 列 FROM 表1 INNER JOIN 表2 ON 表1.字段 = 表2.字段
Select s1.stuID,s1.stuName,s1.stuSex,s2.testBase,s2.testBeyond
from Student as s1
inner join Score as s2
on s1.stuID=s2.stuID
where s1.stuIsDel=0;
第4步:配置外连接(Outer Join)
当需要保留某一张表中的所有记录,即使另一张表中没有对应的匹配数据时,需要使用外连接。外连接分为左外连接(LEFT JOIN)和右外连接(RIGHT JOIN)。
- 设置演示表结构:
create table tblMain (
ID int,name nvarchar(20),fid int
);
create table tblOther (
ID int,name nvarchar(20)
)
insert into tblMain values(1,'张三',1),(2,'李四',2)
insert into tblOther values(1,'C++'),(2,'.net'),(3,'java')
- 观察内连接的局限性:上述示例中,若使用 INNER JOIN,tblOther 表中对应 fid 为 3 的记录 'Java' 将不会出现在结果集中。
左连接 vs 右连接:区别在于主表的位置。 - 左外连接(LEFT JOIN):左侧表为主表,即使右表无匹配数据也会显示左表记录。 - 右外连接(RIGHT JOIN):右侧表为主表,同理。
- 实现保留所有数据的右连接:
select * from tblMain as t1
right join tblOther as t2
on t1.fid=t2.id
此时,'Java' 所在的一行将被成功显示,其中来自 tblMain 的字段将显示为 NULL。
总结
子查询和表连接是关系型数据库中高级检索的核心能力。正确区分独立子查询与相关子查询,并灵活运用 Cross Join、Inner Join、Left Join 和 Right Join,可以高效解决复杂的多维数据分析需求。
以上就是 SQL Server 子查询和表连接的详细内容,更多关于数据库查询优化的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









