FETCH NEXT FROM st_cursor INTO @c_name,@s_avg --打印表标题
PRINT '课程 平均分'
PRINT '-----------------' WHILE @@FETCH_STATUS = 0 BEGIN
--打印一行数据
PRINT @c_name+' '+CAST(@s_avg AS char(10)) --提取下一行数据
FETCH NEXT FROM st_cursor INTO @c_name,@s_avg END
--关闭游标
CLOSE st_cursor --释放游标
DEALLOCATE st_cursor GO
第10第1章章 SQL高级应用 网站与网页概述
6
其执行结果如下:
23.编写一个程序,采用游标方式输出所有学号、课程号和成绩等级。 解:程序如下:
USE school GO
--声明变量
DECLARE @no1 char(5),@no2 char(6),@fs char(2) --声明游标
DECLARE fs_cursor CURSOR FOR SELECT sno,cno, CASE
WHEN degree>=90 THEN 'A' WHEN degree>=80 THEN 'B' WHEN degree>=70 THEN 'C' WHEN degree>=60 THEN 'D' WHEN degree<60 THEN 'E' END
FROM score WHERE degree IS NOT NULL ORDER BY sno --打开游标
OPEN fs_cursor --提取第一行数据
FETCH NEXT FROM fs_cursor INTO @no1,@no2,@fs --打印表标题
PRINT '学号 课程号 等级' PRINT '-----------------' WHILE @@FETCH_STATUS = 0 BEGIN
--打印一行数据
PRINT @no1+' '+@no2+' '+@fs --提取下一行数据
FETCH NEXT FROM fs_cursor INTO @no1,@no2,@fs END
--关闭游标
CLOSE fs_cursor --释放游标
DEALLOCATE fs_cursor GO
其执行结果如下:
第10第1章章 SQL高级应用 网站与网页概述
7
24.编写一个程序,采用游标方式输出各班各课程的平均分。 解:程序如下:
USE school GO
--声明变量
DECLARE @bh char(5),@kc char(10),@fs float --声明游标
DECLARE fs_cursor CURSOR
FOR SELECT s.sclass,c.cname,AVG(sc.degree) FROM student s,course c,score sc
WHERE s.sno=sc.sno AND c.cno=sc.cno AND sc.degree IS NOT NULL GROUP BY s.sclass,c.cname --打开游标
OPEN fs_cursor --提取第一行数据
FETCH NEXT FROM fs_cursor INTO @bh,@kc,@fs --打印表标题
PRINT '班号 课程 平均分'
PRINT '---------------------------' WHILE @@FETCH_STATUS = 0 BEGIN
--打印一行数据
PRINT @bh+' '+@kc+' '+CAST(@fs AS varchar(10)) --提取下一行数据
FETCH NEXT FROM fs_cursor INTO @bh,@kc,@fs END
--关闭游标
CLOSE fs_cursor --释放游标
DEALLOCATE fs_cursor GO
其执行结果如下:
上机实验题5参考答案
在上机实验题4建立的factory数据库上,完成如下各题(所有SELECT语句的查询结果以文本格式显示)。 (1)删除factory数据库上各个表之间建立的关系。 (2)显示各职工的工资记录和相应的工资小计。
(3)按性别和部门名的所有组合方式列出相应的平均工资。
第10第1章章 SQL高级应用 网站与网页概述
8
(4)在worker表中使用以下语句插入一个职工记录:
INSERT INTO worker VALUES(20,'陈立','女','55/03/08',1,'75/10/10',4)
在depart表中使用以下语句插入一个部门记录:
INSERT INTO depart VALUES(5,'设备处')
对worker和depart表进行全外连接显示职工的职工号、姓名和部门名,然后删除这两个插入的记录。
(5)显示最高工资的职工的职工号、姓名、部门名、工资发放日期和工资。 (6)显示最高工资的职工所在的部门名。
(7)显示所有平均工资低于全部职工平均工资的职工的职工号和姓名。 (8)采用游标方式实现(6)小题的功能。 (9)采用游标方式实现(7)小题的功能。 (10)先显示worker表中的职工人数,开始一个事务,插入一个职工记录,再显示worker表中的职工人数,回滚该事务,最后显示worker表中的职工人数。
操作过程
(1)删除factory数据库上各个表之间建立的关系的操作步骤如下:
①启动SQL Server管理控制器。
②在“对象资源管理器”中展开LCB-PC服务器节点。 ③展开“数据库”节点。 ④选中school,将其展开。
⑤展开“数据库关系图”节点。
⑥选中dbo.Diagram_1,右击,在出现的快捷菜单中选择“修改”命令,如图10.1所示。 ⑦在数据库关系图中,选择表示要从关系图中删除的关系的连接线(对于两条连线均进行⑦~⑨的操作)。
⑧右击关系线,从快捷菜单中选择“从数据库中删除关系”命令。 ⑨出现一个消息框,提示确认删除。单击“是”按钮。 ⑩在出现的对话框中单击“是”按钮保存所做的修改。
这样就将worker表和depart表以及worker表和salary表之间的关系删除了。
图10.1 factory数据库关系图
第10第1章章 SQL高级应用 网站与网页概述
9
(2)对应的程序如下:
USE factory GO
SELECT worker.职工号,worker.姓名,salary.工资 FROM worker,salary
WHERE worker.职工号=salary.职工号 ORDER BY worker.职工号,worker.姓名
COMPUTE SUM(salary.工资) BY worker.职工号 GO
执行结果如下:
职工号姓名工资
---------- ---------- ---------------------- 1 孙华 1201.5 1 孙华 12010.5 sum
---------------------- 2408
职工号姓名工资
---------- ---------- ---------------------- 10 陈涛 1245.8 10 陈涛 1250.8 sum
---------------------- 24910.6
职工号姓名工资
---------- ---------- ---------------------- 11 刘欣 1255 11 刘欣 1250 sum
---------------------- 2505
职工号姓名工资
---------- ---------- ---------------------- 12 李涵 1345 12 李涵 1350 sum
---------------------- 2695
职工号姓名工资
---------- ---------- ---------------------- 13 王小燕 1205 13 王小燕 1200 sum
---------------------- 2405
职工号姓名工资
---------- ---------- ---------------------- 14 李艺 1000.6 14 李艺 1005.6 sum
---------------------- 20010.2
职工号姓名工资
---------- ---------- ---------------------- 15 魏君 1105 15 魏君 1100 sum
---------------------- 2205
职工号姓名工资
---------- ---------- ---------------------- 2 孙天奇 905 2 孙天奇 900 sum
---------------------- 1805
职工号姓名工资
---------- ---------- ---------------------- 3 陈明 1350.6 3 陈明 1355.6 sum
---------------------- 27010.2
职工号姓名工资
---------- ---------- ---------------------- 4 李华 1500.5 4 李华 1505.5 sum
---------------------- 3006
职工号姓名工资
---------- ---------- ---------------------- 5 余慧 730 5 余慧 725 sum
---------------------- 1455
职工号姓名工资
---------- ---------- ---------------------- 6 欧阳少兵 1085 6 欧阳少兵 1085 sum
---------------------- 2170
职工号姓名工资
---------- ---------- ---------------------- 7 程西 755.8 7 程西 750.8 sum
---------------------- 15010.6
职工号姓名工资
---------- ---------- ---------------------- 8 张旗 728 8 张旗 733 sum
第10第1章章 SQL高级应用 网站与网页概述
10