快速,持续,稳定,傻瓜式
支持Mysql,Sqlserver数据同步

SQL连接的可视表示

在线QQ客服:1922638

专业的SQL Server、MySQL数据库同步软件

这只是一篇简单的文章,直观地解释了SQL JOIN。在本文中,我将讨论从两个关系表返回数据的七种不同方式。我将讨论的七个联接是:内联接,左联接,右联接,外联接,左排除联接,右排除联接,外联接,同时提供每个示例。
  • 下载Visual SQL JOINs示例-1.09 KB
  • 下载Visual SQL JOINs备忘单-143 KB

背景

我是一个很漂亮的人。从图片的角度看,事情似乎更有意义。我在Internet上四处寻找SQL JOIN的良好图形表示形式,但是找不到自己喜欢的东西。有些具有良好的图表,但缺乏完整性(它们没有所有可能的JOIN),而有些则简直糟透了。因此,我决定创建自己的文章,并写一篇有关它的文章。

使用代码

我将讨论可以从两个关系表返回数据的七种不同方式。我将排除交叉联接和自引用联接。我将讨论的七个联接如下所示:

  1. INNER JOIN
  2. LEFT JOIN
  3. RIGHT JOIN
  4. OUTER JOIN
  5. LEFT JOIN EXCLUDING INNER JOIN
  6. RIGHT JOIN EXCLUDING INNER JOIN
  7. OUTER JOIN EXCLUDING INNER JOIN

对于本文的目的,我将把5,图6和7 LEFT EXCLUDING JOINRIGHT EXCLUDING JOINOUTER EXCLUDING JOIN,分别。有人可能会争辩说5、6和7并没有真正联接这两个表,但为简单起见,我仍将它们称为联接,因为您在每个查询中都使用了SQL联接(但排除了一些带有WHERE子句的记录) 。

内部联接

Visual_SQL_Joins / INNER_JOIN.png

这是最简单,最容易理解的Join,也是最常见的。该查询将返回左表(表A)中所有与右表(表B)中具有匹配记录的记录。该联接的编写如下:

SELECT <select_list> 
FROM Table_A A
INNER JOIN Table_B B
ON A.Key = B.Key

左加入

Visual_SQL_Joins / LEFT_JOIN.png

该查询将返回左表(表A)中的所有记录,无论这些记录中的任何一条在右表(表B)中是否匹配。它还将从右表中返回所有匹配的记录。该联接的编写如下:

SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key

右加入

Visual_SQL_Joins / RIGHT_JOIN.png

该查询将返回右表(表B)中的所有记录,无论这些记录中的任何一条在左表(表A)中是否匹配。它还将返回左侧表中的所有匹配记录。该联接的编写如下:

SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key

外加入

Visual_SQL_Joins / FULL_OUTER_JOIN.png

此Join也可以称为a FULL OUTER JOIN或a FULL JOIN。该查询将返回两个表中的所有记录,并将左表(表A)中的记录与右表(表B)中的记录匹配。该联接的编写如下:

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key

左,不包括JOIN

Visual_SQL_Joins / LEFT_EXCLUDING_JOIN.png

该查询将返回左表(表A)中的所有记录,这些记录与右表(表B)中的任何记录都不匹配。该联接的编写如下:

SELECT <select_list> 
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL

不包括JOIN的权利

Visual_SQL_Joins / RIGHT_EXCLUDING_JOIN.png

该查询将返回右表(表B)中的所有记录,这些记录与左表(表A)中的任何记录都不匹配。该联接的编写如下:

SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL

外部(不包括JOIN)

Visual_SQL_Joins / OUTER_EXCLUDING_JOIN.png

该查询将返回左表(表A)中的所有记录和右表(表B)中的所有不匹配记录。我还没有使用这种类型的Join的需要,但是其他所有的我都经常使用。该联接的编写如下:

SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL OR B.Key IS NULL

例子

假设我们有两个表Table_ATable_B。这些表中的数据如下所示:

TABLE_A
  PK Value
---- ----------
   1 FOX
   2 COP
   3 TAXI
   6 WASHINGTON
   7 DELL
   5 ARIZONA
   4 LINCOLN
  10 LUCENT

TABLE_B
  PK Value
---- ----------
   1 TROT
   2 CAR
   3 CAB
   6 MONUMENT
   7 PC
   8 MICROSOFT
   9 APPLE
  11 SCOTCH

七个联接的结果如下所示:

-- INNER JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
       B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
INNER JOIN Table_B B
ON A.PK = B.PK

A_PK A_Value    B_Value    B_PK
---- ---------- ---------- ----
   1 FOX        TROT          1
   2 COP        CAR           2
   3 TAXI       CAB           3
   6 WASHINGTON MONUMENT      6
   7 DELL       PC            7

(5 row(s) affected)
-- LEFT JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
LEFT JOIN Table_B B
ON A.PK = B.PK

A_PK A_Value    B_Value    B_PK
---- ---------- ---------- ----
   1 FOX        TROT          1
   2 COP        CAR           2
   3 TAXI       CAB           3
   4 LINCOLN    NULL       NULL
   5 ARIZONA    NULL       NULL
   6 WASHINGTON MONUMENT      6
   7 DELL       PC            7
  10 LUCENT     NULL       NULL

(8 row(s) affected)
-- RIGHT JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
RIGHT JOIN Table_B B
ON A.PK = B.PK

A_PK A_Value    B_Value    B_PK
---- ---------- ---------- ----
   1 FOX        TROT          1
   2 COP        CAR           2
   3 TAXI       CAB           3
   6 WASHINGTON MONUMENT      6
   7 DELL       PC            7
NULL NULL       MICROSOFT     8
NULL NULL       APPLE         9
NULL NULL       SCOTCH       11

(8 row(s) affected)
-- OUTER JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.PK = B.PK

A_PK A_Value    B_Value    B_PK
---- ---------- ---------- ----
   1 FOX        TROT          1
   2 COP        CAR           2
   3 TAXI       CAB           3
   6 WASHINGTON MONUMENT      6
   7 DELL       PC            7
NULL NULL       MICROSOFT     8
NULL NULL       APPLE         9
NULL NULL       SCOTCH       11
   5 ARIZONA    NULL       NULL
   4 LINCOLN    NULL       NULL
  10 LUCENT     NULL       NULL

(11 row(s) affected)
-- LEFT EXCLUDING JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
LEFT JOIN Table_B B
ON A.PK = B.PK
WHERE B.PK IS NULL

A_PK A_Value    B_Value    B_PK
---- ---------- ---------- ----
   4 LINCOLN    NULL       NULL
   5 ARIZONA    NULL       NULL
  10 LUCENT     NULL       NULL
(3 row(s) affected)
-- RIGHT EXCLUDING JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
RIGHT JOIN Table_B B
ON A.PK = B.PK
WHERE A.PK IS NULL

A_PK A_Value    B_Value    B_PK
---- ---------- ---------- ----
NULL NULL       MICROSOFT     8
NULL NULL       APPLE         9
NULL NULL       SCOTCH       11

(3 row(s) affected)
-- OUTER EXCLUDING JOIN
SELECT A.PK AS A_PK, A.Value AS A_Value,
B.Value AS B_Value, B.PK AS B_PK
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.PK = B.PK
WHERE A.PK IS NULL
OR B.PK IS NULL

A_PK A_Value    B_Value    B_PK
---- ---------- ---------- ----
NULL NULL       MICROSOFT     8
NULL NULL       APPLE         9
NULL NULL       SCOTCH       11
   5 ARIZONA    NULL       NULL
   4 LINCOLN    NULL       NULL
  10 LUCENT     NULL       NULL

(6 row(s) affected)

请注意,OUTER JOIN首先返回内部联接记录,然后返回右联接记录,然后最后返回左联接记录(至少,这是我的Microsoft SQL Server所做的;当然,这没有使用任何ORDER BY语句) 。

您可以在此处访问Wikipedia文章以获取更多信息(但是,该条目不是图形的)。

我还创建了备忘单,您可以根据需要将其打印出来。如果右键单击下面的图像并选择“目标另存为…”,则将下载完整尺寸的图像。

图片8

历史

  • 初始版本-2009年2月3日。
  • 版本1.0-2009年2月4日-修复了备忘单和小错别字。

相关推荐

咨询软件
 
QQ在线咨询
售前咨询热线
QQ1922638