[译文] SQL JOIN,你想知道的应该都有
介绍
这是一篇阐述SQL JOINs的文章。
背景
我是个不喜欢抽象的人,一图胜千言。我在网上查找了所有的关于SQL JOIN的解释,但是没有找到一篇能用图像形象描述的。
有些是有图片的但是他们没有覆盖所有JOIN的例子,有些介绍实在简单空白得不能看。所以我决定写个自己的文章来介绍SQL JOINs.
详细说明
接下来我将讨论七种你可以从两个关联表中获取数据的方法, 排除了交叉JOIN和自JOIN的情况。 七个JOINs的例子如下:
- INNER JOIN (内连接)
- LEFT JOIN (左连接)
- RIGHT JOIN (右连接)
- OUTER JOIN (外连接)
- LEFT JOIN EXCLUDING INNER JOIN (左连接排除内连接结果)
- RIGHT JOIN EXCLUDING INNER JOIN (右连接排除内连接结果)
- OUTER JOIN EXCLUDING INNER JOIN (外连接排除内连接结果)
为了这个文章更好的描述,我把5,6,7当作LEFT EXCLUDING INNER JOIN, RIGHT EXCLUDING INNER JOIN,OUTER EXCLUDING INNER JOIN来特别说明。
有些人可能有不同意见: 5,6,7不是真正的两个表的JOIN; 但是为了方便理解,我仍然把这些作为JOINs, 因为你有可能会在每个查询中使用到这些 JOIN (排除一些有WHERE条件的记录)。
INNER JOIN (内连接)

这是最简单、最容易理解、最常用的JOIN方式。 内连接查询返回表A和表B中所有匹配行的结果。 SQL样例如下:
SELECT <select_list>
FROM Table_A A
INNER JOIN Table_B B
ON A.Key = B.Key
LEFT JOIN (左连接)

LFET JOIN查询返回所有表A中的记录, 不管是否有匹配记录在表B中。它会返回所有表B中的匹配记录 (没有匹配的当然会标记成null了)。 SQL样例如下:
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
RIGHT JOIN (右连接)

和LEFT JOIN相反。 RIGHT JOIN查询会返回所有表B中的记录,不管是否有匹配记录在表A中。它会返回所有表A中的匹配记录(没有匹配的当然会标记成null了)。 SQL样例如下:
SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
OUTER JOIN (外连接)

OUTER JOIN也可以当作是FULL OUTER JOIN 或者FULL JOIN。它会返回两个表中所有行,左表A匹配右表B,右表B也匹配左表A (没有匹配的就显示null了)。
OUTER JOIN一般写成下面样子:
SELECT <select_list>
FROM Table_A A
FULL OUTER JOIN Table_B B
ON A.Key = B.Key
LEFT Excluding JOIN

它会返回表A中所有不在表B中的行,一般写成:
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL
RIGHT Excluding JOIN

与上面的相反,它会返回表B中所有不在表A中的行,SQL样例如下:
SELECT <select_list>
FROM Table_A A
RIGHT JOIN Table_B B
ON A.Key = B.Key
WHERE A.Key IS NULL
OUTER Excluding JOIN

Outer Excluding JOIN 会返回所有表A和表B中没有匹配的行。我还没有遇到要用到这种情况的,但是其他的JOIN,用的比较频繁。 SQL样例如下:
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
例子
假设我们有两个表:表A和表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
这七个JOIN的结果分别如下:
-- 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)
注意:OUTER JOIN中,inner join的行会先返回,接着是右连接了的行,最后是左连接了的行。 (至少 Microsoft SQL Server是这样的; 前提是所有的join都没有使用order by排序过)
-- 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)
你可以参考Wikipedia以查阅更多信息: http://en.wikipedia.org/wiki/Sql_join
我创建了一个简化总结图表(如下),经常用到SQL的话,可以打印下来以作参考。 右击下载图片就行了...
版权
本文翻译自:http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins
这篇文章和相关的代码及图片采用的授权是:The Code Project Open License (CPOL)
译者说明, 转载请注明出处:http://www.cnblogs.com/xufeiyang/p/5818571.html
[译文] SQL JOIN,你想知道的应该都有的更多相关文章
- ORACLE的SQL JOIN方式小结
在ORACLE数据库中,表与表之间的SQL JOIN方式有多种(不仅表与表,还可以表与视图.物化视图等联结),官方的解释如下所示 A join is a query that combines row ...
- 转:画图解释 SQL join 语句
画图解释 SQL join 语句 我认为 Ligaya Turmelle 的关于SQL联合(join)语句的帖子对于新手开发者来说是份很好的材料.SQL 联合语句好像是基于集合的,用韦恩图来解释咋一看 ...
- SQL Join简单介绍
前沿 Join是关系型数据库系统的重要操作之一,SQL Server中包含的常用Join:内联接.外联接和交叉联接等. 如果我们想在两个或以上的表获取其中从一个表中的行与另一个表中的行匹配的数据,这时 ...
- SQL Join 语句
SQL Join 语句 SQL 中每一种连接操作都包括一个连接类型和连接条件. 连接类型 决定了如何处理连接条件不匹配的记录. 连接类型 返回结果 inner join 只包含左右表中满足连接条件的记 ...
- SQL JOIN\SQL INNER JOIN 关键字\SQL LEFT JOIN 关键字\SQL RIGHT JOIN 关键字\SQL FULL JOIN 关键字
SQL join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据. Join 和 Key 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join. 数据库中的表 ...
- 一名小小的SQL Server DBA想谈一下SQL Server的能力
一名小小的SQL Server DBA想谈一下SQL Server的能力 百度上暂时还没有搜索到相关的个人写的比较有价值的文章,至少在中文网络的世界里面没有 但是在微软的网站有这样一篇文章:<比 ...
- sql join 用法
SQL JOIN 的用法 关于sql语句中的连接(join)关键字,是较为常用而又不太容易理解的关键字,下面这个例子给出了一个简单的解释 --建表table1,table2:create tabl ...
- SQL Join各种内联外联说明
Visual Representation of SQL Joins C.L. Moffatt, 3 Feb 2009 CPOL 4.96 (406 votes) Rate this: This ...
- SQL JOIN语法,以及JOIN where 和and区别,还有where和join效率问题。
语法 join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据. Join 和 Key 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join. 数据库中的表可 ...
随机推荐
- 基于jQuery的一个提示功能的实现
最近有点忙,没有时间更新自己的博客,只能说我在原地踏步了,不知道你们进步了没有? 今天给大家分享一个提示的实现,有点简单,适合小白同学学习.下面是效果图 提示的功能: 当鼠标进入“我的菜单”的子菜单时 ...
- Python中re模块的使用
#table-1 thead,#table-1 tr { border-top-width: 1px; border-top-style: solid; border-top-color: rgb(2 ...
- pat1051-1060
1051 自己写的非常麻烦 http://blog.csdn.net/biaobiaoqi/article/details/9338397 的算法比较好,我的就贴下吧,主要对入栈出栈不够理解 #inc ...
- CF367 E - Working routine
十字链表模拟 #include<bits/stdc++.h> using namespace std; int n,m,q; struct Node{ int v; int d,r; }m ...
- canvas焰火特效
之前在抖音上看到了一个很漂亮的焰火效果.这会儿有时间就用canvas实现了一下. 演示地址:http://suohb.com/work/firework4.htm 先看效果:(静态图片看不太出效果,请 ...
- jquery的过滤学习
$("p").eq(1) 匹配下标为1的p标签 $("p").hasClass("a")匹配所有p标签class中包含a的 ...
- tp3.2 URL_MODEL为2 配置
1. tp项目index.php同级目录 add . htaccess文件 ,rewirte重写 内容为: <IfModule mod_rewrite.c> Options +Follo ...
- SPOJ3267:D-query
题面 SPOJ3267 Sol 给定\(N\)个正整数构成的序列,将对于指定的闭区间查询其区间内的不同的数的个数 主席树 不是权值线段树 维护位置 如果插入一个数时发现之前有过了 那么修改当前的,那个 ...
- SPOJ1825:Free tour II
题意 luogu的翻译 给定一棵n个点的树,树上有m个黑点,求出一条路径,使得这条路径经过的黑点数小于等于k,且路径长度最大 Sol 点分治辣 如果是等于\(k\)的话,开个桶取\(max\)就好了 ...
- Bzoj4869: [Shoi2017]相逢是问候
题面 传送门 Sol 摆定理 \[ a^b\equiv \begin{cases} a^{b\%\phi(p)}~~~~~~~~~~~gcd(a,p)=1\\ a^b~~~~~~~~~~~~~~~~~ ...