一、简介。
上期我们提到SQL Server支持多种连接,包括 [内连接],[左连接],[右连接],[全外连接]和[交叉连接]。 每种连接类型指定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)中的下一行执行相同操作,依此类推。
在此图中, CROSS JOIN 总共创建了 9 行。 通常,如果第一个表有 n 行,第二个表有 m 行,则交叉连接 将产生 n x m 行。
我举一个最简单的例子,比如我有3615条衬衫和6351条裤子,问:能有多少种搭配,
常人肯定是用乘法计算,但计算机是没有乘法概念的,计算机的乘法也是后面给计算机强加上的结果,计算机面对这种情况,会使用暴力破解,将所有的情况都一一列举出来,这也是评判计算机的好坏方法,计算机性能越好,能支持的计算数量就越多。数学界上,很多历史难题都是利用计算机的暴力破解,获取正确的结果后,反向逆推公式。
三、全外连接
橙色部分表示返回的结果集。
FULL OUTER JOIN当左表或右表中存在匹配项时,该命令将返回所有行。
下面创建一些示例表来演示全外连接。
首先,创建一个名为 pm 的新模式,它代表项目管理。
接下来,在 pm 模式中创建名为 projects 和 members 的新表:
假设每个成员只能参与一个项目,每个项目都有零个或多个成员。 如果项目处于构思阶段,则不会分配 任何成员。
然后,向 projects 和 member 表中插入一些行记录:
之后,查询 projects 和 member 表中的数据:
最后,使用 FULL OUTER JOIN 查询 projects 和 member 表中的数据:
执行上面查询语句,得到以下结果:
在此示例中,查询返回参与项目的成员,不参与任何项目的成员以及没有任何成员的项目。
要查找不参与任何项目的成员和没有任何成员的项目,请在上述查询中添加 WHERE 子句:
执行上面查询语句,得到以下结果: