SQL之各种join小结详细讲解


Posted in MySQL onAugust 04, 2021

SQL Left Join, Right Join, Inner Join, and Natural Join 各种Join小结

在SQL语言中,存在着各种Join,有Left Join, Right Join, Inner Join, and Natural Join等,对于初学者来说肯定一头雾水,都是神马跟神马啊,它们之间到底有着怎样的区别和联系呢,我们先用一张图片来说明:

SQL之各种join小结详细讲解

上面这张图很好的阐释了Left Join, Right Join, Inner Join,和Full Outer Join的区别,下面用我们用一个简单的例子来帮助我们理解和区分,现在有两个表Person和Address:

-- Table Person
+----------+-----------+----------+
| PersonId | FirstName | LastName |
+----------+-----------+----------+
|        1 | Zhang     | San      |
|        2 | Li        | Si       |
|        3 | Wang      | Wu       |
|        4 | Yang      | Liu      |
+----------+-----------+----------+


-- Table Address
+-----------+----------+---------------+-------+
| AddressId | PersonId | City          | State |
+-----------+----------+---------------+-------+
|         1 |        2 | San Francisco | CA    |
|         2 |        3 | Los Angeles   | CA    |
|         3 |        1 | San Diego     | CA    |
+-----------+----------+---------------+-------+

我们下面一个一个的来看:

Left Join: returns all rows from the left table (table1), with the matching rows in the right table (table2). The result is NULL in the right side when there is no match.

左交:返回左表的所有行和匹配的右表的行,如果没有匹配上的用NULL.

SELECT * FROM Person LEFT JOIN Address ON Person.PersonId = Address.PersonId; 
+----------+-----------+----------+-----------+----------+---------------+-------+
| PersonId | FirstName | LastName | AddressId | PersonId | City   | State |
+----------+-----------+----------+-----------+----------+---------------+-------+
|        2 | Li        | Si       |         1 |        2 | San Francisco | CA    |
|        3 | Wang      | Wu       |         2 |        3 | Los Angeles   | CA    |
|        1 | Zhang     | San      |         3 |        1 | San Diego     | CA    |
|        4 | Yang      | Liu      |      NULL |     NULL | NULL          | NULL  |
+----------+-----------+----------+-----------+----------+---------------+-------+

Right Join: returns all rows from the right table (table2), with the matching rows in the left table (table1). The result is NULL in the left side when there is no match.

右交:返回右表的所有行和匹配的左表的行,如果没有匹配上的用NULL.

SELECT * FROM Person RIGHT JOIN Address ON Person.PersonId = Address.PersonId; 
+----------+-----------+----------+-----------+----------+---------------+-------+
| PersonId | FirstName | LastName | AddressId | PersonId | City          | State |
+----------+-----------+----------+-----------+----------+---------------+-------+
|        1 | Zhang     | San      |         3 |        1 | San Diego     | CA    |
|        2 | Li        | Si       |         1 |        2 | San Francisco | CA    |
|        3 | Wang      | Wu       |         2 |        3 | Los Angeles   | CA    |
|     NULL | NULL      | NULL     |         4 |        5 | Memphis       | TN    |
+----------+-----------+----------+-----------+----------+---------------+-------+

Inner Join: selects all rows from both tables as long as there is a match between the columns in both tables.

内交: 选择左右表中关键字匹配上的行。

SELECT * FROM Person INNER JOIN Address ON Person.PersonId = Address.PersonId;  +----------+-----------+----------+-----------+----------+---------------+-------+
| PersonId | FirstName | LastName | AddressId | PersonId | City          | State |
+----------+-----------+----------+-----------+----------+---------------+-------+
|        1 | Zhang     | San      |         3 |        1 | San Diego     | CA    |
|        2 | Li        | Si       |         1 |        2 | San Francisco | CA    |
|        3 | Wang      | Wu       |         2 |        3 | Los Angeles   | CA    |
+----------+-----------+----------+-----------+----------+---------------+-------+

Full Join: returns all rows from the left table (table1) and from the right table (table2), and it combines the result of both LEFT and RIGHT joins.

全交: 返回左表的所有行和右表的所有行,是左交和右交的联合。

注意,由于MySql中没有Full Join命令,所以我们通过把Left Join和Right Join的结果Union起来也是可以的:

SELECT * FROM Person LEFT JOIN Address ON Person.PersonId = Address.PersonId UNION
SELECT * FROM Person RIGHT JOIN Address ON Person.PersonId = Address.PersonId;  +----------+-----------+----------+-----------+----------+---------------+-------+
| PersonId | FirstName | LastName | AddressId | PersonId | City          | State |
+----------+-----------+----------+-----------+----------+---------------+-------+
|        2 | Li        | Si       |         1 |        2 | San Francisco | CA    |
|        3 | Wang      | Wu       |         2 |        3 | Los Angeles   | CA    |
|        1 | Zhang     | San      |         3 |        1 | San Diego     | CA    |
|        4 | Yang      | Liu      |      NULL |     NULL | NULL          | NULL  |
|     NULL | NULL      | NULL     |         4 |        5 | Memphis       | TN    |
+----------+-----------+----------+-----------+----------+---------------+-------+

Natural Join: creates an implicit join clause for you based on the common columns in the two tables being joined. Common columns are columns that have the same name in both tables. A NATURAL JOIN can be an INNER join, a LEFT OUTER join, or a RIGHT OUTER join. The default is INNER join.

自然交: 根据左右两表的相同列创建一个隐含的join操作,相同列就是两表中列名相同的两列。自然交可以是内交,左交或者是右交。默认是内交。

SELECT * FROM Person NATURAL JOIN Address; 

+----------+-----------+----------+-----------+---------------+-------+
| PersonId | FirstName | LastName | AddressId | City          | State |
+----------+-----------+----------+-----------+---------------+-------+
|        1 | Zhang    | San      |         3 | San Diego     | CA    |
|        2 | Li        | Si       |         1 | San Francisco | CA    |
|        3 | Wang      | Wu       |         2 | Los Angeles   | CA    |
+----------+-----------+----------+-----------+---------------+-------+

最后注意一下,下面等号左右两边的关键字是等价的:

A LEFT JOIN B      =       A LEFT OUTER JOIN B
A RIGHT JOIN B     =       A RIGHT OUTER JOIN B
A FULL JOIN B      =       A FULL OUTER JOIN B
A INNER JOIN B     =       A JOIN B

到此这篇关于SQL之各种join小结详细讲解的文章就介绍到这了,更多相关SQL之各种join小结内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
mysql的MVCC多版本并发控制的实现
Apr 14 MySQL
MySQL REVOKE实现删除用户权限
Jun 18 MySQL
Node-Red实现MySQL数据库连接的方法
Aug 07 MySQL
MySQL去除重叠时间求时间差和的实现
Aug 23 MySQL
浅谈mysql哪些情况会导致索引失效
Nov 20 MySQL
MYSQL如何查看进程和kill进程
Mar 13 MySQL
一文简单了解MySQL前缀索引
Apr 03 MySQL
MySQL的存储函数与存储过程的区别解析
Apr 08 MySQL
MySQL事务操作的四大特性以及并发事务问题
Apr 12 MySQL
MySQL创建管理KEY分区
Apr 13 MySQL
MySQL 原理优化之Group By的优化技巧
Aug 14 MySQL
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
May 08 MySQL
SQL实现LeetCode(175.联合两表)
Aug 04 #MySQL
一篇文章带你深入了解Mysql触发器
Aug 02 #MySQL
sql注入教程之类型以及提交注入
MySQL子查询中order by不生效问题的解决方法
Aug 02 #MySQL
MySQL中utf8mb4排序规则示例
Aug 02 #MySQL
MySql子查询IN的执行和优化的实现
MySQL里面的子查询的基本使用
Aug 02 #MySQL
You might like
ThinkPHP模板输出display用法分析
2014/11/26 PHP
Thinkphp单字母函数使用指南
2016/05/08 PHP
Laravel 自定命令以及生成文件的例子
2019/10/23 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
jQuery DIV弹出效果实现代码
2009/07/03 Javascript
js下判断 iframe 是否加载完成的完美方法
2010/10/26 Javascript
Javascript中封装window.open解决不兼容问题
2014/09/28 Javascript
jQuery实现根据类型自动显示和隐藏表单
2015/03/18 Javascript
利用JS实现数字增长
2016/07/28 Javascript
利用jQuery解析获取JSON数据
2017/04/08 jQuery
详解vue-router 2.0 常用基础知识点之导航钩子
2017/05/10 Javascript
jQuery菜单实例(全选,反选,取消)
2017/08/28 jQuery
JavaScript的词法结构精华篇
2018/10/17 Javascript
JavaScript代码调试方法实例小结
2019/01/05 Javascript
js实现指定时间倒计时效果
2019/08/26 Javascript
Vue中keep-alive组件作用详解
2020/02/04 Javascript
Python使用百度API上传文件到百度网盘代码分享
2014/11/08 Python
朴素贝叶斯算法的python实现方法
2014/11/18 Python
遗传算法之Python实现代码
2017/10/10 Python
Python入门必须知道的11个知识点
2018/03/21 Python
python-opencv 将连续图片写成视频格式的方法
2019/01/08 Python
Django实现学员管理系统
2019/02/26 Python
python 的 scapy库,实现网卡收发包的例子
2019/07/23 Python
tensorflow中tf.slice和tf.gather切片函数的使用
2020/01/19 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
2020/06/18 Python
5个你不知道的HTML5的接口介绍
2013/08/07 HTML / CSS
HTML5 预加载让页面得以快速呈现
2013/08/13 HTML / CSS
品管员岗位职责
2013/11/10 职场文书
初三学习决心书
2014/03/11 职场文书
办公室领导干部作风整顿个人整改措施
2014/09/17 职场文书
教师党的群众路线对照检查材料
2014/09/24 职场文书
工程技术员岗位职责
2015/04/11 职场文书
人与自然观后感
2015/06/16 职场文书
高三数学复习备考教学反思
2016/02/18 职场文书
浅谈什么是SpringBoot异常处理自动配置的原理
2021/06/21 Java/Android
MySQL 语句执行顺序举例解析
2022/06/05 MySQL