数据库实验四
数据库实验四
实验项目名称:T-SQL程序设计实验学时: 4
同组学生姓名:实验地点: b513
实验日期: 2012.11.27 2012.12.04实验成绩:
批改教师:批改时间:
一、实验目的和要求
1、掌握T-SQL中运算符和表达式的使用;
2、通过对Select的使用,掌握Select语句的结构及其应用;
3、掌握T-SQL中几个常用流程控制语句的使用;
4、掌握系统内置函数的概念及其应用;
5、通过定义和使用用户自定义函数,掌握自定义函数的概念及其应用。
二、实验设备、环境
设备:奔腾Ⅳ或奔腾Ⅳ以上计算机;
环境:WINDOWS 2000 SERVER或WINDOWS 2003 SERVER、SQL Server2005中文版。
三、实验步骤
1、根据题目要求熟悉SQL Server2005的各种管理工具;
2、分析题意,重点分析题目要求并给出解决方法;
3、按题目要求完成实际操作任务,并将相关文档资料保存在以自己学号命名的文件夹中;
4、提交完成的实验结果。
四、实验内容
一、SQL查询(*使用SQL Server样例数据库pubs完成)
1、简单查询
(1)查询所有作者的姓名和作者号信息,并在每个作者的作者号前面显示字符串“身份证号:”表明显示信息是身份证信息;(authors表)
(2)改变显示列名。显示所有作者的姓名信息和作者号信息,要求用“名”和“姓”来区别fname和lname,“作者编号”来区分作者号;(authors表)
(3)查询所有书在价格提高10%后的价格和书名信息;(titles表)
(4)查询所有书的书号和税后价格。(titles表,royalty列表示税率);
(5)查询所有作者的姓和“名的第一个字符”以及作者号;(authors表,SUBSTRING函数)
(6)查询邮政编码大于9000的作者姓名和电话信息;(authors表)
(7)查询出版日期在1/1/1991到12/31/1991之间的书名(书名限制为38个字符)和出版日期;(titles 表,SUBSTRING函数)
(8)查询书的类型是mod_cook或trad_cook的书名和它的类型;(titles表)
(9)查询店名中包含Book的店的信息;(stores表);
(10)查询书名以T开头或者出版号为0877,且价格大于16美元的书的信息;(titles表)
(11)查询所有作者的所在城市和州名,要求没有重复信息;(authors表)
(12)按照类型的升序和价格的降序显示书的信息;(titles表)
2、生成汇总数据
(1)计算多少种书已被定价;(titles表)
(2)计算每本书的书号及它的售书总量;(sales表)
(3)求销售量大于30的书号及销售数量;(sales表)
(4)显示在1994年1月1日到1994年10月31日间,每本书的销售总额;(sales表,titles表)3、连接查询
(1)求每本杂志上刊登的文章;(titles, publishers表)
(2)求某书店销售某书的数量;(titles, stores, sales表)
(3)查询所有合著的书及其作者。
(4)显示所有已销售的书名。
4、子查询
(1)查询有销售记录的所有书信息,包括书的编号、书名、类型和价格;
(2)求已销售的书的信息;
二、函数
1、自定义一个名为Sage_func函数,按出生年月计算年龄。然后从Student表中检索出含有年龄的学生信息。
2、定义一个名为grade_func的自定义函数,将成绩从百分制转化为五级记分制。将该用户定义函数用在查询每个学生的成绩中,给出五级记分制的成绩。
三、流程控制
1、Student表中若存在学号为“********”的学生,则显示已存在的信息,否则插入该学生的记录。然后从student表中删除学号为“********”的学生记录,重新执行该程序,观察与上次有何不同。
2、使用While语句求1到100之间的累加和,输出结果。
五、问题解答及实验结果
1、简单查询
(1)查询所有作者的姓名和作者号信息,并在每个作者的作者号前面显示字符串“身份证号:”表明显示信息是身份证信息;(authors表)
1.select'身份证号:'+ au_id,au_fname,au_lname from authors;
(2)改变显示列名。显示所有作者的姓名信息和作者号信息,要求用“名”和“姓”来区别fname和lname,“作者编号”来区分作者号;(authors表)
2.select au_id 作者编号,au_fname 姓,au_lname 名from authors;
(3)查询所有书在价格提高10%后的价格和书名信息;(titles表)
3.select title,price*1.1 from titles;
(4)查询所有书的书号和税后价格。(titles表,royalty列表示税率);
select title_id,price*(1+royalty) price from titles;
(5)查询所有作者的姓和“名的第一个字符”以及作者号;(authors表,SUBSTRING函数)select au_id,au_lname,SUBSTRING(au_fname,1,1)from authors;
(6)查询邮政编码大于9000的作者姓名和电话信息;(authors表)
select au_fname,au_lname,phone from authors where zip>9000;
(7)查询出版日期在1/1/1991到12/31/1991之间的书名(书名限制为38个字
符)和出版日期;(titles 表,SUBSTRING函数)
select SUBSTRING(title,1,38),pubdate from titles where pubdate >'1/1/1991'
and pubdate <'12/31/1991';
(8)查询书的类型是mod_cook或trad_cook的书名和它的类型;(titles表)select title,type from titles where type='mod_cook'or type='trad_cook';(9)查询店名中包含Book的店的信息;(stores表);
4.select*from stores where stor_name like'%Book%';
(10)查询书名以T开头或者出版号为0877,且价格大于16美元的书的信息;(titles表)select*from titles where SUBSTRING(title,1,1)='T'or pub_id =0877 and price > 16;
(11)查询所有作者的所在城市和州名,要求没有重复信息;(authors表)
select DISTINCT city,state from authors;
(12)按照类型的升序和价格的降序显示书的信息;(titles表)
select*from titles order by type asc,price desc;
2、生成汇总数据
(1)计算多少种书已被定价;(titles表)
select count(title_id)from titles where price is not null;
select title_id,sum(qty) qty from sales group by title_id;
(3)求销售量大于30的书号及销售数量;(sales表)
select title_id,sum(qty)qty from sales group by title_id having
(sum(qty)>30);
select titles.title_id ,sum(sales.qty)*titles.price 销售总额from sales,titles
where titles.pubdate between'1/1/1991'and'12/31/1991'group sales.title_id,titles.price,titles.title_id
having(sales.title_id=titles.title_id)
by
3、连接查询
(1)求每本杂志上刊登的文章;(titles, publishers表)
select titles.title,publishers.pub_name from titles,publishers where titles.pub_id = publishers.pub_id
(2)求某书店销售某书的数量;(titles, stores, sales表)
select a.title,b.stor_name,c.qty from titles a,stores b ,sales c
where a.title_id=c.title_id and b.stor_id=c.stor_id
select distinct(a.title_id),b.au_id,a.au_id
from titleauthor a,titleauthor b where a.title_id=b.title_id
(4)显示所有已销售的书名。
select title,sum(qty) qty from sales,titles
where sales.title_id = titles.title_id group by title
4、子查询
(1)查询有销售记录的所有书信息,包括书的编号、书名、类型和价格;
select sales.title_id,titles.title,titles.[type],titles.price from titles,sales sales.title_id=titles.title_id
where
(2)求已销售的书的信息;
二.函数
1、自定义一个名为Sage_func函数,按出生年月计算年龄。然后从Student表中检索出含有年龄的学生信息。
create function Sage_func ( @vardate datetime , @curdate datetime )
returns tinyint
as begin
return datediff ( yy , @vardate , @curdate ) end
select SNO as 学号, SName as 姓名,dbo.Sage_func(Birthday,getdate()) as 年龄 from Student
2、定义一个名为grade_func的自定义函数,将成绩从百分制转化为五级记分制。将该用户定义函数用在查询每个学生的成绩中,给出五级记分制的成绩。
create function grade_func ( @Scorce int )
returns tinyint
as begin return @Scorce/20 end
select SName as 姓名, dbo.grade_func(Scorce) as 五级分制
from Grade,Student where Grade.SNO=Student.SNO
三、流程控制
1.
if exists (select * from Student where SNO='19920101')
begin select * from Student where SNO='19920101' end
else begin
insert into Student values('19920101','王军','男','CS01','下关#','1976-12-21 00:00:00',1.82,10) end
delete from Student where SNO='19920101'
2、使用While语句求1到100之间的累加和,输出结果。流程控制语句为:Declare @sum int, @start int
set @start=1
set @sum=0
begin
while(@start<101)
begin
set @sum=@sum+@start
set @start=@start+1
end
print @sum
end
六、实验体会和收获
这次实验要求我们用各种SQL 查询命令进行对表的一些简单操作,例子很多,在练习的同时也掌握了
SQL查询语句,俗话说熟能生巧嘛,包括了单表查询,连接查询,子查询等等,但即使这样,我觉得还需要继续练习,要做到在没有老师同学帮助,没有参考资料的时候能够独立完成的漂漂亮亮。这次实验的内容比较多,时间比较紧,所以在做的时候有点匆忙,幸好在上实验课之前有预习,在理论课上对数据库理论知识的了解基础上,并在自己动手之前,有老师的详细讲解和指导,我慢慢熟悉了对查询操作,在实验课上,操作起来也更便捷和熟练,重要的一点,在上课时要记得认真做笔记,把自己的语句记下来,认真整理实验结果。最后,实验安排了函数的训练,这是SQL Server功能的又一体现,不过强大归强大,还必须得掌握才行,我得加油了!
因篇幅问题不能全部显示,请点此查看更多更全内容