撰写时间:2022 年 4 月 17日
SQL server 连接表
在关系数据库中,数据分布在多个逻辑表中。 要获得完整有意义的数据集,需要使用连接来查询这些表中的数据。SQL Server支持多种连接,包括 [内连接],[左连接],[右连接],[全外连接]和[交叉连接]。每种连接类型指定SQL Server如何使用一个表中的数据来选择另一个表中的行。
一、SQL Server内连接:
内连接是SQL Server中最常用的连接之一。 内部联接子句用于查询来自两个或多个相关表的数据。SQL Server INNER JOIN 子句的语法:
select
select_list
from
T1
inner join
T2
on
join_predicate;
在此语法中,从 T1 和 T2 表中查询检索数据:首先,在 FROM 子句中指定主表( T1 )其次,在 INNER JOIN 子句和连接谓词中指定第二个表( T2 )。 只有连接谓词计算为 TRUE 的行才包含在结果集中。INNER JOIN 子句将表 T1 的每一行与表 T2 的行进行比较,以查找满足连接谓词的所有行对。 如果连接谓词的计算结果为 TRUE ,则匹配的 T1 和 T2 行的列值将合并为一个新行并包含在结果集中。
二、SQL Server左连接:
LEFT JOIN 子句用于查询来自多个表的数据。它返回左表中的所有行和右表中的匹配行。如果在右表中找不到匹配的行,则使用 NULL 代替显示。以下图说明了两个结果集的左连接结果:
SELECT
select_list
FROM
T1
LEFT JOIN
T2
ON
join_predicate;
在上面语法中, T1 和 T2 分别是左表和右表。对于 T1 表中的每一行,查询将其与 T2 表中的所有行进行比较。如果一对行导致连接谓词计算为 TRUE ,则将组合这些行中的列值以形成新行,然后将其包含在结果集中。如果左表( T1 )中的行没有与来自 T2 表的任何匹配行,则查询将左表中的行的列值与来自右表的每个列值的 NULL 组合。简而言之, LEFT JOIN 子句返回左表( T1 )中的所有行以及右表( T2 )中匹配的行或 NULL 值
三、ON与WHERE子句:以下查询查找属于订单ID为 100 的产品:
SELECT
product_name, order_id
FROM
production.products p
LEFT JOIN
sales.order_items o ON o.product_id = p.product_id
WHERE
order_id = 100
ORDER BY
order_id;
四、 SQL Server右连接:
RIGHT JOIN 子句组合来自两个或多个表的数据。 RIGHT JOIN 开始从右表中选择数据并与左表中的行匹配。 RIGHT JOIN 返回一个结果集,该结果集包含右表中的所有行,无论是否具有左表中的匹配行。如果右表中的行没有来自右表的任何匹配行,则结果集中右表的列将使用 NULL 值。以下是 RIGHT JOIN 的语法:
SELECT
select_list
FROM
T1
RIGHT JOIN
T2
ON
join_predicate;
五、SQL Server 交叉连接:
CROSS JOIN 连接两个或多个不相关的表。以下是两个表的SQL Server CROSS JOIN 的语法:
SELECT
select_list
FROM
T1
CROSS JOIN
T2;
或者
SELECT
select_list
FROM
T1, T2;
CROSS JOIN 将第一个表(T1)中的每一行与第二个表(T2)中的每一行连接起来。 换句话说,交叉连接返回两个表中行的笛卡尔积。 与INNER JOIN或LEFT JOIN不同,交叉连接不会在连接的表之间建立关系。假设 T1 表包含三行: 1 , 2 和 3 , T2 表包含三行: A , B 和 C 。 CROSS JOIN 从第一个表(T1)获取一行,然后为第二个表(T2)中的每一行创建一个新行。 然后它对第一个表(T1)中的下一行执行相同操作,依此类推。在此图中, CROSS JOIN 总共创建了 9 行。 通常,如果第一个表有 n 行,第二个表有 m 行,则交叉连接将产生 n x m 行。