首页 > 数据库 >MySQl中关于JOIN的用法全解

MySQl中关于JOIN的用法全解

时间:2022-10-17 10:55:07浏览次数:51  
标签:JOIN student class forlan -----------+ MySQl 全解 id

一、一张图看懂 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)

标签:JOIN,student,class,forlan,-----------+,MySQl,全解,id
From: https://www.cnblogs.com/huozhonghun/p/16798421.html

相关文章

  • MySql必知必会
    MySql必知必会初始化数据库创建数据库CREATEDATABASEcrashcourse;创建表#########################################MySQLCrashCourse#http://www.forta.com......
  • MySQL维护之如何查看执行计划
    实际上在MySQL索引原理之索引分析-池塘里洗澡的鸭子-博客园(cnblogs.com)中已经使用到查看执行计划的命令explain,也进行了各列选项的解释。本文进行补充同时介绍......
  • Mysql数据库巡检(二)
    Mysql数据库巡检(二)1.查看数据库版本mysql>selectversion();2.数据库端口mysql>showglobalvariableslike'port';![img](file:///C:\Users\Administrator\App......
  • MySQL单表访问方法
    参考:MySQL是怎样运行的:从根儿上理解MySQL一:前期准备1.创建测试表CREATETABLEsingle_table(idINTNOTNULLAUTO_INCREMENT,key1VARCHAR(100),key2INT,key3V......
  • MySQL目录结构与SQL基本概念
    MySQL目录结构1.MySQL安装目录配置文件my.ini1、bin目录用于放置一些可执行文件,如mysql.exe、mysqld.exe、mysqlshow.exe等。2、data目录用于放置一些日志文件......
  • mysql数据操作
    1.增insertinto表名(列名,列名)vlues(值,值),(值,值),(值,值),(值,值);2.删deletefrom表名;deletefrom表名where条件;deletefromtb7;deletefromtb7wh......
  • MySQL服务启动和关闭与MySQL登录和退出
     MySQL服务启动和关闭+                netstopMySQL80:启动mysql服务 netstart MySQL80:关闭mysql服务    ......
  • docker安装tomcat、mysql、redis
    一、tomcat1.下载tomcat8dockerpulltomcat:8.5.612.启动容器(-d后台启动)dockerrun-d-p8080:8080tomcat:8.5.61 3.访问首页http://ip:8080/访问不到......
  • sqlalchemy.exc.noforeignkeyserror: could not determine join condition between pa
    错误提示:sqlalchemy.exc.noforeignkeyserror:couldnotdeterminejoinconditionbetweenparent/childtablesonrelationshipwife.wife-therearenoforeignkey......
  • mysql安装教程-window操作系统
    1、下载安装包(官网下载)直达链接:https://dev.mysql.com/downloads/mysql/       下载后放到指定目录下解压即可(给电脑新手忠告:注意不要放在C盘,养成好习惯......