一、SQL的LEFT JOIN、RIGHT JOIN、INNER JOIN 之间的区别
LEFT JOIN(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
RIGHT JOIN(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
INNER JOIN(等值连接) 只返回两个表中联结字段相等的行
1、使用 LEFT JOIN 进行表直接关联,查询出来的数据如图一所示:
SELECT
u.id,
u.`name`,
u.age,
u.create_date,
u2.name AS name2,
u2.age AS age2
FROM `user` u
LEFT JOIN user2 u2 ON u2.id = u.id
WHERE
u.is_deleted = 'n'
;

图一
2、使用 RIGHT JOIN 进行表直接关联,查询出来的数据如图二所示:
SELECT
u.id,
u.`name`,
u.age,
u.create_date,
u2.name AS name2,
u2.age AS age2
FROM `user` u
RIGHT JOIN user2 u2 ON u2.id = u.id
WHERE
u.is_deleted = 'n'
;

图二
3、使用 INNER JOIN 进行表直接关联,查询出来的数据如图三所示:
SELECT
u.id,
u.`name`,
u.age,
u.create_date,
u2.name AS name2,
u2.age AS age2
FROM `user` u
INNER JOIN user2 u2 ON u2.id = u.id
WHERE
u.is_deleted = 'n'
;

图三
使用的基础数据库表、表数据如下所示:
-- 用户表
CREATE TABLE user (
id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID, 主键.',
is_deleted varchar(4) DEFAULT NULL COMMENT '是否删除, n否,y是.',
name varchar(100) DEFAULT NULL COMMENT '姓名',
age int(3) DEFAULT NULL COMMENT '年龄',
create_date datetime DEFAULT NULL COMMENT '创建时间',
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1019 DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
-- 用户表2
CREATE TABLE user2 (
id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID, 主键.',
name varchar(100) DEFAULT NULL COMMENT '姓名',
age int(3) DEFAULT NULL COMMENT '年龄',
create_date datetime DEFAULT NULL COMMENT '创建时间',
many_name varchar(200) DEFAULT NULL COMMENT '多个姓名',
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COMMENT='用户表2';
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (1, 'n', '张三三', 28, '2020-04-02 09:54:23');
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (2, 'n', '硫萄萄糖', 27, '2020-01-05 11:20:00');
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (4, 'n', '李四', 25, '2019-10-22 16:27:03');
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (5, 'n', '刘涛', 22, '2020-04-06 08:07:30');
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (6, 'n', '张曼玉', 18, '2020-04-09 17:21:45');
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (7, 'n', '刘德华', 33, '2020-03-18 17:22:07');
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (8, 'n', '刘备', 23, '2020-03-17 17:22:34');
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (1001, 'n', '王小二', 18, '2020-04-06 08:07:30');
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (1005, 'y', '王小二', 18, '2021-06-06 15:14:10');
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (1006, 'n', 'admin', 20, '2020-02-20 16:12:45');
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (1017, 'y', '狗狗33', 2, '2023-01-31 17:19:48');
INSERT INTO user(id, is_deleted, name, age, create_date) VALUES (1018, NULL, '张三66', 5, '2023-01-31 17:19:08');
INSERT INTO user2(id, name, age, create_date, many_name) VALUES (1, '张三', 20, '2020-04-02 09:54:23', '李桃,二狗,王大锤');
INSERT INTO user2(id, name, age, create_date, many_name) VALUES (2, '张三', 20, '2020-01-05 11:20:00', '张三丰,宋曼玉');
INSERT INTO user2(id, name, age, create_date, many_name) VALUES (4, '李四', 25, '2019-10-22 16:27:03', '李四,袁冲,李雪玲');
INSERT INTO user2(id, name, age, create_date, many_name) VALUES (5, '刘涛', 22, '2020-04-06 08:07:30', '二狗,章子怡');
INSERT INTO user2(id, name, age, create_date, many_name) VALUES (6, '张曼玉', 18, '2020-04-09 17:21:45', '李二狗,王小二,李四');
参考文章: INNER JOIN 与 LEFT JOIN 之间的区别

本文介绍了SQL中的三种联接类型——LEFTJOIN、RIGHTJOIN和INNERJOIN,分别展示了它们在查询时如何处理左右表的数据。LEFTJOIN返回左表的所有记录及匹配的右表记录,RIGHTJOIN反之,INNERJOIN只返回两表中联接字段相等的记录。通过具体的查询示例和表数据,清晰地阐述了三者之间的区别。
2167

被折叠的 条评论
为什么被折叠?



