1、1.以图 3-6的数据库为例 (可参照图5-1,该数据库的实例) ,用关系代数完成以下检 索:(注意:此处暂以*表示连接运算符。) 1)检索在仓库 WH2 工作的职工的工资。 职工号,工资( 仓库号=WH2(职工) 2)检索在上海工作的职工的工资。 职工号,工资( 城市=上海(仓库)* 职工) 3)检索北京的供应商的名称。 供应商名( 地址=北京(供应商) 4)检索目前与职工 E6 有业务联系的供应商的名称。 供应商名( 职工号=E6(订购单)* 供应商) 5)检索所有职工的工资都大于1220元的仓库所在的城市。 城市(仓库) - 城市( 工资=1220(职工)* 仓库) 6)检索和北京的所有
2、供应商都有业务联系的职工的工资。 职工号,工资(职工 * (订购单 供应商号( 地址=北京(供应 商) 7)检索至少和职工 E1、E4、E7 都有联系的供应商的名称。 供应商名(订购单 (“ E1” ,” E4” ,” E7” ) * 供应商) 习题五 1.试概述 SQL 语言的功能。 SQL 是一种一体化的语言,它包括了数据定义、数据查询、数据操纵和数据控制等方 面的功能,它可以完成数据库活动中的全部工作。 2.以图 5-1 的数据库为例,用SQL 完成以下检索: 1)检索在北京的供应商的名称。 SELECT * FROM供应商WHERE 地址=?北京? 2)检索发给供应商S6 的订购单号。
3、 SELECT 订购单号FROM 订购单WHERE供应商号 =?S6? 3)检索出职工E6发给供应商S6的订购单信息。 SELECT * FROM订购单WHERE 供应商号 =?S6?AND 职工号 =?E6? 4)检索出向供应商S3 发过订购单的职工的职工号和仓库号。 SELECT 职工号 ,仓库号FROM 职工WHERE 职工号IN (SELECT 职工号FROM 订购单WHERE供应商号 =?S3?) 5)检索出目前与S3供应商没有联系的职工信息。 SELECT * FROM职工WHERE 职工号NOT IN (SELECT 职工号FROM 订购单WHERE供应商号 =?S3?) 6)检
4、索出目前没有任何订购单的供应商信息。 SELECT * FROM供应商WHERE NOT EXISTS (SELECT * FROM订购单WHERE 供应商号 =供应商 .供应商号) 7)检索出和职工E1、 E3都有联系的北京的供应商信息。 SELECT * FROM供应商WHERE 地址=?北京? and 供应商号IN (SELECT 供应商号FROM 订购单WHERE职工号 =?E1?) AND供应商号IN (SELECT 供应商号FROM 订购单WHERE职工号 =?E3?) 8)检索出目前和华通电子公司有业务联系的每个职工的工资。 SELECT 职工号 ,工资FROM 职工WHERE
5、职工号IN (SELECT 职工号FROM 订购单WHERE供应商号IN (SELECT 供应商号FROM 供应商WHERE 供应商名 =?华通电子公司 ?) 9)检索出与工资在1220 元以下的职工没有联系的供应商的名称。 SELECT 供应商名FROM 供应商WHERE供应商号IN (SELECT 供应商号FROM 订购单WHERE 职工号NOT IN (SELECT 职工号FROM 职工WHERE 工资1230) AND供应商号IN (SELECT 供应商号FROM 供应商WHERE 地址=?北京?) 14) 检索出仓库的个数。 SELECT COUNT(*) FROM仓库 15) 检索
6、出有最大面积的仓库信息。 SELECT * FROM仓库WHERE 面积 =(SELECT MAX( 面积) FROM仓库) 16) 检索出所有仓库的平均面积。 SELECT AVG(面积)FROM 仓库 17) 检索出向S4供应商发出订购单的那些仓库的平均面积。 SELECT AVG(面积)FROM 仓库WHERE仓库号IN (SELECT 仓库号FROM 职工WHERE 职工号IN (SELECT 职工号FROM 订购单WHERE 供应商号 =?S4?) 18) 检索出每个城市的供应商个数。 SELECT 地址,COUNT(*)FROM供应商GROUP BY地址 19) 检索出每个仓库中工
7、资多于1220 元的职工个数。 SELECT 仓库号 ,COUNT(*)FROM职工WHERE工资1220 GROUPBY仓库号 20) 检索出和面积最小的仓库有联系的供应商的个数。 SELECT COUNT(*) FROM供应商WHERE供应商号IN (SELECT 供应商号FROM 订购单WHERE 职工号IN (SELECT 职工号FROM 职工WHERE 仓库号IN (SELECT 仓库号FROM 仓库WHERE 面积= (SELECT MIN( 面积) FROM 仓库) 21) 检索出工资低于本仓库平均工资的职工信息。 SELECT * FROM职工out WHERE工资 (SELE
8、CT AVG( 工资) FROM 职工inne WHERE仓库号 =out.仓库号 ) 3.试述关系数据库中视图(View)的含义和作用。 在关系数据库中,视图也称作窗口,即视图是操作基本表的窗口。在三层数据库体系结 构中,视图是外部数据库,它是从基本表中派生出来的并依赖于基本表,它并不独立存在。 利用视图一方面可以限定对数据的访问(对数据列起到安全保护的作用),另一方面又 可以简化对数据的访问(用户可以直接通过视图访问数据库)。除此之外,从三层数据库体 系结构的角度它还提供了概念数据独立性。 4.以图 5-1 的数据库为例,用SQL 语句完成以下更新操作,并讨论数据完整性约束 对这些操作的影
9、响: 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 城市=?上海?) 2 4)北京的所有仓库增加100m 的面积。 UPDATE 仓库SET 面积=面积+1
10、00 WHERE城市=?北京? 5)给低于所有职工平均工资的职工提高5%的工资。 UPDATE 职工SET 工资=工资*1.05 WHERE工资 (SELECT AVG( 工资) FROM 职工 ) 5.SQL 要嵌入到宿主语言中使用要解决哪几方面的问题? 把 SQL 嵌入到宿主语言中使用必须要解决以下三个方面的问题: 1) 嵌入识别问题。 宿主语言的编译程序不能识别SQL 语句, 所以首要的问题就是要解 决如何区分宿主语言的语句和SQL 语句。 2) 宿主语言与SQL 语言的数据交互问题。SQL 语句的查询结果必须能够交给宿主语言 处理,宿主语言的数据也要能够交给SQL 语句使用。 3) 宿
11、主语言的单记录与SQL 的多记录的问题。宿主语言一般一次处理一条记录,而 SQL 常常处理的是记录(元组)的集合,这个矛盾必须解决。 6.试述预编译的作用。 宿主语言的编译系统不能识别SQL 语句。 解决这个问题的一般方法是,为 SQL 语句加 一个特殊的前缀,在用宿主语言的编译系统编译源程序之前,首先由预编译系统将SQL 语 句转换为宿主语言的合法函数调用。 7.试述游标( Cursor)的作用,并解释实现此功能的诸条语句的用途。 宿主语言一般只能在单记录方式下工作,即一次处理一个记录。而SQL 语句的查询结 果常常是一张表, 它包含多个记录, 为此需要用游标 (CURSOR)作为桥梁做一些特殊处理, 即利用游标来临时存放SQL 语句的查询结果,并利用游标与宿主语言的主变量进行数据交 互。与游标有关的命令共有四条:DECLARECURSOR、OPEN、FETCH 和 CLOSE。其 中 DECLARE CURSOR用 SQL SELECT 语句说明一个游标;OPEN 打开游标,即执行说明 游标的 SQL SELECT 语句; FETCH 从游表中读一条记录到主变量;CLOSE 关闭游标。