1、第6周 关系代数运算(二),一、广义笛卡尔积 二、连接(条件连接、等值连接、自然连接、自身连 接、左外连接、右外连接) 三、除法 四、举例,一、(广义)笛卡尔积(P53),关系R(n列,k1元组)与关系S(m列,k2元组)的(广义)笛卡尔积是一个(n+m)列k1*k2个元组集合。,student与sc的广义笛卡尔积为3*2=6行,5+3=8列。将学生表的每一行与选课表的每一行进行连接,student表(5列,3行),sc 表(3列,2行),广义笛卡尔积的查询表达,查询的关系代数表达(P53) 关系代数表达式:S SC 查询的SQL表达 SQL表达式:select student.*,sc.*
2、from student,sc; 注意:广义笛卡尔积的结果值没有意义!要使其有意思需要加上连接条件,即从中选出满足条件的元组。,二、连接运算,条件连接 等值连接(特殊的条件连接) 自然连接(特殊的等值连接) 自身连接 左外连接 右外连接,条件连接(P57),在两个关系student、sc的广义笛卡尔积中选择属性间满足一 定条件的元组条件为:student.snosc.sno(6个中1个满足条件)条件为:student.sno=sc.sno(6个中2个满足条件),条件连接的表达,条件为student.snosc.sno s. Sno=sc.sno 含义:从广义笛卡尔积S SC中选择满足比较运算表
3、达式AB的元组,A、B分别为S、SC 上度数相等且可比的属性组。,连接条件,无实际意义,特殊条件连接:等值连接,等值连接与自然连接,等值连接是特殊的条件连接(比较运算表达式AB 中, 为“=”的连接运算符) 等值连接的问题:列重复 自然连接是特殊的等值连接(去掉重复列) 关系代数表达自然连接运算:S SC SQL表达式:select student.*,o,sc.grade from student,sc where student.sno=sc.sno;sc.grade的前缀sc.可以省略,基于是否唯一出现在某一个表中。考题! 例子查询每个学生及其选修课程情况(给出学生与课程信息)(分别考虑
4、等值与自然连接)P100-101,等值连接,自然连接,自身连接、左外连接、右外连接,自身连接P102 例35查询每门课的间接先修课select o,second.cpno from course first , course second /*取两个别名*/where first.cpno=o;first表: (临时表) second 表: (临时表)查询结果: (可以理解成 先连接 后投影)其对应的关系代数表达式:,自身连接、左外连接、右外连接,左外连接P103列出左边关系(student)中的所有元组select student.sno, sname, ssex, sage, sdept,
5、 cno,grade from student left outer join sc on student.sno=sc.sno;学生表: 选课表sc: (student) Student sc自然连接:(左边关系某些元组未出现在目标表中)左外连接的结果:,自身连接、左外连接、右外连接,右外连接P103,列出右边关系(sc)中的所有元组select student.sno, sname, ssex, sage, sdept, cno,grade from student right outer join sc on student.sno=sc.sno;学生表: 选课表sc: (student
6、) Student sc自然连接:(左边关系某些元组未出现在目标表中)右外连接:,三、除法运算(SQL表达后讲),例子1: P59例6 关系R: 关系S:R S: R中a1的象集包含了S在(B,C)属性组上的投影,关系R中, a1的象集:(b1,c2),(b2,c),(b2,c1) a2的象集:(b3,c7),(b2,c3) a3的象集:(b4,c6) a4的象集:(b6,c6),三、除法运算(SQL表达后讲),例子2: P60例7查询至少选修了1、3号课程的学号关系Sno,Cno(SC) 临时关系K:R S: 空 问:如果希望2010002出现在目标表中,SC表中需要增加什么记录?,关系Sn
7、o,Cno(SC) 中, 2010001的象集:(1) 2010002的象集:(2),四、举例P60例8,P60 例8 查询选修了2号课程的学生学号关系代数表达式:sno(cno=2(sc))SQL表达式子:select sno from sc where cno=2 问题:题目改为,查询选修了2号课程学生的学号及姓名,如何表达查询?(连接查询及嵌套查询) 连接查询 关系代数: sno,sname(cno=2(scS))SQL:select s.sno,sname from sc,s where sc.sno=s.sno and cno=2学生表: 选课表sc:(student) 查询结果:,
8、四、举例P60例8,嵌套查询 关系代数表达式: sno(cno=2(sc)) sno,sname (s) SQL表达式: select sno,sname from s where sno in (select sno from sc where cno=2) 嵌套查询的SQL语句的求解过程 先子查询(select sno from sc where cno=2)SC表: 查询结果:后外查询student表: sno in (select sno from sc where cno=2),四、举例P60例9-1,P60【例9】查询至少选修了一门其直接先行课为1号课程的学生姓名(关系代数及SQL
9、表达) 嵌套查询: 第一步:求先行课为1号课程的课程号,涉及课程表P1:cno(cpno=1(coruse)) -关系代数表达式Select cno from c where cpno=1 -SQL表达式 第二步:选了上述课程的学生学号 P2:sno(P1SC ) Select sno from sc where cno in (Select cno from c where cpno=1) 第三步:根据学号求姓名 P2Sno,Sname(Student),投影出Sname Select sno,sname from s where sno in (Select sno from sc whe
10、re cno in (Select cno from c where cpno=1),四、举例P60例9-2,P60【例9】查询至少选修了一门其直接先行课为1号课程的学生姓名(关系代数及SQL表达) 连接查询: 关系代数表达:Sno,Sname (cpno=1(coruse)SCS) Select s.sno,sname from s,sc,c where cpno=1 and s.sno=sc.sno and o=o 问题:s.sno的前缀s.是否可以省略,四、举例P60例9-3,P60【例9】查询至少选修了一门其直接先行课为1号课程的学生姓名(关系代数及SQL表达) 嵌套查询: 第一步:求
11、先行课为1号课程的课程号,涉及课程表P1:cno(cpno=1(coruse)) -关系代数表达式Select cno from c where cpno=1 -SQL表达式 第二步:选了上述课程的学生学号 P2:sno(P1SC ) Select sno from sc where cno in (Select cno from c where cpno=1) 第三步:根据学号求姓名 P2Sno,Sname(Student),投影出Sname Select sno,sname from s where sno in (Select sno from sc where cno in (Select cno from c where cpno=1) 连接查询: Sno,Sname (cpno=1(coruse)SCS) Select s.sno,sname from s,sc,c where cpno=1 and s.sno=sc.sno and o=o (问题:s.sno的前缀s.是否可以省略),