我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

本文描述mysql的左连接left join和右连接right join。在实际的日常应用中,这两个语句都是非常常见的。在本文中,通过对预设的数据进行左连接和右连接的查询,对比说明两者的区别。

苏南大叔:mysql,如何理解左连接left join和右连接right join语句? - mysql-left-join
mysql,如何理解左连接left join和右连接right join语句?(图8-1)

大家好,这里是苏南大叔的平行空间笔记本博客,记录苏南大叔代码方面的所学所想。本文就mysql的左连接和右连接的写法进行讨论。测试环境:win10mysql@5.7.26MySQLFront@5.3

样本数据集

首先,介绍一下测试标本。两个表userspostsusers发表posts。共有三个user,用户一发表了两篇post,用户二发表了一篇post,用户三没有发布任何内容。并且被发布的post中,有个神秘人(不能识别的user),发布了一篇文章。

所以,两者的交集是1,2,A独有的是3,B独有的是9。建表语句如下:

DROP TABLE IF EXISTS `posts`;
CREATE TABLE `posts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL,
  `title` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
INSERT INTO `posts` VALUES (1,1,'1-苏南大叔的文章1'),(2,1,'1-苏南大叔的文章2'),(3,2,'2-苏南大哥的文章'),(4,9,'9-神秘人的文章');

DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `users` VALUES (1,'1-苏南大叔'),(2,'2-苏南大哥'),(3,'3-苏南兄弟');

苏南大叔:mysql,如何理解左连接left join和右连接right join语句? - 数据集
mysql,如何理解左连接left join和右连接right join语句?(图8-2)

左连接left join,右表可能null

使用left join可以获得左表的全部数据 + (右表部分数据 + null)。

left join表示左侧表所有记录都将返回,并且不满足匹配条件的右侧连接表记录将返回null

测试语句如下:

SELECT users.id as uid,users.name,posts.title FROM users
LEFT JOIN posts on users.id = posts.user_id
ORDER BY users.id;

苏南大叔:mysql,如何理解左连接left join和右连接right join语句? - 左连接
mysql,如何理解左连接left join和右连接right join语句?(图8-3)

可以看到拿到的数据是左表的全部以及右表的部分数据。他们可以通过下面的语句分别获得:

直接获得左表的独有数据+null(非交集数据),(where 右表.key is null):

SELECT users.id as uid,users.name,posts.title FROM users
LEFT JOIN posts on users.id = posts.user_id
where posts.user_id is null
ORDER BY users.id;

苏南大叔:mysql,如何理解左连接left join和右连接right join语句? - left-join-1
mysql,如何理解左连接left join和右连接right join语句?(图8-4)

获得两者交集部分:

SELECT users.id as uid,users.name,posts.title FROM users
LEFT JOIN posts on users.id = posts.user_id
where posts.user_id is not null
ORDER BY users.id;

苏南大叔:mysql,如何理解左连接left join和右连接right join语句? - left-join-2
mysql,如何理解左连接left join和右连接right join语句?(图8-5)

右链接right join,左表可能null

使用right join可以获得右表的全部数据 + (左表部分数据 + null)。

right join表示右侧表所有记录都将返回,并且不满足匹配条件的左侧连接表记录将返回null

测试语句如下:

SELECT users.id as uid,users.name,posts.title FROM users
right JOIN posts on users.id = posts.user_id
ORDER BY users.id;

苏南大叔:mysql,如何理解左连接left join和右连接right join语句? - 右链接
mysql,如何理解左连接left join和右连接right join语句?(图8-6)

可以看到拿到的数据是右表的全部以及左表的部分数据。他们可以通过下面的语句分别获得:

直接获得右表的独有数据+null,(where 左表.key is null):

SELECT users.id as uid,users.name,posts.title FROM users
right JOIN posts on users.id = posts.user_id
where users.id is null
ORDER BY users.id;

苏南大叔:mysql,如何理解左连接left join和右连接right join语句? - 右链接-1
mysql,如何理解左连接left join和右连接right join语句?(图8-7)

获得两者交集部分,(执行效果和对应的left join一致):

SELECT users.id as uid,users.name,posts.title FROM users
right JOIN posts on users.id = posts.user_id
where users.id is not null
ORDER BY users.id;

苏南大叔:mysql,如何理解左连接left join和右连接right join语句? - 右链接-2
mysql,如何理解左连接left join和右连接right join语句?(图8-8)

相关链接

总结

在本文中,拿到两者交集的方式有两种,后续还有其它的获取方式。更多mysql相关文章,请参考:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   mysql