【Mysql】图解左、右、内与全连接

一、前言

使用学生表与成绩表来演示Mysql中的各种连接查找

学生表的建表语句如下:

CREATE TABLE student(
  id int(11) NOT NULL AUTO_INCREMENT COMMENT '自增序号',
  st_id int(11) DEFAULT NULL COMMENT '学生id',
  st_name varchar(255) DEFAULT NULL COMMENT '学生姓名',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB;

成绩表的建表语句如下:

CREATE TABLE score(
  id int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  st_id int(11) DEFAULT NULL COMMENT '学生id',
  subject varchar(255) DEFAULT NULL COMMENT '学科名称',
  grade int(11) DEFAULT NULL COMMENT '学科成绩',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB ;

初始数据如下:


二、内连接

按照关联字段取出两个表中的记录,保留的是两个表的交集。

例如:

SELECT
	student.st_id,
	student.st_name,
	score.subject,
	score.grade 
FROM
	student
	INNER JOIN score ON student.st_id = score.st_id;

执行结果:

对于关联字段st_id,左表与右表都有1001与1002。


三、左连接

按照关联字段取出两个表中的记录,保留左表所有的记录,以及满足连接条件的右表记录,右表中不满足连接条件的会被置为null。

例如:

SELECT
	student.st_id,
	student.st_name,
	score.subject,
	score.grade 
FROM
	student
	LEFT JOIN score ON student.st_id = score.st_id;

执行结果:

对于关联字段st_id,展示左表所有的记录。由于右表缺少1003,则1003这行的subject与grade的值被置为null。


四、右连接

按照关联字段取出两个表中的记录,保留右表所有的记录,以及满足连接条件的左表记录,左表中不满足连接条件的会被置为null。正好与左连接相反。

例如:

SELECT
	student.st_id,
	student.st_name,
	score.subject,
	score.grade 
FROM
	student
	RIGHT JOIN score ON student.st_id = score.st_id;

执行结果:

对于关联字段st_id,展示右表所有的记录。由于左表缺少1005,即执行结果的最后一行的st_id与st_name的值被置为null。


五、全连接

按照关联字段取出两个表中的记录,保留左右两表中所有的记录,不满足连接条件的均被置为null。

当然,oracle可以直接使用full join来完成全连接,而mysql则需要借助union。

例如:

select student.st_id,student.st_name,score.subject,score.grade 
from student left join score on student.st_id=score.st_id
union
select student.st_id,student.st_name,score.subject,score.grade 
from student right join score on student.st_id=score.st_id;

执行结果:

可以看到,已经取出了两个表中的所有数据。


六、获取交集以外的部分

按照关联字段取出两个表中的记录,保留交集以外的数据。去除交集相当于全连接-内连接。

例如:

select student.st_id,student.st_name,score.subject,score.grade 
from student left join score on student.st_id=score.st_id 
where score.st_id is null
union
select student.st_id,student.st_name,score.subject,score.grade 
from student right join score on student.st_id=score.st_id 
where student.st_id is null;

执行结果:

第一条数据属于student表,第二条数据属于score表。

  • 12
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SunAlwaysOnline

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

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

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

打赏作者

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

抵扣说明:

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

余额充值