MySQL的7种JOIN表连接结果集,你了解几个?搞懂仅需1张图

目录

实践

第一种  

第二种 

第三种 

第四种 

第五种 

第六种 

第七种 


大家好呀!我是爷爷的茶七里香,周末啦~开森~,今天突然想起曾经面试遇到的MySQL题目,记录下来方便查阅!!!

 MySQL的7种表连接结果集

实践

我相信各位小伙伴通过上面的图已经明白了,接下来为了加深印象,让我们实践一下吧!

用户表:

-- 建表
CREATE TABLE `sys_user` (
  `user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `user_name` varchar(30) NOT NULL COMMENT '用户账号',
  `nick_name` varchar(30) NOT NULL COMMENT '用户昵称',
  `dept_id` bigint(20) DEFAULT NULL COMMENT '部门ID',
  PRIMARY KEY (`user_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='用户信息表';

-- 插入数据
INSERT INTO `yy`.`sys_user`(`user_id`, `user_name`, `nick_name`, `dept_id`) VALUES (1, '管理员', 'admin', 10);
INSERT INTO `yy`.`sys_user`(`user_id`, `user_name`, `nick_name`, `dept_id`) VALUES (2, '张三', 'zs', 10);
INSERT INTO `yy`.`sys_user`(`user_id`, `user_name`, `nick_name`, `dept_id`) VALUES (3, '李四', 'ls', 11);
INSERT INTO `yy`.`sys_user`(`user_id`, `user_name`, `nick_name`, `dept_id`) VALUES (4, '王五', 'ww', 10);
INSERT INTO `yy`.`sys_user`(`user_id`, `user_name`, `nick_name`, `dept_id`) VALUES (5, '老六', 'll', 11);
INSERT INTO `yy`.`sys_user`(`user_id`, `user_name`, `nick_name`, `dept_id`) VALUES (6, '小七', 'xq', NULL);

部门表:

-- 建表
CREATE TABLE `sys_dept` (
  `dept_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '部门id',
  `parent_id` bigint(20) DEFAULT '0' COMMENT '父部门id',
  `dept_name` varchar(30) DEFAULT '' COMMENT '部门名称',
  PRIMARY KEY (`dept_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=126 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='部门表';

-- 插入数据
INSERT INTO `yy`.`sys_dept`(`dept_id`, `parent_id`, `dept_name`) VALUES (10, 0, '法外狂徒部');
INSERT INTO `yy`.`sys_dept`(`dept_id`, `parent_id`, `dept_name`) VALUES (11, 0, '伏地魔部');
INSERT INTO `yy`.`sys_dept`(`dept_id`, `parent_id`, `dept_name`) VALUES (12, 0, '测试部');

第一种  

SQL语句:

SELECT
	* 
FROM
	sys_user u
	LEFT JOIN sys_dept d ON u.dept_id = d.dept_id;

 结果:

 LEFT JOIN是以左表为主,不管有没有匹配到右表的数据都要显示左边的数据,可能有小伙伴不知道哪个是左表哪个是右表,SQL语句中写在LEFT JOIN左边的表是左表写在右边的那自然就是右表啦!!!

第二种 

SQL语句:

SELECT
	* 
FROM
	sys_user u
	LEFT JOIN sys_dept d ON u.dept_id = d.dept_id 
WHERE
	d.dept_id IS NULL;

结果:

 在原先的基础上多加了WHERE d.dept_id IS NULL的条件,这个条件筛选出sys_user表中dept_id字段为空的数据,结果集中不包含和sys_dept表对应的数据

第三种 

  

SQL语句:

SELECT
	* 
FROM
	sys_user u
	RIGHT JOIN sys_dept d ON u.dept_id = d.dept_id;

结果:

这个结果集和LEFT JOIN的恰恰相反,只是主体换了而已

第四种 

SQL语句: 

SELECT
	* 
FROM
	sys_user u
	RIGHT JOIN sys_dept d ON u.dept_id = d.dept_id 
WHERE
	u.dept_id IS NULL;

结果:

结果集和上述第二种中的结果集是相反的,可以往上翻进行对比哦!!! 

第五种 

SQL语句:

SELECT
	* 
FROM
	sys_user u
	LEFT JOIN sys_dept d ON u.dept_id = d.dept_id UNION
SELECT
	* 
FROM
	sys_user u
	RIGHT JOIN sys_dept d ON u.dept_id = d.dept_id;

结果:

该结果集只是使用UNION关键字将上述第一种和第三种的结果集进行了拼接,那么有的小伙伴就要问了,既然是拼接那么为什么没有重复的数据,这是因为UNION给我们去除了重复的数据了,如果你想看重复的数据就要使用UNION ALL关键字,如下:

  

第六种 

SQL语句:

SELECT
	* 
FROM
	sys_user u
	LEFT JOIN sys_dept d ON u.dept_id = d.dept_id 
WHERE
	d.dept_id IS NULL UNION
SELECT
	* 
FROM
	sys_user u
	RIGHT JOIN sys_dept d ON u.dept_id = d.dept_id 
WHERE
	u.dept_id IS NULL;

 结果:

 

 这个结果集也是使用了UNION关键字将上述第二种和第四种结果进行了拼接去重

第七种 

SQL语句:

SELECT
	* 
FROM
	sys_user u
	INNER JOIN sys_dept d ON u.dept_id = d.dept_id;

结果:

 除了上面这种写法,还有一种写法是用逗号代替,如:

SELECT
	* 
FROM
	sys_user u,sys_dept d WHERE u.dept_id = d.dept_id;

 结果:

 发现结果集是一样的,别看两条语句写法差很大,但是它们是等价的

今天就到这里啦~对你有帮助的话不妨留个赞呗!

 🥇原创不易,还希望各位大佬支持一下!

👍点赞,你的认可是我创作的动力 !

🌟收藏,你的青睐是我努力的方向!

✏️评论,你的意见是我进步的财富! 

  • 37
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 45
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 45
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦境游子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值