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

在前文中,苏南大叔描述了left joinright joininner join等语句,这些join语句,都需要一个on条件的描述。在一些特殊情况下,这个on条件有个特殊的写法,就是using()。本文就描述一下这种特殊情况。

苏南大叔:mysql,如何使用using简化on条件语句的写法? - mysql-using-on
mysql,如何使用using简化on条件语句的写法?(图6-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,这里记录苏南大叔的编程经验文章。本文测试环境:win10mysql@5.7.26MySQLFront@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-苏南兄弟');

苏南大叔:mysql,如何使用using简化on条件语句的写法? - 数据集-userid
mysql,如何使用using简化on条件语句的写法?(图6-2)

基本原理

类比一下语句,两者效果是一致的:

select * from A inner join B on A.id = B.id
select * from A inner join B using(id)

上述语句能够正确执行的重要前提就是:数据表两边都有个字段id,并且两者表示同样的意思。

综合实战

结合数据集再做一下对比,on用在usersposts上就不合适,但是on用在users2posts上就合适。
下面的是错误的例子,报错。

select * from posts inner join users using(user_id)

苏南大叔:mysql,如何使用using简化on条件语句的写法? - users表字段错误
mysql,如何使用using简化on条件语句的写法?(图6-3)

这个例子虽然不报错,但是明显数据匹配错误。

select * from posts inner join users using(id)

苏南大叔:mysql,如何使用using简化on条件语句的写法? - 数据匹配错误
mysql,如何使用using简化on条件语句的写法?(图6-4)

正确的语句:

select * from posts inner join users2 using(user_id)

苏南大叔:mysql,如何使用using简化on条件语句的写法? - 正确的操作
mysql,如何使用using简化on条件语句的写法?(图6-5)

进阶实战

如果非要操作users表的话,也不是不行,那就给id改个名字。新的sql如下:

select * from posts inner join (select id as user_id,name from users) as users using(user_id)

苏南大叔:mysql,如何使用using简化on条件语句的写法? - 正确的语句2
mysql,如何使用using简化on条件语句的写法?(图6-6)

相关文章

总结

使用using代替on要求的条件比较苛刻,所以应用的场景不是很常见。更多mysql相关文章,请点击:

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

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

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

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