MySql 定义了很多
join
的方式,接下来我们用一个例子来讲解。
用到的表
本文用到了两个表s1
,s2
:
内外连接
测试
1
1
1.select * from s1 inner join s2 on(s1.id = s2.id);
:
+----+----+
| id | id |
+----+----+
| 3 | 3 |
| 4 | 4 |
+----+----+
2
2
2.select * from s1 join s2 on(s1.id = s2.id);
+----+----+
| id | id |
+----+----+
| 3 | 3 |
| 4 | 4 |
+----+----+
3
3
3.select * from s1 left outer join s2 on(s1.id = s2.id);
+----+------+
| id | id |
+----+------+
| 1 | NULL |
| 2 | NULL |
| 3 | 3 |
| 4 | 4 |
+----+------+
4
4
4.select * from s1 right outer join s2 on(s1.id = s2.id);
+------+----+
| id | id |
+------+----+
| 3 | 3 |
| 4 | 4 |
| NULL | 5 |
| NULL | 6 |
+------+----+
5
5
5.select * from s1 outer join s2 on(s1.id = s2.id);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'outer join s2 on(s1.id = s2.id)' at line 1
说明 MySql 不支持全外连接。
小结
join
和inner join
都指的是内连接;outer join
外连接必须搭配left
或者right
变成左/右外连接,没有单独的outer join
。
自然连接和笛卡尔积
有时候我们也可以不用on(s1.id = s2.id)
,看看会发生什么。
笛卡尔积
1
1
1.select * from s1 inner join s2;
和select * from s1 join s2;
+----+----+
| id | id |
+----+----+
| 4 | 3 |
| 3 | 3 |
| 2 | 3 |
| 1 | 3 |
| 4 | 4 |
| 3 | 4 |
| 2 | 4 |
| 1 | 4 |
| 4 | 5 |
| 3 | 5 |
| 2 | 5 |
| 1 | 5 |
| 4 | 6 |
| 3 | 6 |
| 2 | 6 |
| 1 | 6 |
+----+----+
这两种加上了on(s1.id = s2.id)
是内连接,不加上的话是笛卡尔积。
2
2
2.select * from s1 left outer join s2;
,select * from s1 right outer join s2;
和select * from s1 outer join s2;
这三种情况会报错。
自然连接
MySql 提供了自然连接的join
语句,它和内连接的区别就是去除了重复属性列。
1
1
1.select * from s1 natural join s2;
+----+
| id |
+----+
| 3 |
| 4 |
+----+
注意:这里natural
一旦拼错,就相当于没写,从而变成上面的笛卡尔积。
2
2
2.select * from s1 [innner] join s2 using(id);
中括号里的inner
可省可不省。using(id)
表示根据两张表共有的属性列id
进行连接。
+----+
| id |
+----+
| 3 |
| 4 |
+----+
外连接也能用
using(id)
,其中,具体结果有兴趣的可以自行研究。