问答题 阅读下列说明,回答下列问题。
[说明]
某大型集团公司的数据库的部分关系模式如下:
员工表:EMP( Eno , Ename, Age, Sex, Title),各属性分别表示员工工号、姓名、年龄、性别和职称级别,其中性别取值为“男”“女”;
公司表:COMPANY( Cno , Cname, City),各属性分别表示公司编号、名称和所在城市;
工作表:WORKS( Eno, Cno , Salary),各属性分别表示职工工号、工作的公司编号和工资。
有关关系模式的属性及相关说明如下:
(1)允许一个员工在多家公司工作,使用身份证号作为工号值。
(2)工资不能低于1500元。
根据以上描述,回答下列问题:
问答题 请将下面创建工作关系的SQL语句的空缺部分补充完整,要求指定关系的主码、外码,以及工资不能低于1500元的约束。
CREATE TABLE WORKS (
Eno CHAR(10) __(a)__ ,
Cno CHAR(4) __(b)__ ,
Salary int __(c)__ ,
PRIMARY KEY __(d)__ ,
);
【正确答案】
【答案解析】(a)REFERENCES EMP(Eno)
(b)REFERENCES COMPANY(Cno)
(c)CHECK(Salary>=1500)
(d)(Eno, Cno) [解析] 本题考查SQL语句的应用。
此类题目要求考生掌握SQL语句的基本语法和结构,认真阅读题目给出的关系模式,针对题目的要求具体分析并解答。本试题已经给出了3个关系模式,需要分析每个实体的属性特征及实体之间的联系,补充完整SQL语句。
由题目说明可知,Eno和Cno两个属性组合是WORKS关系表的主键,所以在PRIMARY KEY后填的应该是(Eno, Cno)组合;Eno和Cno分别作为外键引用到EMP和COMPANY关系表的主键,因此需要用REFERENCES对这两个属性进行外键约束:由“工资不能低于1500元”的要求,可知需要限制账户余额属性值的范围,通过CHECK约束来实现。从上述分析可知,完整的SQL语句如下:
CREATE TABLE WORKS (
Eno CHAR(10) REFERENCES EMP(Eno) ,
Cno CHAR(4) REFERENCES COMPANY(Cno) ,
Salary int CHEKCK (Salary >=1500) ,
PRIMARY KEY (Eno, Cno) ,
);
问答题 (1)创建女员工信息的视图FemaleEMP,属性有Eno、Ename、Cno、Cname和Salary,请将下面SQL语句的空缺部分补充完整。
CREATE __(e)__
AS
SELECT EMP.Eno, Ename, COMPANY.Cno, Cname, Salary
FROM EMP, COMPANY, WORKS
WHERE __(f)__ ;
(2)员工的工资由职称级别的修改自动调整,需要用触发器来实现员工工资的自动维护,函数float Salary_value(char(10)Eno)依据员工号计算员工新的工资。请将下面SQL语句的空缺部分补充完整。
CREATE __(g)__ Salary TRG AFTER __(h)__ ON EMP
REFERENCING new row AS nrow
FOR EACH ROW
BEGIN
UPDATE WORKS
SET __(i)__
WHERE __(j)__ ;
END
【正确答案】
【答案解析】(1)(e)VIEW FemaleEMP(Eno, Ename, Cno, Cname, Salary)
(f)EMP.Eno=WORKS.Eno AND COMPANY.Cno=WORKS.Cno AND Sex="女"
(2)(g)TRIGGER
(h)UPDATE
(i)Salary=Salary_value(nrow.Eno)
(i)WORKS.Eno=nrow.Eno [解析] (1)创建视图需要通过CREATE VIEW语句来实现,由题目可知视图的属性有(Eno, Ename, Cno, Cname, Salary);通过公共属性列Eno和Cno对使用的三个基本表进行连接;由于只创建女员工的试图,所以还要在WHERE后加入“Sex="女"”的条件。从上分析可见,完整的SQL语句如下:
CREATE VIEW FemaleEMP (Eno, Ename, Cno, Cname, Salary)
AS
SELECT EMP.Eno, Ename, COMPANY.Cno, Cname, Salary
FROM EMP, COMPANY, WORKS
WHERE EMP.Eno=WORKS.Eno AND COMPANY.Cno=WORKS.Cno AND Sex=
"女";

(2)创建触发器可通过CREATE TRIGGER语句实现,要求考生掌握触发器的基本语法结构。按照问题要求,在工资关系中更新职工职称级别时触发器应自动执行,故需要创建基于UPDATE类型的触发器,其触发条件是更新职工职称级别;最后添加表连接条件。完整的触发器实现的方案如下:
CREATE TRIGGER Salary_TRG AFTER UPDATE ON EMP
REFERENCING new row AS nrow
FOR EACH ROW
BEGIN
UPDATE WORKS
SET Salary=Salary value (nrow.Eno)
WHERE WORK. Eno=nrow. Eno ;
END
问答题 请将下面SQL语句的空缺部分补充完整。
(1)查询员工最多的公司编号和公司名称。
SELECT COMPANY.Cno, Cname
FROM COMPANY, WORKS
WHERE COMPANY.Cno=WORKS.Cno
GROUP BY __(k)__
HAVING __(l)__ (SELECT COUNT(*)
FROM WORKS
GROUP BY Cno
);
(2)查询所有不在“中国银行北京分行”工作的员工工号和姓名。
SELECT Eno, Ename
FROM EMP
WHERE Eno __(m)__ (
SELECT Eno
FROM __(n)__
WHERE __(o)__
AND Cname="中国银行北京分行"
);
【正确答案】
【答案解析】(1)(k)COMPANY.Cno, Cname
(1)COUNT(*)>=ALL
(2)(m)NOT IN 或 <>ANY (注:两者填一个即可)
(n)WORKS.COMPANY
(o)WORKS.Cno=COMPANY.Cno [解析] SQL查询通过SELECT语句实现。
(1)根据问题要求,可通过子查询实现“查询员工最多的公司编号和公司名称”的查询;对COUNT函数计算的结果应通过HAVING条件语句进行约束;通过Cno和Cname的组合来进行分组查询。完整的SQL语句如下:
SELECT COMPANY.Cno, Cname
FROM COMPANY, WORKS
WHERE COMPANY.Cno=WORKS.Cno
GROUP BY COMPANY.Cno, Cname
HAVING COUNT(*) >=ALL (SELECT COUNT(*)
FROM WORKS
GROUP BY Cno
);
(2)根据问题要求,需要使用嵌套查询。先将WORKS和COMPANY表进行连接,查找出所有在“中国银行北京分行”工作的员工;然后在雇员表中使用“NOTIN”或者“<>ANY”查询不在前述结果里面的员工即可。完整的SQL语句如下:
SELECT Eno, Ename
FROM EMP
WHERE Eno NOT IN 或 <>ANY (
SELECT Eno
FROM WORKS, COMPANY
WHERE WORKS.Cno=COMPANY.Cno
AND Cname="中国银行北京分行"
);