南昌大学数据库实验报告 下载本文

图一

图二

图三

七、思考讨论题或体会或对改进实验的建议

1.说明数据库和表的关系?

答:一个SQL数据库是由多个表构成的,即数据库是表的汇集,是表的主要组成部分。 表在数据库中是存储数据的方式。

2.遇到的问题及解决的方法

答:在修改学号时提示输入的值与数据类型不一致,或者此值与列的长度不一致。 解决办法:多打了空格。删去控制字节数。

3.体会或建议

答:企业管理器与查询分析器各有优势。企业管理器中输入数据方便,查询分析器方便进行查询等操作。

八、参考资料

1.《数据库系统实验指导》,单建魁等著,清华大学出版社

11

南昌大学实验报告

学生姓名: 学 号: 专业班级: 信息管理 实验类型:□ 验证 □ 综合 □ 设计 □ 创新 实验日期: 实验成绩:

一、实验项目名称:表的查询 二、实验目的:

1.了解查询的概念和方法,掌握查询分析器的使用方法 2.掌握select语句的语法和作用

3.掌握多表连接的方法,能熟练进行多表操作的复杂检索

三、实验基本原理

数据库查询是数据库的核心操作。SQL提供了SELECT语句进行数据库的查询,该语句具有灵活的使用方式和丰富的功能。其一般格式为:

SELECT [ALL | DISTINCT ]<目标列表达式>[,<目标列表达式>]....... FROM <表名或视图名>[,<表名或视图名>]...... [WHERE <条件表达式>]

[GROUP BY <列名1>[ HAVING <条件表达式>] ] [ORDER BY <列名2>[ASC | DESC ] ];

整个SELECT语句的含义是,根据WHERE子句的条件表达式,从FROM子句指定的基本表或视图中找出满足条件的元组,再按SELECT子句中的目标列表达式,选出元组中的属性值形成结果表。

如果有GROUP BY子句,则将结果按<列名1>的值进行分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。如果GROUP BY子句带HAVING短语,则只有满足指定条件的组才予以输出。

如果有ORDER BY 子句,则结果还要按<列名2>的值的升序或降序排列。

SELECT语句既可以完成简单的单表查询,也可以完成复杂的连接查询和嵌套查询。 视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。视图已经定义,就可以和基本表一样被查询、被删除。也可以在一个视图之上再定义新的视图,但对视图的更新(增、删、改)操作则有一定的限制。

SQL语言用CREATE VIEW 命令建立视图,其一般格式为

CREATE VIEW<视图名>[(<列名>[,<列名>]....)] AS <子查询> [WITH CHECK OPTION];

其中,子查询可以是任意复杂的SELECT语句,但通常不允许含有ORDER BY 子句和DISTINCT短语。

WITH CHECK OPTION表示对视图进行UPDATE,INSERT和DELECT操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)。

删除视图的格式为 DROP VIEW<视图名>[CASCADE]; 视图定义后就可以像对基本表一样对视图进行查询了。

12

四、主要仪器设备及耗材

相互连成LAN的计算机2台以上,安装有SQL Server 2000软件。

五、实验步骤

1.单表查询

(1)了解select语句的语法

(2)输入一些检索数据,进行简单的检索,并使用top,distinct等关键字 查询所有学生的详细情况:

select * from Student;

查询选修了课程的学生学号: select distinct Sno from SC;

查询考试成绩低于80分的学生学号

select distinct Sno from SC where Grade<80; 查询学号为2015052201的学生的详细情况 select * from Student where Sno ='2015052201';

查询年龄在18-19岁之间的学生的姓名、系别和年龄:

select Sname,Sdept,Sage from Student where Sage between 18 and 19; 查询计算机科学系CS的学生姓名和性别:

select Sname,Ssex from Student where Sdept in('CS'); 查询不是数学系MA的学生姓名和性别:

select Sname,Ssex from Student where Sdept not in('MA');

查询选修了1号课程的学生学号及成绩,查询结果按分数降序排列: select Sno,Grade from SC where Cno='1' order by Grade DESC;

查询选课学生的情况,查询结果按课程号升序排列,同一门课程按学号降序排列: select * from SC order by Cno,Sno DESC; 查询选修了1号课程的学生的最高分: select max(grade) from SC where Cno='1'; 求出各个课程号及相应的选课人数:

select Cno,count(distinct Sno)from SC group by Cno; 2.多表查询 (1)连接查询

查询计算机科学系CS年龄在20岁以下的学生姓名:

select distinct Sname from Student,SC where Sdept='CS'and Sage<20; 查询选修了4号课程且成绩在85分以上的所有学生: select Student.Sno,Student.Sname from Student,SC

where Student.Sno=SC.Sno and SC.Cno='4' and grade>85; 查询学生131003的平均分

select avg(Grade) as average from SC,Course where Sno='2015052206'and SC.Cno=Course.Cno; (2)嵌套查询

查询选修了6号课程且成绩在80分以上的所有学生

select Student.Sno,Student.Sname from Student,SC where Student.Sno=SC.Sno and SC.Cno='6' and grade>80;

13

查询与远坂凛同样专业的学生:

select Sno,Sname from Student where Sdept in(select Sdept from Student where Sname='远坂凛');

查询已经选课“操作系统”的学生的姓名 select Sname From Student where

exists(select * from SC where Sno=Student.Sno and Cno='4'); 找出每个学生超过他选修课程平均成绩的课程号 select Sno, Cno from SC x

where grade>(select avg(Grade)from SC y where y.Sno=x.Sno); 3.视图的建立及使用视图进行检索

建立CS系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有该系的学生: create view CS_Student as select Sno,Sname,Sage,Ssex from Student where Sdept='CS' 建立一个由学生学号和他的平均成绩定义的视图:

create view S_G(Sno,Gavg) as select Sno,avg(Grade)from Student group by Sno 删除视图CS_Student: drop view CS_Student;

在S_G视图中查询平均成绩在80分以上的学生学号和平均成绩: select Sno,Gavg from S_G where Gavg>=80;

将CS_Student视图中学号为2015052210的学生姓名改为“桐人”: update CS_Student set Sname='桐人'where Sno='2015052210';

向CS_Student视图中插入一个新的学生记录,学号为2015052211,姓名为新一,男,20岁。

insert into CS_Student values('2015052211','新一','20','男'); 删除信息管理系学生视图中学号为2015052211的记录: delete from CS_Student where Sno='2015052211';

六、实验数据及处理结果

建立的数据库名和表名及数据如实验二,各查询的结果依次如下图: 1.单表查询

1)所有学生的详细情况 2)查询选修了课程的学生学号

14

3)查询考试成绩低于80分的学生学号 4)查询学号为2015052201的学生的详细情况

5)查询年龄在18-19岁之间的学生的姓名、系别和年龄 6)查询计算机科学系CS的学生姓名和性别

7)查询不是数学系MA的学生姓名和性别 8)查询选修了1号课程的学生学号及成绩,查询结果按分数降序排列

15