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

  • 相关阅读:
    FFmpeg
    Linux:将mysql数据导入mongodb
    9月2日目标检测学习笔记——总结
    738. 单调递增的数字
    golang map 并发读写 sync.Map 实现原理
    docker删除镜像和容器
    什么是微控制器?
    Matplotlib绘制动图以及绘制平滑曲线
    Win11无法删除文件夹怎么办?Win11无法删除文件夹的解决方法
    Redis
  • 原文地址:https://blog.csdn.net/weixin_72137075/article/details/139722274