mysql,如何使用using简化on条件语句的写法?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
在前文中,苏南大叔描述了left join
、right join
、inner join
等语句,这些join
语句,都需要一个on
条件的描述。在一些特殊情况下,这个on
条件有个特殊的写法,就是using()
。本文就描述一下这种特殊情况。
大家好,这里是苏南大叔的“程序如此灵动”博客,这里记录苏南大叔的编程经验文章。本文测试环境:win10
,mysql@5.7.26
,MySQLFront@5.3
。
测试样本
样本上和前几篇文章基本类似,就是把users
表复制一份成users2
,然后users2.id
换成了users2.user_id
。
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-苏南兄弟');
DROP TABLE IF EXISTS `users2`;
CREATE TABLE `users2` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `users2` VALUES (1,'1-苏南大叔'),(2,'2-苏南大哥'),(3,'3-苏南兄弟');
基本原理
类比一下语句,两者效果是一致的:
select * from A inner join B on A.id = B.id
select * from A inner join B using(id)
上述语句能够正确执行的重要前提就是:数据表两边都有个字段id
,并且两者表示同样的意思。
综合实战
结合数据集再做一下对比,on
用在users
和posts
上就不合适,但是on
用在users2
和posts
上就合适。
下面的是错误的例子,报错。
select * from posts inner join users using(user_id)
这个例子虽然不报错,但是明显数据匹配错误。
select * from posts inner join users using(id)
正确的语句:
select * from posts inner join users2 using(user_id)
进阶实战
如果非要操作users
表的话,也不是不行,那就给id
改个名字。新的sql
如下:
select * from posts inner join (select id as user_id,name from users) as users using(user_id)
相关文章
总结
使用using
代替on
要求的条件比较苛刻,所以应用的场景不是很常见。更多mysql
相关文章,请点击:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。