SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)
2016-05-23 16:25
615 查看
原文链接:http://www.powerxing.com/sql-join/
总的来说,四种JOIN的使用/区别可以描述为:
left join 会从左表(shop)那里返回所有的记录,即使在右表(sale_detail)中没有匹配的行。
right outer join 右连接,返回右表中的所有记录,即使在左表中没有记录与它匹配
full outer join 全连接,返回左右表中的所有记录
在表中存在至少一个匹配时,inner join 返回行。 关键字inner可省略。
具体可以看stackoverflow上,Difference between Inner Join & Full join这个问题,说得蛮清楚的,我就搬运一下这个问题的答案好了。
LEFT OUTER JOIN
RIGHT OUTER JOIN
FULL OUTER JOIN
关键字
接着将以简化的数据集来说明这些JOIN语句。考虑有如下两个数据集,注意到有些元素在A中有,在B中没有,反过来也是。
将会得到如下的结果(空白的元素表示
左连接(LEFT OUTER JOIN)会输出左边的表中的所有结果,如果右边的表中有相应项,则会输出,否则为
因此,如果要找出在AA(左边的表)中有,而在BB(右边的表)中没有的数据项,可以使用如下的SQL语句:
再次注意,缺失的数据项的值是
图解SQL的JOIN操作
总的来说,四种JOIN的使用/区别可以描述为:
left join 会从左表(shop)那里返回所有的记录,即使在右表(sale_detail)中没有匹配的行。
right outer join 右连接,返回右表中的所有记录,即使在左表中没有记录与它匹配
full outer join 全连接,返回左右表中的所有记录
在表中存在至少一个匹配时,inner join 返回行。 关键字inner可省略。
具体可以看stackoverflow上,Difference between Inner Join & Full join这个问题,说得蛮清楚的,我就搬运一下这个问题的答案好了。
Join
一共有三种OUTERJOIN:
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的操作应该就完全明白了。图解SQL的JOIN操作
相关文章推荐
- 快速从mysqldump文件中恢复一张表
- Mysql5.7忘记root密码及mysql5.7修改root密码的方法
- Hibernate_使用原生态sql&Dto传输&最佳实践_Demo
- Redis 集合(Set)
- mysql replication copy master to slave
- Redis系列学习笔记19 Redis多机功能
- Redis系列学习笔记18 Redis持久化
- mysql replication by mysqldump & xtrabackup
- Redis系列学习笔记16 服务器配置
- redhat 安装mysql
- Redis系列学习笔记14 微博功能分析
- Mysql几种索引方式的区别及适用情况
- redis java 分页、排序示例
- sqlserver批量更新
- Redis系列学习笔记13 Lua 脚本
- Redis系列学习笔记12 事务
- Redis系列学习笔记10 发布与订阅
- Redis系列学习笔记9 键过期功能
- mybatis+0+null--------------mybatis中stutas==0是sql动态语句拼接问题
- 从配置文件中取出数据库链接字符串的技巧