当前位置:文档之家› 数据库查询实验报告

数据库查询实验报告

应用数学学院_学院专业_1__班学号姓名___ ___教师评定实验题目数据库的查询一、实验目的与要求实验目的:使学生掌握SQL Server查询分析器的使用方法,加深对SQL 和Transact-SQL语言的查询语句的理解。

熟练掌握简单表的数据查询、数据排序和数据联结查询的操作方法;嵌套查询语句;熟练掌握数据查询中的分组、统计、计算和组合的操作方法。

实验要求:1、简单查询操作。

该实验包括投影、选择条件表达,数据排序,使用临时表等;2、连接查询操作;3、嵌套查询。

在SQL Server查询分析器中使用IN、比较符、ANY或ALL和EXISTS 操作符进行嵌套查询操作;4、分组查询实验。

包括分组条件表达、选择组条件的表达方法;5、使用函数查询。

包括统计函数和分组统计函数的使用方法;6、组合查询实验;二、实验方案将查询需求用Transact-SQL语言表示;在SQL Server查询分析器的输入区中输入Transact-SQL查询语句;设置查询分析器的结果区为标准执行或网格执行方式;发布执行命令,并在结果区中查看结果;三、实验结果和数据处理1、学生选课库的各个表截图:(1)学生表(2)课程表(3)选课表2、图书-读者库的各个表截图(1)图书表(2)读者表(3)借阅表实验步骤:1、简单查询:l)用Transact-SQL语句表示下列操作.在学生选课库中实现其数据查询操作.①求数学系学生的学号和姓名。

select 学号,姓名from 学生where 所在系='数学';结果:②求选修了课程的学生学号。

select distinct 学号from 选课结果:③求选修A1课程的学生学号和成绩,并要求对查询结果按成绩降序排列,如果成绩相同则按学号升序排列。

select 学号,成绩from 选课where 课程号='A1'order by 成绩 desc,学号 asc结果:④获选修课程A1且成绩在80~90分之间的学生学号和成绩,并将成绩乘以系数0.8 输出。

select 学号,成绩*0.8from 选课where 课程号='A1' and 成绩 between 80 and 90结果:⑤求数学系或计算机系姓张的学生的信息。

select *from 学生where 所在系 in ('数学','计算机') and 姓名 like '张%';结果;⑥求缺少了成绩的学生的学号和课程号。

(本库中没有学生没有成绩)select 学号,课程号from 选课where 成绩 is null结果:2)在图书借阅库中实现其查询操作:将计算机类的书存入永久的计算机图书表中,将借书日期在2012年以前的借阅记录存入临时的超期借阅表。

select *into 计算机图书from 图书where 类别='计算机'goselect *into #超期借阅from 借阅where 借阅日期<'12:01:01'go结果:2、连接查询实验用Transact-SQL语句表示,并在学生选课库中实现下列数据连接查询操作:①查询每个学生的情况以及他(她)所选修的课程select 学生.*,选课.*from 学生,选课where 学生.学号=选课.学号结果:②求学生的学号、姓名、选修的课程名及成绩。

select 学生.学号,姓名,课程名,成绩from 学生,课程,选课where 学生.学号=选课.学号 and 课程.课程号=选课.课程号结果:③求选修A1课程且成绩为85分以上的学生学号、姓名及成绩。

select 学生.学号,姓名,成绩from 学生,选课where 学生.学号=选课.学号 and 课程号='A1' and 成绩>85结果:④查询每一门课的间接先行课(即先行课的先行课)。

select A.课程号,A.课程名,B.先行课from 课程 A,课程 Bwhere A.先行课=B.课程号结果:3、嵌套查询:用Transact-SQL语句表示,在学生选课库中实现其数据嵌套查询操作。

(1)求选修了数据结构的学生学号和姓名。

select 学号,姓名from 学生where 学号 in (select 学号from 选课where 课程号 in(select 课程号from 课程where 课程名='数据结构'));结果:(2)求A1课程的成绩高于黄洁蓉的学生学号和成绩。

select 学号,成绩from 选课where 课程号 ='A1' and 成绩 > ( select 成绩from 选课where 课程号='A1' and 学号=(select 学号from 学生where 姓名='黄洁蓉'));结果:(3)求其他系中年龄小于数学系年龄最大者的学生。

select *from 学生where 年龄 < any (select 年龄from 学生where 所在系='数学') and 所在系 < >'数学'结果:(4)求其他系中比数学系学生年龄都小的学生。

select *from 学生where 年龄 < all (select 年龄from 学生where 所在系='数学') and 所在系 < >'数学'结果:(5)求选修了A2课程的学生姓名。

select 姓名from 学生where exists (select *from 选课where 学生.学号=学号 and 课程号='A2');结果:(6)求没有选修A2课程的学生姓名。

select 姓名from 学生where not exists (select *from 选课where 学生.学号=学号 and 课程号='A2');结果:(7)查询选修了全部课程的学生的姓名。

SELECT 姓名FROM 学生WHERE NOT EXISTS (SELECT *FROM 课程WHERE NOT EXISTS(SELECT *FROM 选课WHERE 学生.学号=学号 AND 课程.课程号=课程号));结果:(8)求选修了学号为“9801”的学生所选修的全部课程的学生学号和姓名。

SELECT 学号,姓名FROM 学生WHERE NOT EXISTS (SELECT *FROM 选课选课1WHERE 选课1.学号='9801' and not exists(SELECT *FROM 选课选课2WHERE 学生.学号=选课2.学号AND 选课2.课程号=选课1.课程号));结果:4、组合查询和统计查询:在图书借阅库中实现其查询操作。

(1)查找这样的图书类别:要求类别中最高的图书定价不低于全部按类别分组的图书平均定价的2倍。

select 类别from 图书where not exists(select *where 定价<(select 2*avg(distinct 定价)from 图书))结果:(2)求清华大学出版社出版的各类图书的平均定价,用GROUP BY表示。

select 类别,avg(定价)平均价from 图书where 出版社='清华大学出版社'group by 类别order by 类别 asc结果:(3)列出文学散文类图书的书号、名称及价格.最后求出册数和总价格。

select 书号,书名,定价from 图书where 类别='文学散文'select count(*) ,sum(定价)from 图书where 类别='文学散文'结果:(4)列出文学散文类图书的书号、名称及价格并求出各出版社这类书的总价格.最后求出全部册数和总价格。

select 书号,书名,定价from 图书where 类别='文学散文'select count(*) as '册数 ',sum(定价) as '总价格'from 图书where 类别='文学散文'group by 出版社order by 出版社 ascselect count(*) as '全部册数 ',sum(定价) as '总价格'from 图书结果:(5)查询计算机类和机械工业出版社出版的图书。

select 书号,书名,定价from 图书where 类别='计算机'union allselect 书号,书名,定价from 图书where 出版社='机械工业出版社'结果:四、结论通过此次创建数据库以及对数据库的查询,我掌握了SQL Server查询分析器的使用方法,加深对SQL查询语句的理解。

熟练掌握了表的数据的简单查询、连接查询;嵌套查询语句的操作方法;掌握数据汇总的方法,掌握了select语句的group by子句的作用和使用方法以及掌握了select语句的order by子句的作用和使用方法。

五、问题与讨论1、在删除数据操作中,对于存在相互牵制关系的两个表,删除操作的先后次序有无关系?Delect语句的功能是从指定表中删除满足where子句条件的所有元组。

如果在数据删除语句中省略where子句,表示删除表中全部元组。

Delect语句删除的是表中的数据,不是表的定义,即使表中的数据全部被删除,表的定义仍在数据库中。

以上面的数据库为例,删除数学系的学生记录及选课记录。

正确的语句如下:deletefrom 选课where 学号 in (select 学号from 学生where 所在系='数学');deletefrom 学生where 所在系='数学'结果为:显然,语句中使用了两条数据删除语句,一条用于删除选课表,一条用于删除学生表。

由于在删除选课表时需要查询学生表,故不能把这两条语句的执行顺序颠倒了。

假若先删除了学生记录,就得不到数学系学生的学号,对应的选课记录就无法删除了。

所以,对于两个相互制约的表,删除的先后次序不同会导致结果的不同。

2、嵌套子查询和连接查询操作在许多情况下可以进行互换,但是双方都不能完全替代对方,为什么?嵌套子查询不需要两个表有关联字段,而连接查询必须有字段关联(即主外键关系)。

相关主题