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图:
标签:name,hr,Server,7.7,SQL,fullname,联接,id From: https://www.cnblogs.com/michaelshen/p/17072016.html