笛卡尔积的元素是元组, 关系 A 和 B 的笛卡尔积可以记为 (AXB), 如果 A 为 a 目, B 为 b 目, 那么 A 和 B 的笛卡尔积为(a+b) 列的元组集合.
(1)学生表和分数表中的信息:
学生表:
分数表(大概就是这个样子):
(2)学生表和分数表执行笛卡尔积后:
- SELECT *
- FROM student JOIN score
可以看出, 执行 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
即: 只有学生表的学号属性和分数表的学号属性相等的时候才会将表中的两个元组相连, 与笛卡尔积相比, 等值连接添加了限制条件.
(2)自然连接:
自然连接不仅要求连接的两个字段必须同名, 还要求将结果中重复的属性列去掉.
执行语句:
- SELECT *
- FROM student NATURAL JOIN score
以上自然连接的查询的元组的条数与等值连接相同, 只不过是相同的属性 (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
(2)右外连接(只保留右边关系中的悬浮元组):
创建一个学生的分数元组, 只有成绩而没有与之对应的学生(学号):
INSERT INTO score VALUES('55','1234344','c8848','87','98','123')
插入后如果进行等值连接或自然连接都不会出现学号为 1234344 的分数, 但是如果进行右外连接, 就会出现只有学生的分数信息, 而没有该学生的基本信息的情况.
- SELECT *
- FROM student RIGHT OUTER JOIN score
- ON student.studentno=score.studentno
4, 内连接, 外连接之间的关系:
如果用上图来表示内连接与外连接之间的关系的话:
2: 代表内连接
1,2: 左外连接
2,3: 右外连接
来源: https://www.cnblogs.com/zhai1997/p/11961569.html