一、 实验目的和要求
(1)掌握SQL Server查询分析器的使用方法,加深对SQL和Transact-SQL语言的查询语句的理解。
(2)熟练掌握简单表的数据查询、数据排序和数据连接查询的操作方法。
(3)熟练掌握数据查询中的分组、统计、计算和组合的操作方法。
二、 实验内容和原理
1. 简单查询操作
该实验包括投影、选择条件表达、数据排序、使用临时表等。
2. 连接查询操作
该实验包括等值连接、自然连接、求笛卡尔积、一般连接、外连接、内连接、左连接、右连接和自连接等。
3. 在SQL Server查询分析器中使用IN、比较符、ANY或ALL和EXISTS操作符进行嵌套查询操作。
4. 分组查询实验。该实验包括分组条件表达、选择组条件的表达方法。
5. 使用函数查询的实验。该实验包括统计函数和分组统计函数的使用方法。
6. 组合查询实验。
7. 计算和分组计算查询的实验。
三、 实验环境
硬件:计算机
软件:Windows 2000和SQL Server 2000
四、 算法描述及实验步骤
1. 基本操作实验
用Transact-SQL语句表示下列操作.在学生-课程库中实现其数据查询操作:
(1)求数学系学生的学号和姓名。
select sno,sname
from student
where sdept ='MA'
(2)求选修了高等数学的学生学号、姓名和成绩。
select sc.sno,sname,grade
from student,sc,course
where sc.cno=course.cno and cname='数学' and student.sno
=sc.sno
(3)求选修C1课程的学生学号和成绩,并要求对查询结果按成绩降序排列,如果成绩相同则按学号升序排列。
select sno,grade
from sc
where cno ='1'
order by grade desc,sno asc
(4)获选修课程C1且成绩在80~90分之间的学生学号、姓名及成绩,并将成绩乘以系数0.8输出。
select student.sno,sname,grade*0.8
"grade*0.8"
from sc,student
where cno ='1'and grade between 80 and 90 and student.sno
=sc.sno
(5)求数学系或计算机系姓张的学生的信息。
select *
from student
where (sdept ='CS' or sdept ='MA') and sname like'张%'
(6)求缺少了成绩的学生的学号和课程号。
select sno,cno
from sc
where grade is null
(7)求C1课程的成绩高于张三的学生学号和成绩。
select sno,cno
from sc
where cno ='1'and
grade >
(select grade
from sc,student
where sname ='张三' and student.sno =sc.sno and cno ='1')
(8)求其他系中比计算机系学生年龄都小的学生。
select *
from student
where sdept !='cs' and sage <
(
select min(sage)
from student
where sdept ='cs'
)
(9)查询选修了全部课程的学生的姓名。
select Sname
from student
where Sno IN
(select Sno from SC
group by Sno
having count(*) = (select count(*) from course )
)
(10)求至少选修了学生“张三”所选修的全部课程的学生学号和姓名。
select distinct scx.sno,sname
from sc scx,student
where scx.sno =student.sno and not exists
(select *
from sc scy,student
where sname ='张三'and scy.sno =student.sno and not exists
(select *
from sc scz
where scx.sno =scz.sno and scy.cno =scz.cno))
(11)查询每一门课的间接先行课(即先行课的先行课)。
select c1.cno,c2.cpno
from course c1,course c2
where c1.cpno =c2.cno
在图书-图书库中实现其查询操作。
(1)查找这样的图书类别:要求类别中最高的图书定价不低于全部按类别分组的图书平均定价的2倍。
select 类别
from 图书
group by 类别
having max(定价)>=all
(select avg(定价)*2
from 图书
group by 类别)
(2)求机械工业出版社出版的各类图书的平均定价,用GROUP BY表示。
select distinct 类别, avg(定价) '平均定价'
from 图书
where 出版社 ='机械工业出版社'
group by 类别
(3)列出计算机类图书的书号、名称及价格,最后求出册数和总价格。
SELECT 书号,书名,定价
FROM 图书
WHERE 类别='计算机' ORDER BY 书号 ASC
COMPUTE count (书号),SUM(定价)
(4)列出计算机类图书的书号、名称及价格,并求出各出版社这类书的总价格,最后求出全部册数和总价格。
select 书号,书名,定价
from 图书
where 类别='计算机'
order by 出版社
compute sum(定价) by 出版社
(5)查询计算机类和机械工业出版社出版的图书。
select 书号,书名
from 图书
where 类别='计算机'and 出版社 ='机械工业出版社'
(6)在图书-借阅库中实现其查询操作:将计算机类的书存入永久的计算机图书表中,将借书日期在1999年以前的借阅记录存入临时的超期借阅表。
SELECT *
INTO 计算机图书
FROM 图书
WHERE 类别='计算机'
GO
SELECT *
INTO #超期借阅
FROM 借阅
WHERE 借阅日期< '1999-01-01'
GO
(1)按表1的格式,建立职工部门库和职工表、部门,并向表中输入数据。
表1 职工和部门表数据
职工表 部门表
职工号
姓名
性别
年龄
部门
1010
李勇
男
20
11
1011
刘晨
女
19
1012
王敏
女
22
12
1013
张立
男
21
13
部门号
部门名称
电话
11
生产科
566
12
计划科
578
13
一车间
467
14
科研所
(2)用Transact-SQL语句表示职工和部门之间的内连接、左外部连接和右外部连接,在职工部门库中实现其数据内连接和各种外查询操作。
1.等值连接
select 职工表.*,部门表.*
from 职工表,部门表
where 职工表.部门=部门表.部门号
2.自然连接
select 职工号,姓名,性别,年龄,部门,部门名称
from 职工表,部门表
where 职工表.部门=部门表.部门号
3.左外连接
select 职工号,姓名,性别,年龄,部门,部门名称
from 职工表
left outer join 部门表 on(职工表.部门=部门表.部门号)
4.右外连接
select 职工号,姓名,性别,年龄,部门,部门名称
from 职工表
right outer join 部门表 on(职工表.部门=部门表.部门号)
五、 调试过程
1、 在查询求数学系或计算机系姓张的学生的信息时,出现如下错误提示:
代码如下:
select *
from student
where sdept ='CS' or sdept ='MA' and sname like'张%'
分析下,明白了代码应该改为如下:
select *
from student
where (sdept ='CS' or sdept ='MA') and sname like'张%'
2、 在查询求缺少了成绩的学生的学号和课程号时,出现如下错误提示:
代码如下:
select sno,cno
from sc
where grade = null
分析下原因,原来是 =和is的差别,改代码如下:
select sno,cno
from sc
where grade is null
六、 实验结果
1. 基本操作实验
用Transact-SQL语句表示下列操作.
在学生-课程库中实现其数据查询操作:
(1)求数学系学生的学号和姓名。
(2)求选修了高等数学的学生学号、姓名和成绩。
(3)求选修C1课程的学生学号和成绩,并要求对查询结果按成绩降序排列,如果成绩相同则按学号升序排列。
(4)获选修课程C1且成绩在80~90分之间的学生学号、姓名及成绩,并将成绩乘以系数0.8输出。
(5)求数学系或计算机系姓张的学生的信息。
(6)求缺少了成绩的学生的学号和课程号。
(7)求C1课程的成绩高于张三的学生学号和成绩。
(8)求其他系中比计算机系学生年龄都小的学生。
(9)查询选修了全部课程的学生的姓名。
(10)求至少选修了学生“张三”所选修的全部课程的学生学号和姓名。
(11)查询每一门课的间接先行课(即先行课的先行课)。
在图书-图书库中实现其查询操作。
(1)查找这样的图书类别:要求类别中最高的图书定价不低于全部按类别分组的图书平均定价的2倍。
(2)求机械工业出版社出版的各类图书的平均定价,用GROUP BY表示。
(3)列出计算机类图书的书号、名称及价格,最后求出册数和总价格。
(4)列出计算机类图书的书号、名称及价格,并求出各出版社这类书的总价格,最后求出全部册数和总价格。
(5)查询计算机类和机械工业出版社出版的图书。
(6)在图书-借阅库中实现其查询操作:将计算机类的书存入永久的计算机图书表中,将借书日期在1999年以前的借阅记录存入临时的超期借阅表。
2. 提高操作实验
(1)按表1的格式,建立职工部门库和职工表、部门,并向表中输入数据。
(2)用Transact-SQL语句表示职工和部门之间的内连接、左外部连接和右外部连接,在职工部门库中实现其数据内连接和各种外查询操作。
1.等值连接
2.自然连接
3.左外连接
4.右外连接
七、 总结
这次数据库实验主要是考察我们对简单查询和连接查询的掌握。虽然在理论学习的时候觉得很简单,凭空的去想想结果是什么样子的,但是不能够实践。从这次实验中,让我们将理论知识应用到实践中来,通过编写一些命令语句,结果就能呈现在我们眼前。
这次实验中要写的语句虽然很多,但是当我把它们一个一个的写出来,并运行成功的时候,觉得很有成就感。不过因为自己的粗心还有对一些语句书写的不够熟练,做实验用了很长时间。在这很长时间中,增加了我们对各种情况下查找命令语句的熟悉程度,使实验报告顺利的完成,觉得非常值得。