| select * from table1 inner join table2 using(customer_id); |
在实际编写sql语句时,我们都可以省略掉INNER关键字,例如:
| select * from table1 join table2 on table1.customer_id=table2.customer_id; |
但是,请记住,这还是INNER JOIN。
OUTER JOIN联接(外联接)
哦,记得有一次参加面试,还问我这个问题来着,那在这里再好好的总结一下。通过OUTER JOIN,我们可以按照一些过滤条件来匹配表之间的数据。OUTER JOIN的结果集等于INNER JOIN的结果集加上外部行;也就是说,在使用OUTER JOIN时,SQL逻辑查询语句执行的前三步,都会执行一遍。关于如何添加外部行,请参考《SQL逻辑查询语句执行顺序》这篇文章中的添加外部行部分内容。
MySQL数据库支持LEFT OUTER JOIN和RIGHT OUTER JOIN,与INNER关键字一样,我们可以省略OUTER关键字。对于OUTER JOIN,同样的也可以使用USING来简化ON子句。所以,对于以下sql语句:
| select * from table1 left outer join table2 on table1.customer_id=table2.customer_id; |
我们可以简写成这样:
| select * from table1 left join table2 using(customer_id); |
但是,与INNER JOIN还有一点区别是,对于OUTER JOIN,必须指定ON(或者using)子句,否则MySQL数据库会抛出异常。
NATURAL JOIN联接(自然连接)
NATURAL JOIN等同于INNER(OUTER) JOIN与USING的组合,它隐含的作用是将两个表中具有相同名称的列进行匹配。同样的,NATURAL LEFT(RIGHT) JOIN等同于LEFT(RIGHT) JOIN与USING的组合。比如:
| select * from table1 join table2 using(customer_id); |
与
| select * from table1 natural join table2; |
等价。
在比如:
| select * from table1 left join table2 using(customer_id); |
与
| select * from table1 natural left join table2; |
等价。
STRAIGHT_JOIN联接
STRAIGHT_JOIN并不是一个新的联接类型,而是用户对sql优化器的控制,其等同于JOIN。通过STRAIGHT_JOIN,MySQL数据库会强制先读取左边的表。举个例子来说,比如以下sql语句:
| explain select * from table1 join table2 on table1.customer_id=table2.customer_id; |
它的主要输出部分如下:
| +----+-------------+--------+------+---------------+ | id | select_type | table | type | possible_keys | +----+-------------+--------+------+---------------+ | 1 | SIMPLE | table2 | ALL | NULL | | 1 | SIMPLE | table1 | ALL | PRIMARY | +----+-------------+--------+------+---------------+ |
我们可以很清楚的看到,MySQL是先选择的table2表,然后再进行的匹配。如果我们指定STRAIGHT_JOIN方式,例如:










