SQL JOIN 用于组合多个表并根据关系数据库中的公共字段检索数据。
我们可以使用规范化来确保和提高数据的完整性。 在各种规范化形式中,数据被分布到多个逻辑表中。 这些表使用引用约束(主键和外键)来强制 SQL Server 表中的数据完整性。
SQL连接通过组合多个关系表来生成一个数据集。 这些表使用键关联,具有一对一或一对多的关系。 要想得到正确的数据,必须了解数据要求和连接机制。
SQL Server 支持多个连接,并且每种方法都有特定的方式从多个表中检索数据。 下图指定了支持的 SQL Server 连接。
SQL连接
SQL内连接产生一个满足连接条件的数据集,其中包括来自左表的行,来自右表的匹配行。
SQL内连接
例子
select employee.emp_id, employee.first_name, branch.branch_name
from employee
inner join branch
on employee.emp_id = branch.mgr_id
SQL内连接示例
在SQL自连接中,SQL Server 将表与自身连接。 这意味着同一个表的名字在 from 子句中出现了两次。
SQL自连接
例子
select e.emp_id, e.first_name, m.first_name, m.emp_id
from employee e
inner join employee m
on m.emp_id = e.super_id
SQL自连接示例
交叉连接连接两个或多个不相关的表。
CROSS JOIN 将第一个表 (T1) 中的每一行与第二个表 (T2) 中的每一行连接起来。
换句话说,交叉连接返回两个表中行的笛卡尔积。
交叉连接
例子
select employee.emp_id, employee.first_name, branch.branch_name
from employee
cross join branch
交叉连接示例
如果第一个表有 x 行,第二个表有 n 行,则交叉连接在输出中给出 x*n 行。
所以应该避免在较大的表上进行交叉连接,因为它可能会返回大量数据,这样的话数据库需要大量的计算能力(CPU、内存和 IO)来处理。
SQL外连接时,不仅会列出匹配的行,还会返回其他表中不匹配的行。 不匹配的行取决于 关键字 left、right 或 full 。
SQL左外连接返回两个表的匹配行以及左表中不匹配的行。 如果左表中的记录在右表中没有任何匹配的行,则显示具有 NULL 值的记录。
左外连接
例子
select employee.emp_id, employee.first_name, branch.branch_name
from employee
left join branch
on
employee.emp_id = branch.mgr_id
左外连接 示例
SQL右外连接返回两个表的匹配行以及右表中的不匹配行。 如果右表中的记录在左表中没有任何匹配的行,则显示具有 NULL 值的记录。
SQL右外连接
例子
select employee.emp_id, employee.first_name, branch.branch_name
from employee
right join branch
on
employee.emp_id = branch.mgr_id
SQL右外连接示例
完整外部联接在输出中返回以下行:
全外连接
例子
select employee.emp_id, employee.first_name, branch.branch_name
from employee
full join branch
on
employee.emp_id = branch.mgr_id
全外连接
假设我们在表列中有 NULL 值,并且我们在这些列上连接表。 SQL Server 是否匹配 NULL 值?
NULL 值彼此不匹配。 因此,SQL Server 无法返回匹配的行。