SQL Server连接表
一、连接表(Joins)。
-
为什么要连接表:在关系数据库中,数据分布在多个逻辑表中。要获得完整有意义的数据集,需要使用连接来查询这些表中的数据。
-
SQL Server支持多种连接:包括 [内连接],[左连接],[右连接],[全外连接]和[交叉连接]。
- 内连接(INNER JOIN):如果表中有至少一个匹配,则返回行。 - 左连接(LEFT JOIN):即使右表中没有匹配,也从左表返回所有的行。 - 右连接(RIGHT JOIN):即使左表中没有匹配,也从右表返回所有的行。 - 全外连接(FULL OUTER JOIN):只要其中一个表中存在匹配,则返回行。 - 交叉连接(CROSS JOIN):返回两个表中行的笛卡尔积。
-
每种连接类型指定SQL Server如何使用一个表中的数据来选择另一个表中的行。
二、SQL Server内连接(INNER JOIN)。
-
内连接是SQL Server中最常用的连接之一,内部联接子句用于查询来自两个或多个相关表的数据。
-
用法:
SELECT select_list FROM T1 INNER JOIN T2 ON join_predicate;
-
在上面语法中,select_list是要从T1 和 T2表中查询数据列名,在FROM子句后面指定主表( T1 ),在INNER JOIN后面指定第二个表( T2 ),只有ON后面的连接谓词的计算结果为TRUE,则匹配的T1和T2行的列值将合并为一个新行并包含在结果集中。
三、SQL Server左连接(LEFT JOIN)。
-
LEFT JOIN 子句用于查询来自多个表的数据。它返回左表中的所有行和右表中的匹配行。如果在右表中找不到匹配的行,则使用 NULL 代替显示。
-
用法:
SELECT select_list FROM T1 LEFT JOIN T2 ON join_predicate;
-
在上面语法中,select_list是要从T1 和 T2表中查询数据列名,在FROM子句后面指定左表( T1 ),在LEFT JOIN后面指定右表( T2 ),只有ON后面的连接谓词的计算结果为TRUE,则匹配的T1和T2行的列值将合并为一个新行并包含在结果集中。但如果T2没有符合的值,则查询将左表中的行的列值与来自右表的每个列值的 NULL 组合。
四、SQL Server右连接(RIGHT JOIN)。
-
RIGHT JOIN 子句组合来自两个或多个表的数据。它返回左表中的匹配行和右表中的所有行。如果在左表中找不到匹配的行,则使用 NULL 代替显示。
-
用法:
SELECT select_list FROM T1 RIGHT JOIN T2 ON join_predicate;
-
在上面语法中,select_list是要从T1 和 T2表中查询数据列名,在FROM子句后面指定左表( T1 ),在RIGHT JOIN后面指定右表( T2 ),返回一个结果集,该结果集包含右表中的所有行,无论是否具有左表中的匹配行。如果右表中的行没有来自右表的任何匹配行,则结果集中右表的列将使用 NULL 值。
五、SQL Server全外链接(FULL OUTER JOIN)。
-
当左表或右表中存在匹配项时,该命令将返回所有行;找不到匹配的行,则使用 NULL 代替显示。
-
用法:
SELECT select_list FROM T1 FULL OUTER JOIN T2 ON join_predicate;
-
在上面语法中,select_list是要从T1 和 T2表中查询数据列名,在FROM子句后面指定表1( T1 ),在FULL OUTER JOIN后面指定表2( T2 ),返回一个结果集,该结果集包含两个表中的所有行,找不到匹配的行,则使用 NULL 代替显示。
六、SQL Server 交叉连接(CROSS JOIN)。
-
CROSS JOIN连接两个或多个不相关的表,该连接返回两个表中行的笛卡尔积。
-
用法:
SELECT select_list FROM T1 CROSS JOIN T2 ON join_predicate;
-
在上面语法中,select_list是要从T1 和 T2表中查询数据列名,连接将第一个表(T1)中的每一行与第二个表(T2)中的每一行连接起来。与INNER JOIN或LEFT JOIN不同,交叉连接不会在连接的表之间建立关系。
七、SQL Server自连接。
- 自联接用于将表连接到自身(同一个表)。它对于查询分层数据或比较同一个表中的行很有用。自联接使用内连接或左连接子句。 由于使用自联接的查询引用同一个表,因此表别名用于为查询中的表分配不同的名称。