当前位置: 首页 > news >正文

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

http://www.lryc.cn/news/373890.html

相关文章:

  • 【Android面试八股文】Android中操作多线程的方式有哪些?
  • 语义分割和目标检测的关系
  • SpringBoot 大文件基于md5实现分片上传、断点续传、秒传
  • 数据资产治理与数据质量提升:构建完善的数据治理体系,确保数据资产的高质量与准确性
  • SylixOS下UDP组播测试程序
  • Web前端快速开发平台:革命性工具,提升开发效率的新篇章
  • 内窥镜系统设计简介
  • 使用Spring Boot实现Redis多数据库缓存
  • 揭秘newSingleThreadExecutor:深度解析与源码探秘
  • 使用python绘制三维散点图
  • Vue51-插件
  • python将一个整数转为字符串列表
  • PTA 6 - 20 汉诺塔问题(py 递归)
  • 深度学习Day-20:DenseNet算法实战 乳腺癌识别
  • 给类设置serialVersionUID
  • Android之实现两段颜色样式不同的文字拼接进行富文本方式的显示
  • GenICam标准(五)
  • 《人生海海》读后感
  • SpringBoot自定义Starter及原理分析
  • YOLOv10网络架构及特点
  • 基于单片机的多功能智能小车设计
  • Python时间序列分析库
  • 算法设计与分析 实验1 算法性能分析
  • FPGA NET
  • 把服务器上的镜像传到到公司内部私有harbor上,提高下载速度
  • 1055 集体照(测试点3, 4, 5)
  • AI 定位!GeoSpyAI上传一张图片分析具体位置 不可思议! ! !
  • 中国最著名的起名大师颜廷利:父亲节与之相关的真实含义
  • 【每日刷题】Day66
  • 工资信息管理系统的设计