数据库系统及应用课后练习答案

通过指定的物理文件名、文件的大小等向操作系统申请物理存储空间。 5. 略。 习题五 1. 全部工作。

2. 1) 2) 3) 4)

以图5-1的数据库为例,用SQL完成以下检索: 检索在北京的供应商的名称。 检索发给供应商S6的订购单号。

检索出职工E6发给供应商S6的订购单信息。

检索出向供应商S3发过订购单的职工的职工号和仓库号。 试概述SQL语言的功能。

试述SQL Server企业管理器的功能。

SQL是一种一体化的语言,它包括了数据定义、数据查询、数据操纵和数据控制等方面的功能,它可以完成数据库活动中的

SELECT * FROM 供应商 WHERE 地址=’北京’

SELECT 订购单号 FROM 订购单 WHERE 供应商号=’S6’ SELECT * FROM 订购单 WHERE 供应商号=’S6’ AND 职工号=’E6’ SELECT 职工号,仓库号 FROM 职工 WHERE 职工号 IN ( SELECT 职工号 FROM 订购单 WHERE 供应商号=’S3’ ) 5)

检索出目前与S3供应商没有联系的职工信息。

SELECT * FROM 职工 WHERE 职工号 NOT IN

( SELECT 职工号 FROM 订购单 WHERE 供应商号=’S3’ ) 6)

检索出目前没有任何订购单的供应商信息。

SELECT * FROM 供应商 WHERE NOT EXISTS

( SELECT * FROM 订购单 WHERE 供应商号=供应商.供应商号 ) 7)

检索出和职工E1、E3都有联系的北京的供应商信息。

SELECT * FROM 供应商 WHERE 供应商号 IN

( SELECT 供应商号 FROM 订购单 WHERE 职工号=’E1’ ) AND 供应商号 IN

( SELECT 供应商号 FROM 订购单 WHERE 职工号=’E3’ ) 8)

检索出目前和华通电子公司有业务联系的每个职工的工资。

SELECT 职工号,工资 FROM 职工 WHERE 职工号 IN (SELECT 职工号 FROM 订购单 WHERE 供应商号 IN

(SELECT 供应商号 FROM 供应商 WHERE 供应商名=’华通电子公司’)) 9)

from 供应商

where 供应商号 not in --('s4','s7')--该供应商无与E3的订单 (select distinct 供应商号

检索出与工资在1220元以下的职工没有联系的供应商的名称。

select distinct 供应商名,供应商号

from 订购单

where 供应商号 is not null and 10)

)

--该供应商有下过订单 and 供应商号 in

(select distinct 供应商号 from 订购单)

检索出向S4供应商发出订购单的仓库所在的城市。

职工号 in (select 职工号--该职工工次低于1220,只有E3 from 职工 where 工资<1220)

SELECT 城市 FROM 仓库 WHERE 仓库号 IN (SELECT 仓库号 FROM 职工 WHERE 职工号 IN (SELECT 职工号 FROM 订购单 WHERE 供应商号='S4')) 11)

检索出在上海工作并且向S6供应商发出了订购单的职工号。

SELECT 职工号 FROM 职工 WHERE 仓库号 IN (SELECT 仓库号 FROM 仓库 WHERE 城市='上海') AND 职工号 IN

(SELECT 职工号 FROM 订购单 WHERE 供应商号='S6') 12)

检索出在广州工作并且只向S6供应商发出了订购单的职工号。

SELECT 职工号 FROM 职工 WHERE 仓库号 IN

(SELECT 仓库号 FROM 仓库 WHERE 城市='广州') AND 职工号 IN (SELECT 职工号 FROM 订购单 WHERE 供应商号='S6') AND 职工号 NOT IN (SELECT 职工号 FROM 订购单 WHERE 供应商号!='S6') 13)

检索出由工资多于1230元的职工向北京的供应商发出的订购单号。

SELECT 订购单号 FROM 订购单 WHERE 职工号 IN

(SELECT 职工号 FROM 职工 WHERE 工资>1230) AND 供应商号 IN (SELECT 供应商号 FROM 供应商 WHERE 地址='北京') 14) 15) 16) 17)

检索出仓库的个数。

检索出有最大面积的仓库信息。 检索出所有仓库的平均面积。

检索出向S4供应商发出订购单的那些仓库的平均面积。

SELECT COUNT(*) FROM 仓库

SELECT * FROM 仓库 WHERE 面积=(SELECT MAX(面积) FROM 仓库) SELECT AVG(面积) FROM 仓库

SELECT AVG(面积) FROM 仓库 WHERE 仓库号 IN (SELECT 仓库号 FROM 职工 WHERE 职工号 IN (SELECT 职工号 FROM 订购单 WHERE 供应商号='S4')) 18)

检索出每个城市的供应商个数。

SELECT 地址,COUNT(*) FROM 供应商 GROUP BY 地址

19) 20)

检索出每个仓库中工资多于1220元的职工个数。 检索出和面积最小的仓库有联系的供应商的个数。

SELECT 仓库号,COUNT(*) FROM 职工 WHERE 工资>1220 GROUP BY 仓库号 SELECT COUNT(*) FROM 供应商 WHERE 供应商号 IN (SELECT 供应商号 FROM 订购单 WHERE 职工号 IN (SELECT 职工号 FROM 职工 WHERE 仓库号 IN (SELECT 仓库号 FROM 仓库 WHERE 面积= (SELECT MIN(面积) FROM 仓库)))) 21)

检索出工资低于本仓库平均工资的职工信息。

SELECT * FROM 职工 out WHERE 工资<

(SELECT AVG(工资) FROM 职工 inne WHERE 仓库号=out.仓库号) 3.

试述关系数据库中视图(View)的含义和作用。

在关系数据库中,视图也称作窗口,即视图是操作基本表的窗口。在三层数据库体系结构中,视图是外部数据库,它是从基本表中派生出来的并依赖于基本表,它并不独立存在。

利用视图一方面可以限定对数据的访问(对数据列起到安全保护的作用),另一方面又可以简化对数据的访问(用户可以直接通过视图访问数据库)。除此之外,从三层数据库体系结构的角度它还提供了概念数据独立性。

4.

以图5-1的数据库为例,用SQL语句完成以下更新操作,并讨论数据完整性约束对这些操作的影响:

1) 插入一个新的供应商元组(S9,智通公司,沈阳)。 INSERT INTO 供应商 VALUES('S9','智通公司','沈阳') 2) 删除目前没有任何订购单的供应商。 DELETE FROM 供应商 WHERE 供应商号 NOT IN (SELECT 供应商号 FROM 订购单)

3) 删除由在上海仓库工作的职工发出的所有订购单。 DELETE FROM 订购单 WHERE 职工号 IN (SELECT 职工号 FROM 职工 WHERE 仓库号 IN (SELECT 仓库号 FROM 仓库 WHERE 城市='上海')) 4) 北京的所有仓库增加100m2的面积。

UPDATE 仓库 SET 面积=面积+100 WHERE 城市='北京' 5) 给低于所有职工平均工资的职工提高5%的工资。 UPDATE 职工 SET 工资=工资* WHERE 工资< (SELECT AVG(工资) FROM 职工) 5. 1)

句和SQL语句。

2) 3)

宿主语言与SQL语言的数据交互问题。SQL语句的查询结果必须能够交给宿主语言处理,宿主语言的数据也要宿主语言的单记录与SQL的多记录的问题。宿主语言一般一次处理一条记录,而SQL常常处理的是记录(元

能够交给SQL语句使用。 组)的集合,这个矛盾必须解决。

SQL要嵌入到宿主语言中使用要解决哪几方面的问题

嵌入识别问题。宿主语言的编译程序不能识别SQL语句,所以首要的问题就是要解决如何区分宿主语言的语

把SQL嵌入到宿主语言中使用必须要解决以下三个方面的问题:

6. 试述预编译的作用。

宿主语言的编译系统不能识别SQL语句。解决这个问题的一般方法是,为SQL语句加一个特殊的前缀,在用宿主语言的编译系统编译源程序之前,首先由预编译系统将SQL语句转换为宿主语言的合法函数调用。

7.

试述游标(Cursor)的作用,并解释实现此功能的诸条语句的用途。

宿主语言一般只能在单记录方式下工作,即一次处理一个记录。而SQL语句的查询结果常常是一张表,它包含多个记录,为此需要用游标(CURSOR)作为桥梁做一些特殊处理,即利用游标来临时存放SQL语句的查询结果,并利用游标与宿主语言的主变量进行数据交互。与游标有关的命令共有四条:DECLARE CURSOR、OPEN、FETCH和CLOSE。其中DECLARE CURSOR用SQL SELECT语句说明一个游标;OPEN打开游标,即执行说明游标的SQL SELECT语句;FETCH从游表中读一条记录到主变量;CLOSE关闭游标。

8.

试述为什么需要动态SQL语句,分析游标和动态游标的区别。

有时候在编程序时SQL语句或语句的参数和格式不能确定,应用程序只能在执行时才知道需要什么样的SQL语句,即必须在应用程序执行时动态建立SQL语句。

定义游标的SQL语句是静态的;而定义动态游标的SQL语句是动态生成的。 习题六 1.

什么是存储过程为什么要使用存储过程

存储过程是经过预编译的T-SQL语句的集合,它存放在数据库中,当用户执行存储过程时,存储过程在数据库服务器上运行。 利用存储过程可以避免在网络上传输大量无用的信息或原始数据,只需要传输调用存储过程的指令和数据库服务器返回的处理结果,这样可以大大提高网络数据库应用系统的性能。

2. 1)

试为如下问题编写、建立存储过程,并定义合适的过程返回状态码和信息(均以图5-1的数据库为例): 插入一个新的供应商元组。

CREATE PROCEDURE ins_sup

(@sno CHAR(3),@sname CHAR (16),@addr CHAR (10)) AS

INSERT INTO 供应商 VALUES(@sno,@sname,@addr) IF @@ERROR = 0 ELSE

RETURN -1 RETURN 0

--调用

exec ins_sup 'aa','存储过程插入的供应商','地址' --查看结果

select * from 供应商 2)

给指定城市的所有仓库增加x m2的面积。

CREATE PROCEDURE upd_wh_area (@city char(10),@area numeric) AS

联系客服:779662525#qq.com(#替换为@)