在关系数据库中,数据分布在多个逻辑表中。要获得完整有意义的数据集,需要使用连接来查询这些表中的数据。
SQL Server 支持多种连接,包括【内连接】,【左连接】,【右连接】,【全外连接】和【交叉连接】。
每种连接类型指定SQL Server如何使用一个表中的数据来选择另一个表中的行。
A.SQL Server内连接
内连接是SQL Server中最常用的连接之一。内部连接子句用于查询来自两个或多个相关表的数据。SQL server INNER JOIN 子句的语法:
在此语法中,从T1和T2表中查询检索数据: 0
●首先,在FROM子句中指定主表(T1)
●其次,在INNER JOIN子句中和连接维词中指定第二个表(T2)。只有连接谓词计算为TRUE的行才包括在结果集中。
INNER JOIN 子句将表T1的每一行与T2的行进行比较,以满足连接谓词的所有行对,如果连接谓词的计算结果为TRUE,则匹配的T1和T2行的列值将合并为一个新行并包含在结果集中。
下图说明了两个结果集的内联接的结果:
使用两个INNER JOIN子句来查询三个表中的数据:
B.SQL Server左连接
LEFT JOIN子句用于查询来自多个表的数据。
它返回左表中的所有行和右表中的匹配行。
如果在右表中找不到匹配的行,则使用NULL代替显示。
以下图说明了两个结果集的左连接结果:
以下说明如何使用LEFT JOIN子句来连接两个表T1和T2:
在上面语法中,T1和T2分别是左表和右表。
对于T1表中的每一行,查询将其与T2表中的所有行进行比较。
如果一对行导致连接谓词计算为TRUE,则将组合这些行中的列值以形成新行,然后将其包含在结果集中。
如果左表(T1)中的行没有与来自T2表的任何匹配行 ,则查询将左表的行的列值与来自右表的每个列值的NULL组合。
简而言之,LEFT JOIN子句返回左表(T1)中的所有行以及右表(T2)中匹配的行或NULL值。
以下语句使用LEFT JOIN子句查询products和order_items表中的数据:
order_id列中的NULL列表表明相应的产品尚未销售给任何客户
N
可以使用WHERE子句来过滤结果集。
以下查询返回未出现在任何销售订单中的产品:
C.ON与WHERE子句
以下查询查找属于订单ID为100的产品:
如果将条件order_id=100移动到ON子句:
查询返回了所有产品,但只有ID为100的产品具有关联的订单数据。
请注意,对于INNER JOIN 子句,如果将ON子句中的条件放在WHERE子句中,则它在功能上是等效的
D.SQL Server 右连接
RIGHT JOIN子句组合来自两个或多个表的数据。RIGHT JOIN开始从右表中选择并与左表中的行匹配。RIGHT JOIN 返回一个结果集,该结果集右表的列将使用NULL值。
以下是RIGHT JOIN的语法:
在此语法中,t1是左表,t2是右表,
请注意,RIGHT JOIN和RIGHT OUTER JOIN是相同的。OUTER 关键字是可选的。
下图说明了RIGHT JOIN 操作:
橙色部分表示返回的结果集
SQL Server RIGHT JOIN 示例
以下语句返回production.producrs表中的产品名称和sales.order_items所有order_id:
E.SQL Server 交叉连接
CROSS JOIN连接两个或多个不相关的表。
以下是两个表的SQL Server CROSS JOIN的语法:
CROSS JOIN将第一个表(T1)中的每一行与第二个表(T2)中的每一行连接起来。换句话说,交叉连接返回两个表中的笛卡尔积。
与INNER JOIN或LEFT JOIN不同,交叉连接不会在连接的表之间建立关系。
假设T1表包含三行:1,2和3,T2表包含三行:A,B和C。
CROSS JOIN从第一个表(T1)获取一行,然后为第二个表(T2)中的每一行创建新行。然后它对第一个表(T1)中的下一行执行相同操作,以此类推。