7.7 SQL Server连接查询
SQL Server 连接查询
简介
在关系数据库中,数据分布在多个逻辑表中。要获得完整的有意义的数据集,需要使用联接从这些表中查询数据。SQL Server支持多种联接,包括内部联接、左联接、右联接、完全外部联接和交叉联接。每个联接类型指定SQL Server如何使用一个表中的数据来选择另一个表的行。
先创建示例表进行演示。
创建示例表
首先,创建一个名为hr
的新schema(架构):
CREATE SCHEMA hr; GO
然后在hr
schema中创建两张表分别是candidates
(候选人)、employees
(员工):
CREATE TABLE hr.candidates( id INT PRIMARY KEY IDENTITY, fullname VARCHAR(100) NOT NULL ); CREATE TABLE hr.employees( id INT PRIMARY KEY IDENTITY, fullname VARCHAR(100) NOT NULL );
两张表分别插入几行数据:
INSERT INTO hr.candidates(fullname) VALUES ('John Doe'), ('Lily Bush'), ('Peter Drucker'), ('Jane Doe'); INSERT INTO hr.employees(fullname) VALUES ('John Doe'), ('Jane Doe'), ('Michael Scott'), ('Jack Sparrow');
我们将候选人表称为左表,将员工表称为右表。
SQL Server内连接
内联接生成一个数据集,其中包括左表中的行,与右表中相匹配的行
下面示例连接candidates
和employees
表,通过条件candidates.fullname
=employees.fullname
也就是从candidates
表中获取行,这些行的fullname
与employees
表的fullname
列具有相同值的相应行:
SELECT c.id candidate_id, c.fullname candidate_name, e.id employee_id, e.fullname employee_name FROM hr.candidates c INNER JOIN hr.employees e ON e.fullname = c.fullname;
下面的Venn图说明了两个结果集的内部联接的结果:
SQL Server左联接
左联接选择数据从左表开始,并在右表中匹配行。左联接返回左表中的所有行和右表中的匹配行。如果左表中的一行与右表中的行不匹配,则右表的列将为空。
左联(Left Join)接也称为左外联接(Left Outer Join)。Outer
关键字可省略。
下面的语句使用左联接将候选人表与员工表联接起来:
SELECT c.id candidate_id, c.fullname candidate_name, e.id employee_id, e.fullname employee_name FROM hr.candidates c LEFT JOIN hr.employees e ON e.fullname = c.fullname;
下面的Venn图说明了两个结果集左连接的结果:
要获取仅在左表中可用但在右表中不可用的行(即左表中与右表没匹配上的行),可以在上面的查询中添加WHERE
子句:
SELECT c.id candidate_id, c.fullname candidate_name, e.id employee_id, e.fullname employee_name FROM hr.candidates c LEFT JOIN hr.employees e ON e.fullname = c.fullname WHERE e.id IS NULL;
下面的Venn图说明了左联接的结果,该联接选择仅在左表中可用的行:
SQL Server右连接
右联接或右外联接选择从右表开始的数据。它是左联接的反向版本。
右联接返回一个结果集,其中包含右表中的所有行和左表中的匹配行。如果右表中的行在左表中没有匹配的行,则左表中的所有列都将为Null。
使用右联接查询候选人表与员工表:
SELECT c.id candidate_id, c.fullname candidate_name, e.id employee_id, e.fullname employee_name FROM hr.candidates c RIGHT JOIN hr.employees e ON e.fullname = c.fullname;
注意,右表(employees)中的所有行都包含在结果集中。
Venn图说明了两个结果集的右连接:
类似地,通过向上述查询添加WHERE子句,可以获得仅在右表中可用的行(右表中与左表没匹配上的行),如下所示:
SELECT c.id candidate_id, c.fullname candidate_name, e.id employee_id, e.fullname employee_name FROM hr.candidates c RIGHT JOIN hr.employees e ON e.fullname = c.fullname WHERE c.id IS NULL;
Venn图:
SQL Server全联接
全外联接或全联接返回一个结果集,该结果集包含左表和右表中的所有行,以及两侧的匹配行(如果可用)。如果不匹配,则缺少的一侧将为空值。
在候选人表和员工表之间做全联接查询:
SELECT c.id candidate_id, c.fullname candidate_name, e.id employee_id, e.fullname employee_name FROM hr.candidates c FULL JOIN hr.employees e ON e.fullname = c.fullname;
全(外)联接的Venn图:
要选择左表或右表中存在的行,可以通过添加WHERE子句排除两个表共有的行,如以下查询所示:
SELECT c.id candidate_id, c.fullname candidate_name, e.id employee_id, e.fullname employee_name FROM hr.candidates c FULL JOIN hr.employees e ON e.fullname = c.fullname WHERE c.id IS NULL OR e.id IS NULL;
Venn图:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek “源神”启动!「GitHub 热点速览」
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器