您的当前位置:首页正文

数据查询2

2022-02-04 来源:汇智旅游网
一、实验目的

数据查询语句是SQL语句的重要组成部分,合理使用数据查询语句,可以极大的简化应用程序编制、快速的定位分析数据库系统的故障,查询语句是编程人员与数据库管理人员必不可少的工具,通过试验,加深学生对查询语句基本概念的理解与掌握,最终达到以下目的。 通过实验达到以下目的:

1、掌握广义笛卡尔积连接、自身连接、外连接、复合条件连接和多表连接的使用,掌握不

相关子查询和相关子查询的使用,掌握集合查询的使用。

2、掌握视图的概念、学会使用SQL 语句创建和修改视图,学会使用SQL 语句更新视图对应的基表。

二、实验要求

1、实验前:预习实验内容,学习相关知识。

2、实验中:按照实验内容要求进行实验,实验时注每种SQL语句的基本命

令及各个关键字的含义,做好实验记录。

3、实验后:分析实验结果,总结实验知识,得出结论,按格式写出实验报

告。

4、在整个实验过程中,要独立思考、独立按时完成实验任务,不懂的要虚

心向教师或同学请教。

5、要求按指定格式书写实验报告,且报告中应反映出对次实验的总结,下

次实验前交实验报告。

三、实验内容:

实验数据:dept、class、student、course和SC五个表及实验三插入到表中的数据。

完成以下SQL语句

1. 查询全体学生与选课表的笛卡尔积

2. 查询每个学生的选课情况(用*表示所有行)

3. 查询每个学生及其选修课程的情况(去掉重复属性) 4. 查询某门课程考试成绩相同的学生学号和课程信息

5. 查询所有女生的学号、姓名、班级名、所在的系名、选修的课程名以及成绩 6. 查询每个学生的选修课程包括没有选修课程的学生(外连接) 7. 查询每个学生的选修课程包括没有被学生选修的课程(外连接)

8. 查询每个学生的选修课程即包括没有被学生选修的课程又包括没有被学生选修的 课程(全连接)

9. 查询年龄大于所在女生年龄的男生信息(用两种方式)

10. 查询成绩大于本门课程平均成绩的学生学号、姓名、课程名及成绩 11. 查询与“张三”在一个系学习的学生(用IN和EXISTS两种方式)

12. 查询选修了课程名为“数据库原理”的学生学号和姓名(用连接查询和嵌套两种方式) 13. 查询选修了课程cn01或者选修了课程cn02的学生信息,要求用集合并查询(写出消除重复元组UNION和不消除重复元组UNION ALL两种)

14. 查询既选修了课程cn01又选修了课程cn01的学生,要求用集合交查询。

15. 查询所有考试成绩均在90分以上的学生的信息

16. 查询成绩高于本门课程平均成绩的学生的学号、姓名、课程名和成绩

17.查询没有选修任何课程的学生的学号、姓名和所在的系名(学号未出现在SC表中表示没有选修课程)

18查询选修了全部课程的学生信息(要求用两种以上的语句)

19.查询至少选修了学生‘2012108001’所选的全部课程的学生信息 20.查询至少选修了学生‘2012108001’所选的某一门课程的学生信息

21.查询数据库原理成绩高于本班所有女生数据库原理成绩的男生的学号和姓名(要求用>all)

22.查询数据库原理成绩高于本班任意一个女生数据库原理成绩的男生的学号和姓名,以学号排序。(要求用>any )

23.查询计算系的选修了“数据库原理”课程的学生姓名及成绩 24.查询没有选修cn02号课程的学生姓名 25.视图的操作

(1)创建视图:既不是计算机系、也不是电信系的学生的基本信息。 (2)创建视图:所有班级的名称,所在系名称及每班人数 (3)创建视图:选修了 “数据库原理”的学生的学号和姓名 (4)用INSERT、UPDATE、DELETE命令对(17)所建视图进行操作。

(5)用INSERT、UPDATE、DELETE命令对(16)所建视图进行操作。观察操作结果

(6)查询分析器用Select语句完成对视图的查询(自已设计查询语句)

四.实验习题源程序(SQL命令)清单与运行结果

use AB

1. 查询全体学生与选课表的笛卡尔积 select *from Student,sc

2. 查询每个学生的选课情况(用*表示所有行)

select s.*,sc.* from student s,sc where sc.sno=s.sno

select s.*,sc.* from student s inner join sc on s.sno=sc.sno

3. 查询每个学生及其选修课程的情况(去掉重复属性)

select s.sno,sname,sex,classno,age,sc.cno,grade from student s,sc where s.sno=sc.sno

4. 查询某门课程考试成绩相同的学生学号和课程信息

select s.sno,s.cno,s.grade from sc s,sc y where s.sno>y.sno and s.GRADE=y.GRADE

5. 查询所有女生的学号、姓名、班级名、所在的系名、选修的课程名以及成绩 select student.sno,sname,class.classno,deptno,cno,grade from student,class,sc where SEX='女'

6. 查询每个学生的选修课程包括没有选修课程的学生(外连接)

select s.*,cno,grade from student s left join sc on (s.sno=sc.sno)

7. 查询每个学生的选修课程包括没有被学生选修的课程(外连接)

select s.sno,s.sname,grade,course.cno from student s left join sc on (s.SNO=sc.sno) right join course on (sc.CNO=course.cno)

8. 查询每个学生的选修课程即包括没有被学生选修的课程又包括没有被学生选修的课程(全连接)

select s.sno,s.sname,grade,course.cno from student s left join sc on (s.SNO=sc.sno) right join course on (sc.CNO=course.cno)

9. 查询年龄大于所在女生年龄的男生信息(用两种方式)

select *from Student where age>all(select AGE from Student where SEX='女') and SEX='男'

select *from Student where age>(select max(AGE) from Student where SEX='女') and SEX='男'

10. 查询成绩大于本门课程平均成绩的学生学号、姓名、课程名及成绩

select student.sno,sname,cno,grade from Student,SC where grade>(select AVG(grade) from sc)

11. 查询与“张三”在一个系学习的学生(用IN和EXISTS两种方式)

select *from Student where Classno in (select classno from student where SNAME='张三' )

select *from Student s1 where exists (select *from Student s2 where SNAME='张三' and s2.Classno =s1.Classno)

12. 查询选修了课程名为“数据库原理”的学生学号和姓名(用连接查询和嵌套两种方式)

select s.sno,sname from Student s,course c,sc where sc.cno=c.Cno and s.sno=sc.sno and c.cno='数据库原理'

select sno,sname from Student s where sno in(select sno from sc where cno in(select CNO from Course where CNAME='数据库原理') )

13. 查询选修了课程c001或者选修了课程c002的学生信息,要求用集合并查询(写出消除13.重复元组UNION和不消除重复元组UNION ALL两种)

select *from student where sno in(select sno from sc where cno='c001') union

select *from student where sno in(select sno from sc where cno='c002')

14.查询既选修了课程cn01又选修了课程cn01的学生,要求用集合交查询。 select *from student where sno in(select sno from sc where cno='c001') union all

select *from student where sno in(select sno from sc where cno='c002')

15.查询所有考试成绩均在90分以上的学生的信息

select *from Student s where exists (select *from sc where sc.sno=s.sno and grade>90 )

16.查询成绩高于本门课程平均成绩的学生的学号、姓名、课程名和成绩 select s.sno,s.sname,sc.cno,sc.grade from student s join sc on s.sno=sc.sno and grade>avg(grade) join course c on sc.cno=c.cno 17.查询没有选修任何课程的学生的学号、姓名和所在的系名(学号未出现在SC表中表示没有选修课程)

select s.sno,sname,deptname from student s,dept,sc,Course,class WHERE s.sno=sc.sno and sc.CNO=course.CNO and class.deptno=dept.Deptno and sc.CNO is null

18.查询选修了全部课程的学生信息(要求用两种以上的语句) select *from student s where not exists

(select *from Course c where not exists

(select *from sc where sno=s.SNO and cno= c.CNAME)) select *from Student where sno in

(select distinct sno from sc sc1 where

(select count(distinct cno)from sc where sno=sc1.sno)>= (select count(distinct cno))

19.查询至少选修了学生‘2012108001’所选的全部课程的学生信息 select *from sc scx where not exists(

select *from sc scy where scy.sno='2012108001' and not exists

(select *from sc scz where scz.sno=scx.sno and scz.cno=scy.cno ))

20.查询至少选修了学生‘2012108001’所选的某一门课程的学生信息 select distinct sno from sc scx where not exists(

select *from sc scy where scy.sno='2012108001' and not exists

(select *from sc scz where scz.sno=scx.sno and scz.cno=scy.cno ))

21.查询数据库原理成绩高于本班所有女生数据库原理成绩的男生的学号和姓名(要求用>all)

select student.sno,sname from student,sc,course where student.sno=sc.sno and sc.cno=course.cno and sex='男

'and grade>all(select grade from student,sc,course where student.sno=sc.sno and sc.cno=course.cno and sex='女' and cname='数据库原理') and cname='数据库原理'

22.查询数据库原理成绩高于本班任意一个女生数据库原理成绩的男生的学号和姓名,以学号排序。(要求用>any )

select student.sno,sname from student,sc,course where student.sno=sc.sno and sc.cno=course.cno and sex='男

'and grade>any(select grade from student,sc,course

where student.sno=sc.sno and sc.cno=course.cno and sex='女' and cname='数据库原理') and cname='数据库原理'

23.查询计算系的选修了“数据库原理”课程的学生姓名及成绩

select sname,grade from student s,sc where s.sno=sc.sno and s.classno in(select classno from class where deptno=(select deptno from dept where deptname='计算机学院 '))and sc.cno=(select cno from course where cname='数据库原理')

24.查询没有选修c002号课程的学生姓名

select sname from student where not exists(select * from sc where cno='c002')

25.视图的操作

(1)创建视图:既不是计算机系、也不是电信系的学生的基本信息。

create view s_1 as select * from student where classno not in (select classno from class where deptno in (select deptno from dept where deptname in('计算机学院','电信系')))

(2)创建视图:所有班级的名称,所在系名称及每班人数 (3)创建视图:选修了 “数据库原理”的学生的学号和姓名

create view s_2 as select sno,sname from student where sno in(select sno from sc where cno=(select cno from course where cname='数据库原理'))

(4)用INSERT、UPDATE、DELETE命令对(17)所建视图进行操作。

(5)用INSERT、UPDATE、DELETE命令对(16)所建视图进行操作。观察操作结果

(6)查询分析器用Select语句完成对视图的查询(自已设计查询语句

五.注意事项

1、在嵌套查询中,order by只能用于最外层嵌套。 2、内外层相关查询中,应对表取别名

3、对视图操作时,只有单表视图可能进行插入、修改和删除操作。 4、如果为存储过程指定参数且没有定义参数的缺省值,必须在运行时给出参数值

5、对表者操作时触发相应的触发器执行,因此设计操作时必须要设计满足触发器条件和不满足条件两种操作,才能体会到触发器的作用

六.实验总结

因篇幅问题不能全部显示,请点此查看更多更全内容