图文详解两个表之间 INNER JOIN, LEFT JOIN, RIGHT JOIN 的使用效果

1 概述

本文以图文的形式详解 INNER JOIN, LEFT JOIN, RIGHT JOIN 在两个表之间有数据关联没有数据关联情况下的使用以及返回结果。

  1. 准备两个有外键关联的表
  2. 在两个表之间有数据关联情况下 INNER JOIN, LEFT JOIN, RIGHT JOIN 的使用以及返回结果
  3. 在两个表之间没有数据关联情况下 INNER JOIN, LEFT JOIN, RIGHT JOIN 的使用以及返回结果

2 准备

t_user 表如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE `t_user` (
`id` int(18) NOT NULL AUTO_INCREMENT COMMENT '流水号',
`name` varchar(25) COLLATE utf8_bin DEFAULT NULL COMMENT '名称',
`age` int(10) DEFAULT NULL COMMENT '年龄',
`sex` char(1) COLLATE utf8_bin DEFAULT NULL COMMENT '性别',
`class_id` int(18) DEFAULT NULL COMMENT '所在班级',
`remarks` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '备注',
`create_date` datetime DEFAULT NULL COMMENT '创建时间',
`create_user` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '创建人',
`update_date` datetime DEFAULT NULL COMMENT '更新时间',
`update_user` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '更新人',
`del_flag` char(1) COLLATE utf8_bin DEFAULT NULL COMMENT '删除标记(0:正常;1:删除)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='用户信息表'

t_class 表如下

1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE `t_class` (
`id` int(18) NOT NULL AUTO_INCREMENT COMMENT '流水号',
`name` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '名称',
`code` varchar(20) COLLATE utf8_bin DEFAULT NULL COMMENT '编码',
`remarks` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '备注',
`create_date` datetime DEFAULT NULL COMMENT '创建时间',
`create_user` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '创建人',
`update_date` datetime DEFAULT NULL COMMENT '更新时间',
`update_user` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '更新人',
`del_flag` char(1) COLLATE utf8_bin DEFAULT NULL COMMENT '删除标记(0:正常;1:删除)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='分类表'
  • 其中 t_user 表中的 class_idt_class 表的主键

2 有数据关联

t_user 表中的数据行可以通过 class_id 字段与 t_class 表中的数据关联起来

  • t_user 表数据如下

t_user

  • t_class 表数据如下

t_class

2.1 INNER JOIN

1
select * from t_user u inner join t_class c on u.`class_id` = c.`id`;

结果返回的有外键关联的数据,具体如下

INNER JOIN

2.2 LEFT JOIN

1
SELECT * FROM t_user u LEFT JOIN t_class c ON u.`class_id` = c.`id`;

结果返回 t_user 表中全部的数据,对应没有关联数据的 t_class 中的行和列字段全部为空,具体如下

LEFT JOIN

2.3 RIGHT JOIN

1
SELECT * FROM t_user u RIGHT JOIN t_class c ON u.`class_id` = c.`id`;

结果返回 t_class 表中全部的数据,对应没有关联数据的 t_user 中的行和列字段全部为空,具体如下

RIGHT JOIN

3 无数据关联

  • t_user 表数据如下

t_user

  • t_class 表数据如下

t_class

3.1 INNER JOIN

1
select * from t_user u inner join t_class c on u.`class_id` = c.`id`;

结果返回的数据为空,具体如下

INNER JOIN

3.2 LEFT JOIN

1
SELECT * FROM t_user u LEFT JOIN t_class c ON u.`class_id` = c.`id`;

结果返回 t_user 表中全部的数据,对应 t_class 中的行和列字段全部为空,具体如下

LEFT JOIN

3.3 RIGHT JOIN

1
SELECT * FROM t_user u RIGHT JOIN t_class c ON u.`class_id` = c.`id`;

结果返回 t_class 表中全部的数据,对应 t_user 中的行和列字段全部为空,具体如下

RIGHT JOIN

Buy me a cup of coffee