数据库---实验二 数据查询

 

(一)多表连接查询
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的用法。

 

posted @ 2016-11-03 21:29  茶飘香~  阅读(2985)  评论(0编辑  收藏  举报