(一)多表连接查询 i. 查询每个选课学生的学生姓名、课程号和分数。(2表连接) SQL> select student.sname,sc.cno,sc.grade from student,sc where student.sno=sc.sno; ii. 求学生的学号、姓名、选修课程的课程名及成绩。(3表连接) SQL> select student.sno,student.sname,course.cname,sc.grade from student,course,sc where student.sno=sc.sno and sc.cno=course.cno; iii. 求选修课程号为1或课程号为2的学生姓名和学号。 SQL> select distinct student.sname,student.sno from student,sc where student.sno=sc.sno and (sc.cno=1 or sc.cno=2); iv. 查询每一门课程的间接先行课的课程号。 SQL> select first.cno,second.cpno from course first,course second where first.cpno=second.cno; v. 查询与’刘晨’在同一个系学习的学生。 SQL> select * from student where sdept=(select sdept from student where sname='李佳'); vi. 查询选修了课程名为’C语言’的学生学号和姓名。 SQL> select student.sno,student.sname from student,sc,course where student.sno=sc.sno and sc.cno=course.cno and course.cname='PASCAL语言'; vii. 查询平均成绩在80分以上的学生学号和平均成绩。 SQL> select sno,avg(grade) avg_grade from sc group by sno having avg(grade)>=80; viii. 查询选修了1门且平均分在85分以下课程的学生的学号。 SQL> select distinct sc.sno from student,sc where student.sno=sc.sno and cno in (select cno from sc group by cno having avg(grade)<85); ix. 以学生为主体显示学生的信息及其选课的信息。 SQL> select * from student,sc where student.sno=sc.sno(+); x. 对学生表和选课表做自然连接,并输出结果。 SQL> select student.sno,student.sname,student.ssex,student.sage,student.sdept,sc.cno,sc.grade from student,sc where student.sno=sc.sno; xi. 输出学号大于’ 刘晨’的学生的姓名和学号。 SQL> select sname,sno from student where sno>(select sno from student where sname='刘明'); xii. 查询数学系的学生每个人所选课程的平均成绩。 SQL> select sc.sno,avg(sc.grade) from (select sno from student where sdept='MA')S,sc where S.sno=sc.sno group by sc.sno; xiii. 查询选修2号课程且成绩高于“20070001”号学生成绩(2号课程的成绩)的所有学生记录。 SQL> select student.* from student,sc where student.sno=sc.sno and sc.cno=2 and sc.grade>(select grade from sc where cno=2 and sno='20070001'); (二)选做(使用from子句,通过inner join,left join,right join,cross join完成多表连接查询) 1. 以学生为主体显示学生的信息及其选课的信息。 SQL> select * from student left join sc on student.sno=sc.sno; 2. 查询选修了2号课程的学生姓名。 SQL> select student.sname from student inner join sc on student.sno=sc.sno and sc.cno=2; 3. 学生表和课程表做笛卡尔积。 SQL> select * from student cross join course; (三)思考题: 1.Where子句中能否用聚集函数作为条件表达式。 答:不能。 2.多表连接查询中如果显示的某一属性不止一个表中出现,应如何处理。 答:应该用表名加上点,再加上属性名表示。
实验分析与讨论:
在本次数据库试验中,我完成了实验要求。本次实验内容是关于多表的连接查询及投影、选择条件。在课堂上,老师讲授了多表连接查询的相关知识,我也用笔练习写了sql语句,但是感觉印象还不是很深刻,有些不太理解。在实验课中我练习了sql语句,对课堂上所学的知识有了更深的理解,收获很多。实验中,我遇到了一些问题,通过查询资料和老师同学帮助最终解决了。遇到的问题如下:
1、在多表查询时,我不太清楚怎么为表取别名,在实验中,我查询资料明白了在一个查询得到的表后可以直接加上别名。
2、在做第二题时,我对外连接不太清楚,通过一个个测试,了解了inner join,
left join, right join和cross join的用法。