一、一张图看懂 MySQL 的各种 JOIN 用法

二、准备表和数据,测试

1、创建两个表测试

CREATE TABLE `forlan_class`(`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',`class_name` varchar(200) DEFAULT NULL COMMENT '班级名称',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='班级信息表';CREATE TABLE `forlan_student`(`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',`student_name` varchar(200) DEFAULT NULL COMMENT '学生名称',`class_type` bigint(20) NOT NULL DEFAULT -1 COMMENT '班级类型',PRIMARY KEY (`id`) USING BTREE,KEY `idx_class`(`class_type`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMMENT='学生信息表';

2、插入forlan_class数据

±—±-----------+
| id | class_name |
±—±-----------+
| 1 | 初级班 |
| 2 | 中级班 |
| 3 | 高级班 |
| 4 | 大师班 |
| 5 | 成神班 |
| 6 | 神仙班 |
±—±-----------+

3、插入forlan_student数据

±—±-------------±-----------+
| id | student_name | class_type |
±—±-------------±-----------+
| 1 | 小伟 | 1 |
| 2 | 大伟 | 5 |
| 3 | 小明 | 2 |
| 4 | 小红 | 3 |
| 5 | 小白 | 4 |
| 6 | 小黑 | 4 |
| 7 | 小燕 | 2 |
| 8 | 黑化 | 100 |
±—±-------------±-----------+

三、常用类型

1、内连接


四种方式:INNER JOIN、JOIN、WHERE、STRAIGHT_JOIN

SELECT * FROM forlan_student A INNER JOIN forlan_class B ON A.class_type=B.id;
SELECT * FROM forlan_student A JOIN forlan_class B ON A.class_type=B.id;
SELECT * FROM forlan_student A,forlan_class B WHERE A.class_type=B.id;
SELECT * FROM forlan_student A STRAIGHT_JOIN forlan_class B ON A.class_type=B.id;

±—±-------------±-----------±—±-----------+
| id | student_name | class_type | id | class_name |
±—±-------------±-----------±—±-----------+
| 1 | 小伟 | 1 | 1 | 初级班 |
| 3 | 小明 | 2 | 2 | 中级班 |
| 7 | 小燕 | 2 | 2 | 中级班 |
| 4 | 小红 | 3 | 3 | 高级班 |
| 5 | 小白 | 4 | 4 | 大师班 |
| 6 | 小黑 | 4 | 4 | 大师班 |
| 2 | 大伟 | 5 | 5 | 成神班 |
±—±-------------±-----------±—±-----------+
7 rows in set (0.08 sec)

2、左连接:Left JOIN

SELECT * FROM forlan_student A LEFT JOIN forlan_class B ON A.class_type=B.id;

±—±-------------±-----------±-----±-----------+
| id | student_name | class_type | id | class_name |
±—±-------------±-----------±-----±-----------+
| 1 | 小伟 | 1 | 1 | 初级班 |
| 3 | 小明 | 2 | 2 | 中级班 |
| 7 | 小燕 | 2 | 2 | 中级班 |
| 4 | 小红 | 3 | 3 | 高级班 |
| 5 | 小白 | 4 | 4 | 大师班 |
| 6 | 小黑 | 4 | 4 | 大师班 |
| 2 | 大伟 | 5 | 5 | 成神班 |
| 8 | 黑化 | 100 | NULL | NULL |
±—±-------------±-----------±-----±-----------+
8 rows in set (0.04 sec)

3、右连接:Right JOIN

SELECT * FROM forlan_student A RIGHT JOIN forlan_class B ON A.class_type=B.id;

±-----±-------------±-----------±—±-----------+
| id | student_name | class_type | id | class_name |
±-----±-------------±-----------±—±-----------+
| 1 | 小伟 | 1 | 1 | 初级班 |
| 3 | 小明 | 2 | 2 | 中级班 |
| 7 | 小燕 | 2 | 2 | 中级班 |
| 4 | 小红 | 3 | 3 | 高级班 |
| 5 | 小白 | 4 | 4 | 大师班 |
| 6 | 小黑 | 4 | 4 | 大师班 |
| 2 | 大伟 | 5 | 5 | 成神班 |
| NULL | NULL | NULL | 6 | 神仙班 |
±-----±-------------±-----------±—±-----------+
8 rows in set (0.04 sec)

4、外连接


Mysql不支持Outer JOIN,有些地方叫Full JOIN

SELECT * FROM forlan_student A Full JOIN forlan_class B ON A.class_type=B.id WHERE A.Key IS NULL OR B.Key IS NULL;

采用(A LEFT JOIN B)UNION(A RIGHT JOIN B)
如果是3张以上表,以此类推
(A LEFT JOIN B LEFT JOIN C)UNION(A LEFT JOIN B RIGHT JOIN C)UNION(A RIGHT JOIN B RIGHT JOIN C)
说明:没有all关键字,mysql会在查询的时候给临时表加上distinct的关键字

SELECT * FROM forlan_student A LEFT JOIN forlan_class B ON A.class_type=B.id
UNION
SELECT * FROM forlan_student A RIGHT JOIN forlan_class B ON A.class_type=B.id;

±-----±-------------±-----------±-----±-----------+
| id | student_name | class_type | id | class_name |
±-----±-------------±-----------±-----±-----------+
| 1 | 小伟 | 1 | 1 | 初级班 |
| 3 | 小明 | 2 | 2 | 中级班 |
| 7 | 小燕 | 2 | 2 | 中级班 |
| 4 | 小红 | 3 | 3 | 高级班 |
| 5 | 小白 | 4 | 4 | 大师班 |
| 6 | 小黑 | 4 | 4 | 大师班 |
| 2 | 大伟 | 5 | 5 | 成神班 |
| 8 | 黑化 | 100 | NULL | NULL |
| NULL | NULL | NULL | 6 | 神仙班 |
±-----±-------------±-----------±-----±-----------+
9 rows in set (0.13 sec)

5、左连接-内连接

SELECT * FROM forlan_student A LEFT JOIN forlan_class B ON A.class_type=B.id WHERE B.id IS NULL;

±—±-------------±-----------±-----±-----------+
| id | student_name | class_type | id | class_name |
±—±-------------±-----------±-----±-----------+
| 8 | 黑化 | 100 | NULL | NULL |
±—±-------------±-----------±-----±-----------+
1 row in set (0.07 sec)

6、右连接-内连接

SELECT * FROM forlan_student A RIGHT JOIN forlan_class B ON A.class_type=B.id WHERE A.id IS NULL;

±-----±-------------±-----------±—±-----------+
| id | student_name | class_type | id | class_name |
±-----±-------------±-----------±—±-----------+
| NULL | NULL | NULL | 6 | 神仙班 |
±-----±-------------±-----------±—±-----------+
1 row in set (0.06 sec)

7、外连接-内连接

SELECT * FROM forlan_student A LEFT JOIN forlan_class B ON A.class_type=B.id WHERE B.id IS NULL
UNION
SELECT * FROM forlan_student A RIGHT JOIN forlan_class B ON A.class_type=B.id WHERE A.id IS NULL;

±-----±-------------±-----------±-----±-----------+
| id | student_name | class_type | id | class_name |
±-----±-------------±-----------±-----±-----------+
| 8 | 黑化 | 100 | NULL | NULL |
| NULL | NULL | NULL | 6 | 神仙班 |
±-----±-------------±-----------±-----±-----------+
2 rows in set (0.11 sec)

四、拓展

1、迪卡尔积:CROSS JOIN

将A,B表的每一条记录拼在一起,如果A表有8条记录,B表有6条记录,笛卡尔积产生的结果就有8*6条记录

SELECT * FROM forlan_student CROSS JOIN forlan_class;
SELECT * FROM forlan_student,forlan_class;
SELECT * FROM forlan_student INNER JOIN forlan_class;
SELECT * FROM forlan_student NATURE JOIN forlan_class;
SELECT * FROM forlan_student NATURA JOIN forlan_class;

±—±-------------±-----------±—±-----------+
| id | student_name | class_type | id | class_name |
±—±-------------±-----------±—±-----------+
| 1 | 小伟 | 1 | 1 | 初级班 |
| 1 | 小伟 | 1 | 2 | 中级班 |
| 1 | 小伟 | 1 | 3 | 高级班 |
| 1 | 小伟 | 1 | 4 | 大师班 |
| 1 | 小伟 | 1 | 5 | 成神班 |
| 1 | 小伟 | 1 | 6 | 神仙班 |
| 2 | 大伟 | 5 | 1 | 初级班 |
| 2 | 大伟 | 5 | 2 | 中级班 |
| 2 | 大伟 | 5 | 3 | 高级班 |
| 2 | 大伟 | 5 | 4 | 大师班 |
| 2 | 大伟 | 5 | 5 | 成神班 |
| 2 | 大伟 | 5 | 6 | 神仙班 |
| 3 | 小明 | 2 | 1 | 初级班 |
| 3 | 小明 | 2 | 2 | 中级班 |
| 3 | 小明 | 2 | 3 | 高级班 |
| 3 | 小明 | 2 | 4 | 大师班 |
| 3 | 小明 | 2 | 5 | 成神班 |
| 3 | 小明 | 2 | 6 | 神仙班 |
| 4 | 小红 | 3 | 1 | 初级班 |
| 4 | 小红 | 3 | 2 | 中级班 |
| 4 | 小红 | 3 | 3 | 高级班 |
| 4 | 小红 | 3 | 4 | 大师班 |
| 4 | 小红 | 3 | 5 | 成神班 |
| 4 | 小红 | 3 | 6 | 神仙班 |
| 5 | 小白 | 4 | 1 | 初级班 |
| 5 | 小白 | 4 | 2 | 中级班 |
| 5 | 小白 | 4 | 3 | 高级班 |
| 5 | 小白 | 4 | 4 | 大师班 |
| 5 | 小白 | 4 | 5 | 成神班 |
| 5 | 小白 | 4 | 6 | 神仙班 |
| 6 | 小黑 | 4 | 1 | 初级班 |
| 6 | 小黑 | 4 | 2 | 中级班 |
| 6 | 小黑 | 4 | 3 | 高级班 |
| 6 | 小黑 | 4 | 4 | 大师班 |
| 6 | 小黑 | 4 | 5 | 成神班 |
| 6 | 小黑 | 4 | 6 | 神仙班 |
| 7 | 小燕 | 2 | 1 | 初级班 |
| 7 | 小燕 | 2 | 2 | 中级班 |
| 7 | 小燕 | 2 | 3 | 高级班 |
| 7 | 小燕 | 2 | 4 | 大师班 |
| 7 | 小燕 | 2 | 5 | 成神班 |
| 7 | 小燕 | 2 | 6 | 神仙班 |
| 8 | 黑化 | 100 | 1 | 初级班 |
| 8 | 黑化 | 100 | 2 | 中级班 |
| 8 | 黑化 | 100 | 3 | 高级班 |
| 8 | 黑化 | 100 | 4 | 大师班 |
| 8 | 黑化 | 100 | 5 | 成神班 |
| 8 | 黑化 | 100 | 6 | 神仙班 |
±—±-------------±-----------±—±-----------+
48 rows in set (0.08 sec)

2、自然链接:NATURAL JOIN

自然连接就是USING子句的简化版,找出两个表中相同的列作为连接条件进行连接

SELECT * FROM forlan_student NATURAL JOIN forlan_class;

±—±-------------±-----------±-----------+
| id | student_name | class_type | class_name |
±—±-------------±-----------±-----------+
| 1 | 小伟 | 1 | 初级班 |
| 2 | 大伟 | 5 | 中级班 |
| 3 | 小明 | 2 | 高级班 |
| 4 | 小红 | 3 | 大师班 |
| 5 | 小白 | 4 | 成神班 |
| 6 | 小黑 | 4 | 神仙班 |
±—±-------------±-----------±-----------+
6 rows in set (0.10 sec)

MySQL中关于JOIN的用法全解相关推荐

  1. android json mysql_Android通过json向MySQL中读写数据的方法详解【读取篇】

    本文实例讲述了Android通过json向MySQL中读取数据的方法.分享给大家供大家参考,具体如下: 首先 要定义几个解析json的方法parseJsonMulti,代码如下: private vo ...

  2. mysql的join语句使用_在MySQL中使用JOIN语句进行连接操作的详细教程

    到目前,我们已经学习了从一个表中获取数据.这是简单的需要,但在大多数现实MySQL的使用,经常需要将数据从多个表中的一个单一的查询. 可以使用多个表中的单一SQL查询.在MySQL中联接(join)行 ...

  3. MySQL中ESCAPE关键字的用法详解

    MySQL中ESCAPE关键字的用法详解 MySQL中ESCAPE关键字的用法详解 1. mysql转义概述 2. escape验证 MySQL中ESCAPE关键字的用法详解 1. mysql转义概述 ...

  4. MySQL中Left Join用法

    MySQL中Left Join用法  例子:  user表:  id name  ---------  1 libk  2 zyfon  3 daodao  user_action表:  user_i ...

  5. mysql中使用join exists in时该注意的问题

    2019独角兽企业重金招聘Python工程师标准>>> 这是个老生常谈的问题,平时在简单使用过程中,都能得到想要的结果,但是对于各自的性能,以及适用场景,我们该注意什么?假如现在有表 ...

  6. android json mysql_Android通过json向MySQL中读写数据的方法详解【写入篇】

    本文实例讲述了Android通过json向MySQL中写入数据的方法.,具体如下: 先说一下如何通过json将Android程序中的数据上传到MySQL中: 首先定义一个类JSONParser.Jav ...

  7. Mysql中的IFNULL函数的详解(嵌套查询等重点)如果第一个为空就执行第二个

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 目录 一.概念 二 ...

  8. MySQL中的char与varchar详解

    mysql中char与varchar的区别 char:定长,效率高,一般用于固定长度的表单提交数据存储 :例如:身份证号,手机号,电话,密码等         varchar:不定长,效率偏低 1.v ...

  9. mysql中utf8和utf8mb4的详解用法与区别

    一.简介 MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode.好在utf8mb4是utf8的超集,除了将编码改为ut ...

最新文章

  1. 查看防火墙状态_干货 | 华为防火墙配置,这篇文章强烈推荐收藏学习
  2. KubeCon 2019 北美会议完美落幕| 云原生生态周报 Vol. 29
  3. java json 解析null_解析包含null的原始json数组
  4. opencv连续读图
  5. 微型计算机实验报告温度控制,单片机、可编程控制器实验教学大纲.doc
  6. 运行时错误7内存溢出_C++程序运行时的内存模型
  7. mysql存储过程实例实现查询_Mybatis应用mysql存储过程查询数据实例
  8. 拓端tecdat|R语言用回归构建配对交易(Pairs Trading)策略量化模型分析股票收益和价格
  9. 《Unix环境高级编程》学习之Unix标准
  10. Mysql官网下载教程
  11. 高速PCB设计中的屏蔽方法
  12. CAN总线负载率原理及计算
  13. 论文笔记-LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping
  14. 2015年-读书笔记
  15. python背单词代码实现
  16. V4L2框架-media device
  17. 彻底关闭Windows DefenderWindows 更新
  18. 高速公路计算机网络安全,计算机网络安全技术在高速公路收费网络的应用
  19. 日赚1.7亿!华为发布2020年度财报!附华为十大5G应用场景
  20. 阿星 centos7卸载mysql并且通过yum安装mysql

热门文章

  1. 想学游戏建模要从哪里开始?列出这些工作量,7年建模师想转行了!
  2. 技术博客|第16期:个性化视频搜索引擎:排序篇(上)
  3. John密码破解工具
  4. 做IT精英还是IT民工?
  5. python数据分析就业前景_数据分析师找工作的秘诀,从读懂招聘 JD 开始
  6. AS01 AS02资产屏幕开发实例
  7. 违禁词过滤器 DFA算法升级版
  8. 用思科模拟器实现三层交换机下不同VLAN之间的通信
  9. 【图】2345看图王
  10. docker push 到私服问题 : Retrying in 5 seconds