mysql 笛卡尔积_Mysql(笛卡尔积、等值连接、自然连接、外连接)

本文介绍了MySQL中的几种连接操作,包括笛卡尔积、等值连接、自然连接和外连接。通过学生表和分数表的例子,详细解释了每种连接方式的工作原理和查询结果。笛卡尔积产生所有可能的元组组合;等值连接基于特定条件连接记录;自然连接在等值连接基础上去除重复列;外连接(左外和右外)则保留了没有匹配项的元组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、笛卡尔积

笛卡尔积的元素是元组,关系A和B的笛卡尔积可以记为(AXB),如果A为a目,B为b目,那么A和B的笛卡尔积为(a+b)列、(a*b)行的元组集合。

(1)学生表和分数表中的信息:

学生表:

7a22d11d642623e3370f49c3d9f19e09.png

分数表(大概就是这个样子):

f9179cd740068e4fe21b4036c658bb98.png

(2)学生表和分数表执行笛卡尔积后:

SELECT *FROM student JOIN score

6c084aa3bcb539b7b3c4911d2d353705.png

可以看出,执行sql语句后,student表中的每一条语句分别与score表中的每一条语句连接。

2、内连接

内连接又称为普通连接或自然连接。在说自然连接之前,应该先说一下连接的概念,连接是从笛卡尔积中选取属性间满足一定条件的元组。连接运算又可以分为等值连接和自然连接。

(1)等值连接

当条件为“=”的连接为等值连接,是连接属性值相等的那些元组。其结果是连接的表的所有列,包括重复列。

还是运用上面的学生表和分数表:

执行以下语句(隐式内连接):

过滤掉没有用的元组,保留想要的有意义的元组。

SELECT *FROM student,score

WHERE student.studentno=score.studentno

或者(显式内连接):

SELECT *FROM student INNER JOIN score ON

student.studentno=score.studentno

即:只有学生表的学号属性和分数表的学号属性相等的时候才会将表中的两个元组相连,与笛卡尔积相比,等值连接添加了限制条件。

b55c6e609f8f97c05dcd22b9b4f4295d.png

(2)自然连接

自然连接不仅要求连接的两个字段必须同名,还要求将结果中重复的属性列去掉。

执行语句:

SELECT *FROM student NATURAL JOIN score

10ca7bcf1b66ae3f7379d47988f69b11.png

以上自然连接的查询的元组的条数与等值连接相同,只不过是相同的属性(studentno)只保留了一个。

3、外连接

在以上的学生表和分数表的连接中,存在有些学生分数表中没有对应的该学生的分数信息,同样也有可能存在有分数而没有该学生信息的情况。这些找不到对应的元组进行匹配的元组称为悬浮元组。如果把悬浮元组也保留在结果中,那么这种连接就叫做外连接。

(1)左外连接(只保留左边关系中的悬浮元组)

为了使查询结果更明显,故意制造一个没有分数的学生:

INSERT INTO student VALUES('111','12345566','1111-11-11','111','111','男','zhai','890')

插入后如果进行等值连接或自然连接都不会出现学号为"111"的学生的信息。但是,如果进行左外连接的查询,会出现该学生的信息,但是有关该学生的成绩的相关信息为空。

执行以下语句,进行学生表和分数表的左外连接:

SELECT *FROM student LEFT OUTER JOIN score

ON student.studentno=score.studentno

fe7ab697c71539a7905b86c90c99028d.png

(2)右外连接(只保留右边关系中的悬浮元组):

创建一个学生的分数元组,只有成绩而没有与之对应的学生(学号):

INSERT INTO score VALUES('55','1234344','c8848','87','98','123')

插入后如果进行等值连接或自然连接都不会出现学号为1234344的分数,但是如果进行右外连接,就会出现只有学生的分数信息,而没有该学生的基本信息的情况。

SELECT *FROM student RIGHT OUTER JOIN score

ON student.studentno=score.studentno

bdbf29a65b15dcac6ab3911c39ff0760.png

4、内连接、外连接之间的关系:

4e0485767aaeba494b55dc7eebf0d5cc.png

如果用上图来表示内连接与外连接之间的关系的话:

2:代表内连接

1、2:左外连接

2、3:右外连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值