T-SQL: JOIN的几种关系

来源:互联网 发布:三毛淘宝小号网 编辑:程序博客网 时间:2024/05/16 06:01

SQL Server提供了多种JOIN机制,在联机丛书FROM (Transact-SQL)中列举了四种JOIN操作.

1.INNER JOIN(交集)
INNER JOIN在数学上是指两个集合的交集,数学符号∩。如下图所示,图中红色部分则为INNER JOIN的结果。
INNER JOIN
例如:
{1, 2} ∩ {1, 2} = {1, 2}.
{1, 2} ∩ {2, 3} = {2}.
{2, 5,8} ∩ {3, 7,9} = ∅(空集).
在SQL Server数据库中,两表或者多表之间的交集关系通过INNER JOIN来实现两个或者多个表之间的相同部分。

USE AdventureWorks2012;GOSET STATISTICS IO ON;-- INNER JOINPRINT '--INNER JOIN--'            SELECT                    [PSN].*                  ,[PWD].*              FROM [Person].[Person]    AS [PSN]        INNER JOIN [Person].[Password]  AS [PWD]                 ON [PWD].[BusinessEntityID] = [PSN].[BusinessEntityID]             WHERE [PSN].[BusinessEntityID] =1001                  ;SET STATISTICS IO OFF;                  

在实际的应用中,经常会遇到查询两个表或者几个表中的相同部分的结果,则可以通过INNER JOIN来实现。比如说,需要从员工信息表和员工考勤表中获取员工的员工信息以及考勤信息,则可以通过INNER JOIN来实现。

2. LEFT JOIN/RIGHT JOIN (左连接或者右连接)
LEFT JOIN 在数学中就是指当前集合。如下图所示,红色部分就是LEFT JOIN的结果。
LEFT JOIN
在SQL Server数据库中,两表或者多表之间的左连接关系通过LEFT JOIN来实现两个或者多个表之间的连接后部分。

USE AdventureWorks2012;GOSET STATISTICS IO ON;--LEFT JOIN/RIGHT JOIN PRINT '--LEFT JOIN/RIGHT JOIN--'            SELECT                    [PSN].*                  ,[PWD].*              FROM [Person].[Person]       AS [PSN]         LEFT JOIN [Person].[Password]  AS [PWD]                 ON [PWD].[BusinessEntityID] = [PSN].[BusinessEntityID]             WHERE [PSN].[BusinessEntityID] =1001                  ;SET STATISTICS IO OFF;

在实际应用中,经常会遇到查询两个表或者几个表中的连接的结果,则需要通过LEFT JOIN来实现。比如说,需要从员工信息表和员工请假表中获取员工信息和请假信息,则可以通过 LEFT JOIN来实现。

对于右连接RIGHT JOIN来说,通常都可以通过左连接 LEFT JOIN来实现,在实际操作中,90%以上的操作都是通过左连接LEFT JOIN来实现的,通过RIGHT JOIN来实现的很少。通常不建议使用右连接RIGHT JOIN来实现数据的查询,这是因为如果右连接 RIGHT JOIN的情况下,很难预估结果集,会导致一些异常情况出现。

3. FULL JOIN(并集)
FULL JOIN在数学上是指两个集合的并集,数学符号为 ∪ 。如下图所示,图中红色部分则为FULL JOIN的结果。
FULL JOIN
例如:
{1, 2} ∪ {1, 2} = {1, 2}.
{1, 2} ∪ {2, 3} = {1, 2, 3}.
{1, 2, 3} ∪ { 4, 5,6} = {1, 2, 3, 4, 5,6}.
{1, 2, 3} ∪∅ ={1, 2, 3}.
在SQL Server数据库中,两表或者多表之间的并集关系通过FULL JOIN来实现两个或者多个表之间的合并后部分。

USE AdventureWorks2012;GOSET STATISTICS IO ON;-- FULL JON PRINT '--FULL JOIN--'            SELECT                    [PSN].*                  ,[PWD].*              FROM [Person].[Person]    AS [PSN]         FULL JOIN [Person].[Password]  AS [PWD]                   ON [PWD].[BusinessEntityID] = [PSN].[BusinessEntityID]              WHERE [PSN].[BusinessEntityID] =1001                    ;SET STATISTICS IO OFF;

在实际应用中,经常会遇到查询两个表或者几个表中的合并的结果,则可以通过FULL JOIN来实现。比如说,需要从员工考勤表和员工加班表中获取员工的考勤与加班信息,则可以通过FULL JOIN来实现考勤和加班信息的汇总。

4.CROSS JOIN(笛卡尔积)
CROSS JOIN 在数学中称为笛卡尔积,表示两个集合的乘积,数学符号为X。如下图所示,
Cartesian product
在SQL Server数据库中,两表或者多表之间的笛卡尔积关系通过CROSS JOIN来实现两个或者多个表之间的连接后部分。

USE AdventureWorks2012;GOSET STATISTICS IO ON;--CORSS JOIN PRINT '--CORSS JOIN--'            SELECT                    [PSN].*                  ,[PWD].*              FROM [Person].[Person]    AS [PSN]        CROSS JOIN [Person].[Password]  AS [PWD]              WHERE [PWD].[BusinessEntityID] = [PSN].[BusinessEntityID] AND [PSN].[BusinessEntityID] =1001                     ;SET STATISTICS IO OFF;

在实际应用中,偶尔会遇到查询两个表或者几个表中的交叉相乘的结果,则需要通过CROSS JOIN来实现。

上述简单介绍了T-SQL中几种JOIN 的基本语法和基本关系,通常来说,INNER JOIN的结果集 <= LEFT JOIN的结果集 <= FULL JOIN的结果集 <= CROSS JOIN的结果集。只有在特定情况下,等号关系才会成立。如文中提到的这个例子。

相关连接:
1. https://msdn.microsoft.com/en-us/library/ms177634.aspx
2. http://www.mssqltips.com/sqlservertip/1667/sql-server-join-example/
2. http://en.wikipedia.org/wiki/Cartesian_product
3. http://en.wikipedia.org/wiki/Intersection_%28set_theory%29
4. http://en.wikipedia.org/wiki/Union_%28set_theory%29

文中部分图片来自网络http://en.wikipedia.org。

0 0
原创粉丝点击