mysql,如何理解左连接left join和右连接right join语句?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
本文描述mysql
的左连接left join
和右连接right join
。在实际的日常应用中,这两个语句都是非常常见的。在本文中,通过对预设的数据进行左连接和右连接的查询,对比说明两者的区别。
大家好,这里是苏南大叔的程序如此灵动博客,记录苏南大叔代码方面的所学所想。本文就mysql
的左连接和右连接的写法进行讨论。测试环境:win10
,mysql@5.7.26
,MySQLFront@5.3
。
样本数据集
首先,介绍一下测试标本。两个表users
、posts
,users
发表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-苏南兄弟');
左连接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;
可以看到拿到的数据是左表的全部以及右表的部分数据。他们可以通过下面的语句分别获得:
直接获得左表的独有数据+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;
获得两者交集部分:
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;
右链接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;
可以看到拿到的数据是右表的全部以及左表的部分数据。他们可以通过下面的语句分别获得:
直接获得右表的独有数据+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;
获得两者交集部分,(执行效果和对应的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
相关文章,请参考:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。