SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)
来源:互联网 发布:陈奕迅 杨千嬅 知乎 编辑:程序博客网 时间:2024/04/28 12:08
总的来说,四种JOIN的使用/区别可以描述为:
left join 会从左表(shop)那里返回所有的记录,即使在右表(sale_detail)中没有匹配的行。
right outer join 右连接,返回右表中的所有记录,即使在左表中没有记录与它匹配
full outer join 全连接,返回左右表中的所有记录
在表中存在至少一个匹配时,inner join 返回行。 关键字inner可省略。
具体可以看stackoverflow上,Difference between Inner Join & Full join这个问题,说得蛮清楚的,我就搬运一下这个问题的答案好了。
Join
一共有三种OUTER
JOIN:
- LEFT OUTER JOIN
- RIGHT OUTER JOIN
- FULL OUTER JOIN
关键字OUTER
是可选择的,取决于具体语言,在实现上它们都是遵循标准的,因此FULL JOIN
和FULL OUTER JOIN
是一样的。
接着将以简化的数据集来说明这些JOIN语句。考虑有如下两个数据集,注意到有些元素在A中有,在B中没有,反过来也是。
Set "A" Set "B"
AA BB
-------- --------
Item 1 Item 3
Item 2 Item 4
Item 3 Item 5
Item 4 Item 6
LEFT OUTER JOIN
现在执行如下SQL语句(左连接,LEFT OUTER JOIN):
SELECT * FROM A LEFT OUTER JOIN B ON AA = BB
将会得到如下的结果(空白的元素表示NULL
):
AA BB
-------- --------
Item 1
Item 2
Item 3 Item 3
Item 4 Item 4
左连接(LEFT OUTER JOIN)会输出左边的表中的所有结果,如果右边的表中有相应项,则会输出,否则为NULL
因此,如果要找出在AA(左边的表)中有,而在BB(右边的表)中没有的数据项,可以使用如下的SQL语句:
SELECT * FROM A LEFT OUTER JOIN B ON AA = BB
WHERE BB is NULL
RIGHT OUTER JOIN
如果使用右连接,结果将会输出BB中所有的数据项和AA中相应的匹配项(注意你现在是获取了右边的表中的所有数据项):
SELECT * FROM A RIGHT OUTER JOIN B ON AA = BB
AA BB
-------- --------
Item 3 Item 3
Item 4 Item 4
Item 5
Item 6
FULL OUTER JOIN
如果想要取得所有的元素项,则可以使用FULL JOIN
:
SELECT * FROM A FULL JOIN B ON AA = BB
AA BB
-------- --------
Item 1 <-----+
Item 2 |
Item 3 Item 3 |
Item 4 Item 4 |
Item 5 +--- empty holes are NULL's
Item 6 |
^ |
| |
+---------------------+
再次注意,缺失的数据项的值是NULL
。
INNER JOIN
INNER JOIN
跟JOIN
是一样的,一般INNER
关键字可以省略。INNER JOIN
将只会返回相匹配的元素项,即不会返回结果为NULL
的数据项。
SELECT * FROM A INNER JOIN B ON AA = BB
AA BB
-------- --------
Item 3 Item 3
Item 4 Item 4
CROSS JOIN
最后还有一个CROSS JOIN
,笛卡儿积,将会返回A中每个元素分别匹配B中所有元素的结果,即N*M组合。
SELECT * FROM A CROSS JOIN B
AA BB
-------- --------
Item 1 Item 3 ^
Item 1 Item 4 +--- A中第一个元素, 匹配B中所有元素
Item 1 Item 5 |
Item 1 Item 6 v
Item 2 Item 3 ^
Item 2 Item 4 +--- A中第二个元素, 匹配B中所有元素
Item 2 Item 5 |
Item 2 Item 6 v
Item 3 Item 3 ... and so on
Item 3 Item 4
Item 3 Item 5
Item 3 Item 6
Item 4 Item 3
Item 4 Item 4
Item 4 Item 5
Item 4 Item 6
图解SQL的JOIN操作
这边也有一张图清楚的说明了每个JOIN操作。建议把上面的内容浏览一边后,再好好看下这张图片,相信对JOIN的操作应该就完全明白了。
参考资料
- Difference between Inner Join & Full join – stackoverflow
- Join(SQL) – Wikipedia
http://www.powerxing.com/sql-join/
转自:http://www.powerxing.com/sql-join/
- SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)
- SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)
- 【SQL】inner join、outer join、cross join和left join、right join、full join的区别
- SQL中 inner join、 left outer join 、right outer join、 full outer join之间的区别
- SQL的inner join、left join、right join、full outer join、union、union all的区别
- SQL的inner join、left join、right join、full outer join、union、union all的区别
- 图解SQL inner join、left join、right join、full outer join、union、union all的区别
- 图解SQL inner join、left join、right join、full outer join、union、union all的区别
- 关于sql的full outer join,left join,right join,inner join, cross join 的说明
- inner join,outer join,left join,right join的区别
- inner join,outer join,left join,right join的区别
- inner join,outer join,left join,right join的区别
- Inner join,outer join,left join,right join的区别
- Inner join,outer join,left join,right join的区别
- sql的inner join/left join/right join/full join
- inner join, left join, right join, full join 的区别
- inner join, left join, right join, full join 的区别
- inner join, left join, right join, full join 的区别?
- java jacob 操作word 文档,进行写操作,如生成表格,添加 图片
- asp.net link oracle
- C语言 构造类型(结构体、枚举)
- json数据传递
- 1006. Sign In and Sign Out (25)
- SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)
- [FAQ10087]为什么进入Launcher界面之后UART Log就不吐了?
- IOS 学习 PickView的使用
- Linux下MTK 3G网卡驱动移植
- vmware esxi 技巧集合
- Android自定义日期滚动控件
- JavaBean
- InnoDB 参数建议
- linux recv 返回值 和 recv 标志参数--- 实测