MySql 各种 join

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 不支持全外连接。

小结

  joininner 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),其中,具体结果有兴趣的可以自行研究。

  • 31
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值