精品文档
试验一
交互式 SQL
一 实验目的
1.熟悉数据库的交互式 SQL工具。 2.熟悉通过 SQL对数据库进行操作。 3.完成作业的上机练习。
二 实验工具 SQL Server 2005
利用 SQL Server 2005 及其交互式查询来熟悉
SQL语句。
三 实验内容和要求
1.在 SQLServer 2005 中建立一个数据库,进行实验所要求的各种操作,所有的 SQL操作均在建立的新库里进行;
2.根据以下要求认真填写实验报告,记录所有的实验用例的 SQL语言;
3.1 数据定义
(1)熟悉基本表的创建、修改及删除。 (2)熟悉索引的创建和删除。
3.2 数据操作
(1)完成各类查询操作(单表查询,连接查询,嵌套查询)等;(2)完成各类更新操作(插入数据,修改数据,删除数据) ;
3.3 视图的操作
视图的定义(创建和删除) ,查询,更新(注意更新的条件) 。
3.4 具体操作内容
在 MS SQL Server 中创建学生-课程数据库,要求有学生表( Student)、课程
表 (Course)和选课表( SC),向三个表中分别插入相关数据,再用 SQL 语句完成一下要求的查询。
1.使用 SQL 语言创建下面的三个表。表一:学生信息表( Student)
列名 说明 数据类型 约束
字符串,长度为 10 学号 非空 Sno
字符串,长度为 20 姓名 非空 Sname
字符串,长度为 10 性别 非空 Ssex
字符串,长度为 10 年龄 非空 Sage
字符串,长度为 10 所在系 非空 Sdept
表二:课程信息表( Course)
列 名 说 明 数据类型 约 束 课程号 整形 Cno
字符串,长度为 20 课程名 Cname
先行课 整型 Cpno
学分 整型 Ccredit
表三:学生选课信息表( SC)
.
非空 非空 允许为空
非空
精品文档
数据类型
字符串,长度为 10 学号 Sno
课程号 整型 Cno
字符串,长度为 10 成绩 Grade
2.在以上的三个表中,分别插入下面的数据; 表一:学生信息表( Student)
Sno
Sname
Ssex 男
女 女 男
列名 说明
约束
主码,引用 Student 的外码 主码,引用 Course 的外码
取值 0~100
Sage 20 19 18 19
Sdept CS CS MA IS Ccredit
4 2
李勇 200215121
刘晨 200215122
王敏 200215123
张立 200215125
表二:课程信息表( Course)
Cno Cname
1 2 3 4 5 6 7
Cpno
5
数据库 数学
信息系统 操作系统 数据结构 数据处理 PASCAl 语言
1 6 7
4 3 4 2
6 4
表三:学生选课信息表( SC) Sno Cno 200215121 1 200215121 2 200215121 3 200215122 2 200215122 3
3.根据上面的三种表,写出完成如下查询功能的
(2) 查询选修了课程的学生学号
Grade 92 85 88 90 80
SQL 语句:
(1) 查询全体学生的姓名、出生年份和所在的院系,要求用小写字母表示所有系名 (3) 查询年龄在 20~23 岁(包括 20 岁和 23 岁)之间的学生的姓名、系别、年龄 (4) 查询计算机科学系( CS)、数学系( MA )和信息系( IS)学生的姓名和性别 (5) 查询以“ DB_ ”开头,且倒数第 3 个字符为 i 的课程的详细情况
(6) 查询全体学生情况, 查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排
列
(7) 查询选修 1号课程的学生最高分数、最低分数、平均分数 (8) 查询选修了 3 门课程的学生学号
(9) 查询每一门课的间接先修课(即先修课的先修课) (10) 查询选修 2 号课程且成绩大于等于
90 分的所有学生
(11) 查询与‘刘晨’在同一个系学习的学生
.
精品文档
(12) 查询其他系中比计算机科学系所有学生年龄都小的学生姓名及年龄
(13) 将一个新学生元组(学号: 200215128;姓名:陈冬;性别:男;所在系:IS;年龄:
18 岁)插入到 Student 表中
(14) 将学生 200215121 的年龄改为 22 岁 (15) 删除学号为 200215128 的学生记录 (16) 建立信息系学生的视图
(17) 在信息系学生的视图中找出年龄小于20 岁的学生
(18) 将信息系学生视图 is_Student中学号为 200215122 的学生姓名改为“刘辰”
四 实验报告
4.1 实验环境:
Windows XP
Microsoft SQL server Management Studio 2005
4.2 实验内容与完成情况:
(1) 查询全体学生的姓名、出生年份和所在的院系,要求用小写字母表示所有系名
SELECT Sname NAME, 'Year of Birth:'
BIRTH , 2004 - Sage
BIRTHDAY , LOWER( Sdept DEPARTMENT FROM Student;
(2) 查询选修了课程的学生学号
SELECT DISTINCT Sno FROM SC ;
(3)查询年龄在 20~23 岁(包括 20 岁和 23 岁)之间的学生的姓名、系别、年龄
SELECT Sname , Sdept
, Sage FROM Student
WHERE Sage
BETWEEN 20 AND 23 ;
(4)查询计算机科学系( CS)、数学系( MA )和信息系( IS)学生的姓名和性别
SELECT Sname , Ssex FROM Student
WHERE Sdept
IN( 'CS' , 'MA' , 'IS'
);
(5)查询以“ DB_ ”开头,且倒数第
3 个字符为 i 的课程的详细情况
.
)
精品文档
SELECT * FROM Course WHERE Cname LIKE 'DB\\_%__' ESCAPE'\\' ;
(6) 查询全体学生情况,查询结果按所在系的系号升序排列,同一系中的学生按年龄降序排列
SELECT * FROM Student
ORDER BY Sdept , Sage
DESC;
(7) 查询选修 1号课程的学生最高分数、最低分数、平均分数
SELECT MAX( Grade ) MAX, MIN ( Grade ) MIN , AVG( Grade ) AVG FROM SC WHERECno = '1' ;
(8) 查询选修了 3 门课程的学生学号
SELECT Sno FROM SC GROUP BY Sno HAVING
COUNT(*)> 3;
(8) )查询每个学生及其选修课程的情况 SELECT Student WHERE Student
. Sno , Sname , Ssex , Sage , Sdept . Sno = SC. Sno ;
, Cno , Grade
FROM Student
, SC
(9) ①查询每一门课的间接先修课(即先修课的先修课) SELECT first WHERE first
. Cno , second . Cpno FROM Course first . Cpno =second . Cno ;
, Course second
②查询每一门课的间接先修课(即先修课的先修课)
SELECT first WHERE first
. Cpno =second . Cno and second
(消除有空的行)
, Course second not
null;
. Cpno is
. Cno , second . Cpno FROM Course first
(10) 查询选修 2 号课程且成绩大于等于 ① select
Student
Student . Sno =SC. Sno
and Cno = '2'
90 分的所有学生
Sdept
>= 90 ;
. Sno , Sname , Ssex , Sage ,
and Grade >= '90' );
from Student , SC where
② select
from Sc
.
Sno , Sname , Ssex , Sage , Sdept where Cno ='2'
and grade
from Student where Sno =( select Sno
精品文档
(11) 查询与‘刘晨’在同一个系学习的学生 ①select
Student
Sno , Sname , Sdept
from Student
where
Sdept
in ( select
Sdept
from
where Sname =' 刘晨 ' );
②select ③select
student
S1 . Sno , S1 . Sname , S1 . sdept from Student S1
, student S2
where
S1 . Sdept =s2 . Sdept and S2 . Sname = ' 刘晨 ' ;
from Student
Sno , Sname , Sdept where Sname =' 刘晨 ' ); Sno , Sname , Sdept
where
Sdept
=( select
Sdept
from
④select
from Student
and S2
S1 where exists ( select * from Student
S2 where S2 . Sdept = S1 . Sdept . Sname = ' 刘晨 ' );
(12)查询其他系中比计算机科学系所有学生年龄都小的学生姓名及年龄 ① selectSname , Sage from Student
where Sage and Sdept where Sage and Sdept
selectSage
from Student
where Sdept = 'CS' )
<> 'CS' ; <( select <> 'CS' ;
min ( Sage )
from Student
where Sdept ='CS' )
② selectSname , Sage from Student
(13)将一个新学生元组(学号: 18 岁)插入到 Student 表中
insert values
200215128;姓名:陈冬;性别:男;所在系:
IS;年龄:
into Student ( '200215128' * from Student
( Sno , Sname , Ssex , Sdept ,' 陈冬' ,'男' ,'IS' ,'18'
;
, Sage ) );
select
( 14)将学生 200215121 的年龄改为 22 岁
update select
Student
set Sage
;
= '22'
where Sno = '200215121'
;
* from Student
.
精品文档
( 15)删除学号为 200215128 的学生记录
delete from Student where Sno = '200215128' ;
select
* from Student
;
(16)建立信息系学生的视图
create
view is_Student
as
select
Sno , Sname , Sage
from Student
where
Sdept ='IS'
;
(17)在信息系学生的视图中找出年龄小于
20岁的学生
select
Sno , Sage
from is_Student
where Sage < 20 ;
(18 )将信息系学生视图
is_Student 中学号为 200215122 的学生姓名改为“刘辰”
update is_Student set Sname = ' 刘辰 '
where Sno ='200215122' ;
select
* from is_Student
;
(19 )删除信息系学生视图 is_Student
中学号为 200215125
的记录
delete from is_Student
where Sno = '200215125'
;
select
* from is_Student
;
4.3 出现的问题:
在写第( 9)个查询功能的时候用
select first.Cno,second.Cpno from Course first,Course second
where first.Cpno=second.Cno;这句 SQL语句输出的结果中有的课程没有先修课。
4.4 解决方案(列出遇到的问题和解决办法,列出没有解决的问题)
原因:没有排除掉那些没有先修课的课程,所以查询结果中会有空值。 解决方案:这样写就会把没有先修课的课程给排除掉。
.
:
精品文档
select first.Cno,second.Cpno from Course first,Course second where first.Cpno=second.Cno and second.Cpno is not null;
五 实验感想
通过这次实验课,让我对数据库的书写规范有了更深刻的印象,同时对数据查询,数
据更新,视图的创建、删除、查询、更新有了进一步的了解,对他们的认识不再是那么抽象。现在感觉,理论加实践这种学习方法真的很好,对于巩固知识很有效。
.