一、natural join 是什么
natural join 叫自然连接,是SQL99语法中支持的一种连接方式,mysql与oracle等主流数据库均支持这种语法。natural join 无需声明连接条件,sql执行器会自动寻找连接的两个表中相同的字段去生成连接条件,然后取数据的交集。
其实自然连接就是自动生成连接条件的内连接而已。他也不是什么新的连接,就是一个为了简化写法的语法糖而已(mysql中)。我们可以用下面的sql来证明下这个连接到底是怎么执行的。
原始sql:
select a.user_id from sys_user a natural join sys_user_role ;
sql执行器优化真正执行的sql:
select `sunacwy_cockpit`.`a`.`user_id` AS `user_id` from `sunacwy_cockpit`.`sys_user` `a` join `sunacwy_cockpit`.`sys_user_role` where (`sunacwy_cockpit`.`a`.`user_id` = `sunacwy_cockpit`.`sys_user_role`.`user_id`)
从上面的例子中我们可以看到,当写出了自然连接时,真正执行的还是内连接的sql,只不过是省略了连接条件的书写而已。上面的自然连接的sql我们完全可以视作如下的sql:
select a.user_id from sys_user a inner join sys_user_role b on a.user_id = b. user_id;
不过使用内连接必须有个前提条件,两个表的连接字段必须是同名的,这样才能正常使用自然连接。
二、using是什么
先看下下面三个意思完全一致的sql,就会明白usring是什么了。
sql一:
select a.user_id from sys_user a inner join sys_user_role b on a.user_id = b. user_id;
sql二:
select a.user_id from sys_user inner join sys_user_role using(user_id);
sql三:
select a.user_id from sys_user natural join sys_user_role;
这样应该很直观就可以看出usring是干什么的了,usring()里面的字段就是连接条件,其实using在mysql中也是一个语法糖而已,sql执行优化器还是会把他翻译成where条件或者on条件的,此外using使用也是要求连接字段必须在两个表中同名才行。
三、总结natural join 和 using
其实无论是natural join 还是 using在mysql中都不是一个新的东西,他们都会被解析成现有的语法来执行,不使用他们没有丝毫的影响,他们的出现就是为了简化写法而已。