MySQL中关于JOIN的用法全解
一、一张图看懂 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的用法全解相关推荐
- android json mysql_Android通过json向MySQL中读写数据的方法详解【读取篇】
本文实例讲述了Android通过json向MySQL中读取数据的方法.分享给大家供大家参考,具体如下: 首先 要定义几个解析json的方法parseJsonMulti,代码如下: private vo ...
- mysql的join语句使用_在MySQL中使用JOIN语句进行连接操作的详细教程
到目前,我们已经学习了从一个表中获取数据.这是简单的需要,但在大多数现实MySQL的使用,经常需要将数据从多个表中的一个单一的查询. 可以使用多个表中的单一SQL查询.在MySQL中联接(join)行 ...
- MySQL中ESCAPE关键字的用法详解
MySQL中ESCAPE关键字的用法详解 MySQL中ESCAPE关键字的用法详解 1. mysql转义概述 2. escape验证 MySQL中ESCAPE关键字的用法详解 1. mysql转义概述 ...
- MySQL中Left Join用法
MySQL中Left Join用法 例子: user表: id name --------- 1 libk 2 zyfon 3 daodao user_action表: user_i ...
- mysql中使用join exists in时该注意的问题
2019独角兽企业重金招聘Python工程师标准>>> 这是个老生常谈的问题,平时在简单使用过程中,都能得到想要的结果,但是对于各自的性能,以及适用场景,我们该注意什么?假如现在有表 ...
- android json mysql_Android通过json向MySQL中读写数据的方法详解【写入篇】
本文实例讲述了Android通过json向MySQL中写入数据的方法.,具体如下: 先说一下如何通过json将Android程序中的数据上传到MySQL中: 首先定义一个类JSONParser.Jav ...
- Mysql中的IFNULL函数的详解(嵌套查询等重点)如果第一个为空就执行第二个
https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 目录 一.概念 二 ...
- MySQL中的char与varchar详解
mysql中char与varchar的区别 char:定长,效率高,一般用于固定长度的表单提交数据存储 :例如:身份证号,手机号,电话,密码等 varchar:不定长,效率偏低 1.v ...
- mysql中utf8和utf8mb4的详解用法与区别
一.简介 MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode.好在utf8mb4是utf8的超集,除了将编码改为ut ...
最新文章
- 查看防火墙状态_干货 | 华为防火墙配置,这篇文章强烈推荐收藏学习
- KubeCon 2019 北美会议完美落幕| 云原生生态周报 Vol. 29
- java json 解析null_解析包含null的原始json数组
- opencv连续读图
- 微型计算机实验报告温度控制,单片机、可编程控制器实验教学大纲.doc
- 运行时错误7内存溢出_C++程序运行时的内存模型
- mysql存储过程实例实现查询_Mybatis应用mysql存储过程查询数据实例
- 拓端tecdat|R语言用回归构建配对交易(Pairs Trading)策略量化模型分析股票收益和价格
- 《Unix环境高级编程》学习之Unix标准
- Mysql官网下载教程
- 高速PCB设计中的屏蔽方法
- CAN总线负载率原理及计算
- 论文笔记-LIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping
- 2015年-读书笔记
- python背单词代码实现
- V4L2框架-media device
- 彻底关闭Windows DefenderWindows 更新
- 高速公路计算机网络安全,计算机网络安全技术在高速公路收费网络的应用
- 日赚1.7亿!华为发布2020年度财报!附华为十大5G应用场景
- 阿星 centos7卸载mysql并且通过yum安装mysql