2021-04-05

数据查询-例3.48—3.54

本节课主要学习了数据查询中的连接查询。
例3.48查询平均成绩大于等于90分的学生学号和平均成绩。

select Sno,avg(Grade)
from SC
group by Sno
having avg(Grade)>80;

这里使用了having短语,主要原因是where子句不支持使用聚合函数作为条件表达式。
在这里插入图片描述
在这里插入图片描述
(平均值我使用的是80)

连接查询

1.等值于非等值连接查询
例3.49
查询每个学生及其选修课程的情况。
没有等值连接的情况下:

select Student.*,SC.Cno
from Student,SC;

2021-04-05_第1张图片
显然这不是正确结果,而是这两个表的笛卡尔积。如果规定了他们的公共属性Sno,结果就是正确的了。

select Student.*,SC.Cno
from Student,SC
where Student.Sno=SC.Sno;

2021-04-05_第2张图片
例3.50对例3.49用自然连接完成。

select Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
from Student,SC
where Student.Sno=SC.Sno;

2021-04-05_第3张图片
如果属性名在参加连接的个表中是唯一的,则可以省略表名前缀,结果是一样的。(例3.49中的SC.Cno改为SC.*后结果一致)

例3.51查询选修2号课程成绩在80分以上的所有学生的学号和姓名。

select SC.Sno,Sname
from SC,Student
where Grade>80 and SC.Cno='2' and SC.Sno=Student.Sno;

2021-04-05_第4张图片
自身连接

例3.52 查询每一门课程的间接先修课(即先修课的先修课)。
课程都在Course表中,但是表中没有直接提到间接先修课,不过如果将表自身和自身连接,就可以找出间接先修课。
我们可以将Course取两个别名,一个first,一个second。

	select first.Cno,second.Cpno
from Course first,Course second
where first.Cpno=second.Cno;

2021-04-05_第5张图片
外连接
有时想以Student表为主体列出每个学生的基本情况及其选课结果。若每个学生没有选课,仍把Student的悬浮元组保存在结果关系中,就需要用到外连接了。
例3.53改写例3.49
如果:

select Student.*,Cno,Grade
from Student,SC
where Student.Sno=SC.Sno

那么不会显示没选课的同学的信息:
2021-04-05_第6张图片
使用外连接:

--左外连接
select Sname,Student.Sno,Ssex,Sage,Sdept,Cno,Grade
from Student left outer join SC on(Student.Sno=SC.Sno);
--右外连接
select Sname,Student.Sno,Ssex,Sage,Sdept,Cno,Grade
from Student right outer join SC on(Student.Sno=SC.Sno);

结果为:
2021-04-05_第7张图片
不同点:左外连接列出左边关系(Student)中的所有元组,右外连接列出右边关系(SC)中的所有元组。

多表连接
连接操作还可以进行两个以上的表进行连接。
例3.54 查询每个学生的学号、姓名、选修的课程名以及成绩。

select Sname,Grade,Cname,Student.Sno
from Student,SC,Course
where Student.Sno=SC.Sno and SC.Cno=Course.Cno;

2021-04-05_第8张图片
注意相同属性的对应关系,不要漏掉。

你可能感兴趣的:(sql)