mysql,如何理解内连接inner join和外连接union语句?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
首先必须澄清的是:mysql
不支持outer join
语句,只有inner join
语句,并且可以简称为join
,这个是本文正确理解的前提。非要说mysql
支持outer join
的话,请检查你的数据库到底是不是mysql
呢?
大家好,这里是苏南大叔的程序如此灵动博客,记录苏南大叔关于代码的所学所想。本文就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-苏南兄弟');
内连接inner join
求交集
这个内连接inner join
的效果,也是求交集。所以,这里出现了第三种求交集的方式。
SELECT users.id as uid,users.name,posts.title FROM users
INNER JOIN posts on users.id = posts.user_id
ORDER BY users.id
这个inner join
也可以表述为join
,效果相同。
SELECT users.id as uid,users.name,posts.title FROM users
JOIN posts on users.id = posts.user_id
ORDER BY users.id
另外两种求交集的方式:
left join ... where right.key is not null
right join ... where left.key is not null
外连接union
求合集
实际上mysql
并不支持outer join
,但是可以使用union
来模拟相同的效果。比如:
select users.id as uid,users.name,posts.title from users left join posts on users.id = posts.user_id
union
select users.id as uid,users.name,posts.title from users right join posts on users.id = posts.user_id
相关文章
总结
本文主要示例了mysql
中内连接和外连接的用法,更多mysql
相关文章,请查看下面的链接:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。