赞
踩
1. 找出没有选修任何课程的学生的学号、姓名(即没有选课记录的学生)。
自己认为查询语句正确后,通过下面语句将查询语句创建成视图test2_01
Create or replace view test2_01 as select ……
然后就可以点击实验二的题目1的【交卷验证】,验证正确性,正确后就有得分。
- create or replace view test2_01 as
- select sid,name
- -- 将pub.student关系起个别名s
- from pub.student s
- --关系模型中的减运算在Oracle语句中变为not in
- where s.sid not in(select sid from pub.student_course)
2.找出至少选修了学号为“200900130417”的学生所选修的一门课的学生的学号、姓名(不包含这名同学)。
自己认为查询语句正确后,通过下面语句将查询语句创建成视图test2_02
Create or replace view test2_02 as select ……
然后就可以点击实验二的题目2的【交卷验证】,验证正确性,正确后就有得分。
以下各题操作类似。
- create or replace view test2_02 as
- select distinct s.sid,s.name
- from pub.student_course sc,pub.student s
- where
- -- !!!一定要做这个sc.sid=s.sid的判断,否则查询出来的结果会多很多,就变成纯笛卡尔积了好多关系都对应不上
- sc.sid = s.sid
- and sc.cid in
- (select cid
- from pub.student_course
- where sid=200900130417)
- -- not like,!=,<>均可表示不等于
- and sc.sid not like 200900130417
- //第一次创建的表如果有误,利用drop再删除
- drop view test2_02
3.找出至少选修了一门其先行课程号为"300002"号课程的学生的学号、姓名。
- create or replace view test2_03 as
- select s.sid,s.name
- from pub.student_course sc,pub.student s
- where sc.sid=s.sid
- and sc.cid in(
- select cid
- from pub.course c
- where c.fcid=300002
- )
4.找出选修了“操作系统”并且也选修了“数据结构”,但是没有选修“程序设计语言”的学生的学号、姓名。
- create or replace view test2_04 as
- select distinct s.sid,s.name as name-- 剔除重复
- from pub.student s
- -- 需要课程名列,该列在pub.course c表中,但是c表和s表无共同属性,只能通过sc建立连接
- join pub.student_course sc on s.sid=sc.sid-- 通过外键连接join 外表 on 外键
- join pub.course c on c.cid=sc.cid
- where c.name like '数据结构'
- and s.sid in-- 这里要进行两次交运算,交运算选中一个可供判断的属性即可
- (select distinct s.sid
- from pub.student s
- join pub.student_course sc on s.sid=sc.sid
- join pub.course c on c.cid=sc.cid
- where c.name like '操作系统')-- 必须是单引号
- and s.sid not in-- 不在这个select关系中
- (select distinct s.sid
- from pub.student s
- join pub.student_course sc on s.sid=sc.sid
- join pub.course c on c.cid=sc.cid
- where c.name like '程序设计语言')
5.找出姓名叫"李龙"的学生的学号及其选修全部课程的课程号、课程名和成绩
- create or replace view test2_05 as
- select s.sid,c.cid,c.name,sc.score
- from pub.student s
- join pub.student_course sc on s.sid=sc.sid
- join pub.course c on c.cid=sc.cid
- where s.name like '李龙'
6.查询2010级、计算机科学与技术学院、操作系统的学生成绩表,内容有学号、姓名、成绩。
- create or replace view test2_06 as
- select distinct s.sid,s.name,sc.score
- from pub.student s
- join pub.student_course sc on s.sid=sc.sid
- join pub.department d on s.dname=d.dname
- join pub.course c on c.cid=sc.cid
- where d.dname like '计算机科学与技术学院'
- and c.name like '操作系统'
- and s.class like '2010'
7.查询所有不姓张、不姓李、也不姓王的学生的学号sid、姓名name
- create or replace view test2_07 as
- select sid,name
- from pub.student
- where name not like '张%'
- and name not like '李%'-- 不等于什么什么的可以直接and连接
- and name not like '王%'
8.找出有间接先行课的所有课程的课程号、课程名称。
!!!一定要看清题目,是间接先行课(这个题卡了我老长时间,后来又回实验报告里看了一遍题目才反应过来是间接先行课,即先行课的先行课不为空)
- create or replace view test2_08 as
- select distinct c.cid,c.name
- from pub.course c,pub.course c1
- where c.fcid=c1.cid and c1.fcid is not null
9.查询选修了300003号课程的学生的sid、name、score
- create or replace view test2_09 as
- select s.sid,s.name,sc.score
- from pub.student s,pub.student_course sc
- where sc.cid like 300003
10.找出选修了所有课程的学生的学号、姓名
lh老师的ppt,讲的很清楚,建议将这个除法运算的减法原理重新巩固理解,内化为自己的知识,写出SQL语句
- create or replace view test2_10 as
- select sid,name
- from pub.student s
- where sid not in -- 等价于代数关系中的减运算
- (select sid
- from pub.student s,pub.course c
- where (sid,cid) not in-- 将S*C笛卡尔积的所有可能的学生选课关系列出来,再减去实际上的SC关系表中
- -- 的,就是将每一个学生和他/她没有选的课一一对应,一个学生有没选的课,那么就不符合题目要求的选出选了
- -- 所有课程的学生学号,于是就用开头的sid not in(即所有的sid,减去没有选全课的学生学号,即可得选了所有课的
- (
- select sid,cid
- from pub.student_course sc
- )
- )
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。