数据库实验4实验报告.docx
- 文档编号:12540312
- 上传时间:2023-04-20
- 格式:DOCX
- 页数:19
- 大小:244.47KB
数据库实验4实验报告.docx
《数据库实验4实验报告.docx》由会员分享,可在线阅读,更多相关《数据库实验4实验报告.docx(19页珍藏版)》请在冰豆网上搜索。
数据库实验4实验报告
淮海工学院计算机工程学院
实验报告书
课程名:
《数据库原理及应用》
题目:
T-SQL高级应用
班级:
软件132
学号:
**********
******
一.目的与要求
1.掌握复杂查询的使用方法;
2.掌握多表连接的方法;
3.掌握SELECT语句在多表查询中的应用。
4.掌握数据汇总、外连接查询的使用方法;
5.掌握事务定义的一般方法
二.实验内容
1.给出教材14-16的程序运行结果。
2.编写程序,查询“1033”班的最高分的学生的学号、姓名、班号、课程号和分数。
3.编写程序,创建一个新表,包含所有学生的姓名、课程名和分数,并以姓名排序。
4.编写程序,输出每个班最高分的课程名和分数。
5.在上次实验建立的factory数据库的基础上,完成如下各题:
●删除factory数据库上各个表之间建立的关系;
●显示各职工的工资记录和相应的工资小计。
●按性别和部门名的所有组合方式列出相应的平均工资。
●在worker表中使用以下语句插入一个职工记录:
insertintoworkervalues(20,’陈立’,‘女’,’55/03/08’,1,’75/10/10’,4),在depart表中使用以下语句插入一个部门记录:
insertintodepartvalues(5,’设备处’)。
再对worker和depart表进行全外连接显示职工的职工号,姓名和部门名。
然后删除这两个插入的记录。
●显示最高工资的职工的职工号、姓名、部门名、工资发放日期和工资。
●显示最高工资的职工所在的部门名。
●显示所有平均工资低于全部职工平均工资的职工的职工号和姓名。
●先显示worker表中的职工人数,开始一个事务,插入一个职工记录,再显示worker表中的职工人数,回滚该事务,最后显示worker表中的职工人数。
三.实验步骤
删除factory数据库上各个表之间建立的关系的操作步骤如下:
①启动SQLServer管理控制器。
②在“对象资源管理器”中展开LCB-PC服务器节点。
③展开“数据库”节点。
④选中,将其展开。
⑤展开“数据库关系图”节点。
⑥选中dbo.Diagram_1,右击,在出现的快捷菜单中选择“修改”命令,如图5.1所示。
⑦在数据库关系图中,选择表示要从关系图中删除的关系的连接线(对于两条连线均进行⑦~⑨的操作)。
⑧右击关系线,从快捷菜单中选择“从数据库中删除关系”命令。
⑨出现一个消息框,提示确认删除。
单击“是”按钮。
⑩在出现的对话框中单击“是”按钮保存所做的修改。
这样就将worker表和depart表以及worker表和salary表之间的关系删除了。
四.测试数据与实验结果
第1-14题图
第1-15题图
第1-16题图
第2题图
第3题图
第4题图
图5.1
第5-2题图
第5-3题图
第5-4题图
第5-5题图
第5-6题图
第5-7题图
第5-8题图
第5-9题图
第5-10题图
五.结果分析与实验体会
在FROM子句中指定连接条件,有助于将这些连接条件与WHERE子句中的其他搜索条件分开,指定连接时建议使用这种方法。
如果某个表只出现在子查询中而不出现在外部查询中,那么该表中的列就无法包含在输出中(外部查询的选择列表)。
使用EXISTS引入的子查询在以下几方面与其他子查询略有不同:
EXISTS关键字前面没有列名,常量或其他表达式。
由EXISTS引入的子查询的选择列表通常都是由星号(*)组成。
由于只是测试是否存在符合子查询中指定条件的行,所以不必列出列名。
六.源码
1
useschool
select学号,课程号,分数
fromscore
where学号in(103,105)
orderby学号
computeavg(分数)by学号
go
2
useschool
go
selectstudent.班号,course.课程名,avg(score.分数)as'平均分'
fromstudent,course,score
wherestudent.学号=score.学号andcourse.课程号=score.课程号
groupbystudent.班号,course.课程名withcube
go
3
useschool
go
begintransactionMytran
insertintoteacher
values('999','张英','男','1960/03/05','教授','计算机系')
savetransactionMytran
insertintoteacher
values('888','胡丽','男','1982/08/04','副教授','电子工程系')
rollbacktransactionMytran
committransaction
go
select*fromteacher
go
deleteteacherwhere编号='999'
go
4
useschool
selectstudent.学号,student.姓名,student.班号,score.课程号,score.分数
fromstudent,score
where分数in
(selectmax(分数)
fromscore
where班号='1033'andstudent.学号=score.学号)
5
USEschool
go
SELECTs.姓名,c.课程名,sc.分数
INTOstud
FROMstudents,coursec,scoresc
WHEREs.学号=sc.学号andc.课程号=sc.课程号andsc.分数isnotnull
ORDERBYs.姓名
SELECT*FROMstud
Go
6
USEschool
GO
SELECT班号,课程名,MAX(分数)分数
FROM(SELECTs.学号,s.姓名,s.班号,c.课程名,sc.分数
FROMstudents,coursec,scoresc
WHEREs.学号=sc.学号ANDc.课程号=sc.课程号AND分数ISNOTNULL)T
GROUPBY班号,课程名
ORDERBY班号
GO
7
USEfactory
GO
SELECTworker.职工号,worker.姓名,salary.工资
FROMworker,salary
WHEREworker.职工号=salary.职工号
ORDERBYworker.职工号,worker.姓名
COMPUTESUM(salary.工资)BYworker.职工号
GO
8
USEfactory
GO
SELECTworker.性别,depart.部门名,AVG(salary.工资)AS'平均工资'
FROMworker,depart,salary
WHEREworker.职工号=salary.职工号ANDworker.部门号=depart.部门号
GROUPBYworker.性别,depart.部门名WITHCUBE
GO
9
USEfactory
GO
INSERTINTOworkerVALUES('20','陈立','女','55/03/08',1,'75/10/10',4)
GO
INSERTINTOdepartVALUES(5,'设备处')
GO
SELECTworker.职工号,worker.姓名,depart.部门名
FROMworkerFULLJOINdepart
ON(worker.部门号=depart.部门号)
ORDERBYworker.职工号
GO
DELETEFROMworkerWHERE职工号='20'
GO
DELETEFROMdepartWHERE部门号=5
GO
10
USEfactory
GO
SELECTworker.职工号,worker.姓名,depart.部门名,salary.日期,salary.工资
FROMworker,depart,salary
WHEREworker.部门号=depart.部门号ANDworker.职工号=salary.职工号
ANDsalary.工资=
(SELECTMAX(工资)
FROMsalary)
GO
11
USEfactory
GO
SELECT部门名
FROMdepart
WHERE部门号=
(SELECT部门号
FROMworker
WHERE职工号=
(SELECT职工号
FROMsalary
WHERE工资=
(SELECTMAX(工资)
FROMsalary)
))
GO
12
USEfactory
GO
SELECT职工号,姓名
FROMworker
WHERE职工号IN
(SELECT职工号
FROMsalary
GROUPBY职工号
HAVINGAVG(工资)<(SELECTAVG(工资)FROMsalary)
)
GO
13
USEfactory
GO
SETNOCOUNTON
--声明变量
DECLARE@dnamechar(10)
--声明游标
DECLAREd_cursorCURSOR
FORSELECT部门名
FROMdepart
WHERE部门号=
(SELECT部门号
FROMworker
WHERE职工号=
(SELECT职工号
FROMsalary
WHERE工资=
(SELECTMAX(工资)
FROMsalary)
)
)
--打开游标
OPENd_cursor
--提取第一行数据
FETCHNEXTFROMd_cursorINTO@dname
--打印表标题
PRINT'部门名'
PRINT'---------'
WHILE@@FETCH_STATUS=0
BEGIN
--打印一行数据
PRINT@dname
--提取下一行数据
FETCHNEXTFROMd_cursorINTO@dname
END
--关闭游标
CLOSEd_cursor
--释放游标
DEALLOCATEd_cursor
GO
14
USEfactory
GO
SETNOCOUNTON
--声明变量
DECLARE@noint,@namechar(10)
--声明游标
DECLAREw_cursorCURSOR
FORSELECT职工号,姓名
FROMworker
WHERE职工号IN
(SELECT职工号
FROMsalary
GROUPBY职工号
HAVINGAVG(工资)<(SELECTAVG(工资)FROMsalary))
--打开游标
OPENw_cursor
--提取第一行数据
FETCHNEXTFROMw_cursorINTO@no,@name
--打印表标题
PRINT'职工号姓名'
PRINT'-----------------'
WHILE@@FETCH_STATUS=0
BEGIN
--打印一行数据
PRINTCAST(@noASchar(8))+@name
--提取下一行数据
FETCHNEXTFROMw_cursorINTO@no,@name
END
--关闭游标
CLOSEw_cursor
--释放游标
DEALLOCATEw_cursor
GO
15
USEfactory
GO
DECLARE@numint
SELECT@num=COUNT(*)FROMworker
PRINT'原职工人数:
'+CAST(@numASCHAR(3))
GO
DECLARE@numint
BEGINTRANSACTION--启动事务
--插入一个职工记录
INSERTINTOworkerVALUES(20,'陈立','女','55/03/08',1,'75/10/10',4)
PRINT'插入一个职工记录'
SELECT@num=COUNT(*)FROMworker
PRINT'职工人数:
'+CAST(@numASCHAR(3))
ROLLBACKTRANSACTION--回滚事务
GO
PRINT'回滚事务'
DECLARE@numint
SELECT@num=COUNT(*)FROMworker
PRINT'职工人数:
'+CAST(@numASCHAR(3))
GO
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)