问答题
[问题1]根据上述说明,由SQL定义的“职工”和“部门”的关系模式,以及统计各部门的人数C、工资总数Totals、平均工资Averages的D_S视图如下所示,请在空缺处填入正确的内容。
Create Table 部门 (部门号 CHAR(1){{U}} (a) {{/U}},
部门名 CHAR(16),
负责人代码 CHAR(4),
任职时间 DATE,
{{U}} (b) {{/U}}(职工号));
Create Table职工(职工号 CHAR(4),
姓名 CHAR(8),
年龄 NUMBER(3),
月工资 NUMBER(4),
部门号 CHAR(1),
电话 CHAR(8),
办公室 CHAR(8),
{{U}} (a) {{/U}}(职工号),
{{U}} (c) {{/U}}(部门号),
CHECK({{U}} (d) {{/U}}));
Create View D_S(D,C,Totals,Averages)As
(Select 部门号,{{U}} (e) {{/U}}
from 职工
{{U}} (f) {{/U}});
【正确答案】
【答案解析】[问题1]解答
(a)PRIMARY KEY
(b)FOREIGN KEY (负责人代码) REFERENCES职工
(c)FOREIGN KEY (部门号) REFERENCES部门
(d)月工资>=500 AND<月工资=5000,或月工资 BETWEEN 500 AND 5000
(e)count(*),Sum (月工资),Avg (月工资)
(f)GrOup by部门号
[问题1][分析]
根据题意,“职工”和“部门”的关系模式如下:
用SQL定义关系模式的一个非常重要的问题是完整性控制。完整性控制应具有三方面的功能:定义功能、检测功能、处理功能(一旦发现违背了完整性约束条件,采取相关的动作来保证数据的完整性)。数据库中最重要的约束是声明一个或一组属性形成关系的键。键的约束在SQL的CREATETABLE命令中声明。在关系系统中,最重要的完整性约束条件是:实体完整性和参照完整性。
1.实体完整性定义
在关系中只能有一个主键。声明主键有两种方法:
①将PRIMARY KEY保留字加在属性类型之后。
②在属性列表中引入一个新元素,该元素包含保留字PRIMARYKEY和用圆括号括起的形成该键的属性或属性组列表。
2.参照完整性
参照完整性定义格式如下:
FOREIGN KEY(属性名)REFERENCES表名(属性名)
[ONDELETE[CASCADE|SETNULL]
参照完整性是通过使用如下保留字:FOREIGN KEY 定义那些列为外码; REFERENCES 指明外键对应于哪个表的主键;ON DELETE CASCADE 指明删除被参照关系的元组时,同时删除参照关系中的元组;SETNULL表示置为空值方式。本试题中,部门关系的主键为部门号,职工关系的主键为职工号。其中,部门关系的主键为部门号可采用如下两种方式定义:
部门号CHAR(1)PRIMARY KEY或者是PRIMARY KEY(部门号)
又因为负责人也是一个职工,所以负责人代码应该是一个外码,应进行参照完整性定义。根据分析部门的SQL定义如下:
Create Table 部门(部门号 CHAR(1){{U}} PRIMARY KEY {{/U}},
部门名 CHAR(16),
负责人代码 CHAR(4),
任职时间 DATE,
{{U}}FOREIGN KEY (负责人代码) REFERENCES 职工 {{/U}}(职工号));
在职工关系中,部门号是一个外码,应进行参照完整性定义。又因为在试题表2-1中的条件“500元≤月工资≤5000元”,所以在职工关系中应加上用户定义完整性。根据
分析职工的SQL定义如下:
Create Table 职工 (职工号CHAR(4),
姓名 CHAR(8),
年龄 NUMBER(3),
月工资NUMBER(4),
部门号CHAR(1),
电话 CHAR(8),
办公室CHAR(8),
{{U}}PRIMARY DEY {{/U}} (职工号),
{{U}}FOREIGNKEY (部门号) REFERENCES 部门{{/U}} (部门号),
CHECK({{U}}月工资 BETWEEN 500 AND 5000 {{/U}}));
建立D_S视图需要COUNT函数来统计各部门的人数C,SUM来计算工资总数 Totals,用AVG来计算平均工资Averages,用分组语句GROUPBY来对不同部门进行分组。因此创建D_S视图的SQL语句是:
Create ViewD_S (D,C,Totals,Averages)AS
(SELECT 部门号,{{U}}COUNT(*),SUM (月工资),AVG(月工资){{/U}}
FROM 职工
{{U}}GROUP BY 部门号){{/U}}
