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

相关推荐

  1. MySQL Joins 学习笔记

    2024-06-17 12:06:10       55 阅读
  2. mysql 表连接 JOIN、LEFT JOIN、RIGHT JOIN

    2024-06-17 12:06:10       28 阅读
  3. MySQL中的JOIN、LEFT JOIN、RIGHT JOIN讲解

    2024-06-17 12:06:10       24 阅读
  4. MySQL left join、right join以及inner join的区别 ?

    2024-06-17 12:06:10       25 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-17 12:06:10       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-17 12:06:10       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-17 12:06:10       87 阅读
  4. Python语言-面向对象

    2024-06-17 12:06:10       96 阅读

热门阅读

  1. vue前端-静态资源下载小坑记录

    2024-06-17 12:06:10       36 阅读
  2. QComboBox使用详解(Qt)

    2024-06-17 12:06:10       31 阅读
  3. 小程序wx:if 和hidden的区别?

    2024-06-17 12:06:10       31 阅读
  4. R语言自定义vlookup函数

    2024-06-17 12:06:10       28 阅读
  5. Spark 面试题(六)

    2024-06-17 12:06:10       29 阅读
  6. Android 自定义SeekBar显示进度百分比

    2024-06-17 12:06:10       28 阅读
  7. 图片Base64编码

    2024-06-17 12:06:10       36 阅读
  8. ElasticSearch(ES)

    2024-06-17 12:06:10       28 阅读