(2) 求位于郑州的所有工程的信息
SELECT * FROM Projects
WHERE Jcity=?郑州?;
(3) 求数量在100~150之间的供应
SELECT * FROM SPJ
WHERE Quantity BETWEEN 100 AND 150; (4) 求为工程J1提供零件的供应商号
SELECT Sno FROM SPJ
WHERE Jno=?J1?;
(5) 求供应工程J1红色零件的供应商号
SELECT Sno FROM SPJ, Parts
WHERE SPJ.Pno=Parts.Pno AND Jno=?J1? AND Color=?红色?; (6) 求至少提供一种红色零件的供应商名称
SELECT Sname
FROM SPJ, Parts, Suppliers
WHERE SPJ.Pno=Parts.Pno AND SPJ.Sno=Suppliers.Sno AND Color=?红色?; (7) 求不提供零件P2的供应商名称
SELECT Sname FROM Suppliers
WHERE NOT EXISTS (SELECT * FROM SPJ
WHERE SPJ.Sno= Suppliers.Sno AND Pno=?P2?); (8) 求没有使用天津供应商生产的红色零件的工程号
SELECT Jno FROM Projects
WHERE NOT EXISTS (SELECT *
FROM SPJ, Parts, Suppliers
WHERE SPJ.Sno= Suppliers.Sno AND
Parts.Pno=SPJ.Pno AND
Color=?红色? AND Scity=?天津?);
(9) 求使用了本地供应商提供的零件的工程号和工程名称
SELECT Jno, Jname
FROM Projects,Suppliers,SPJ
WHERE SPJ.Sno= Suppliers.Sno AND
Projects.Jno=SPJ.Jno AND Projects.Jcity= Suppliers.Scity;
或
SELECT Jno,Jname
FROM Projects WHERE EXISTS (SELECT *
FROM SPJ, Suppliers
WHERE SPJ.Sno= Suppliers.Sno AND
Projects.Jno=SPJ.Jno AND Projects.Jcity= Suppliers.Scity);
(10) 求未使用本地供应商提供的零件的工程号和工程名称
SELECT Jno,Jname FROM Projects
WHERE NOT EXISTS (SELECT *
FROM SPJ, Suppliers
WHERE SPJ.Sno= Suppliers.Sno AND
Projects.Jno=SPJ.Jno AND Projects.Jcity= Suppliers.Scity);
(11) 求至少用了供应商S1所供应的全部零件的工程号
SELECT Jno FROM Projects
WHERE NOT EXISTS (SELECT *
FROM SPJ SPJ1
WHERE SPJ1.Sno = ?S1? AND NOT EXISTS (SELECT *
FROM SPJ SPJ2
WHERE SPJ2.Jno= Projects.Jno AND
SPJ2.Pno= SPJ1.Pno));
(12) 求提供所有零件的供应商名称
SELECT Sname FROM Suppliers
WHERE NOT EXISTS (SELECT *
FROM SPJ SPJ1
WHERE NOT EXISTS (SELECT *
FROM SPJ SPJ2
WHERE SPJ2.Sno= Suppliers.Sno AND
SPJ2.Pno= SPJ1.Pno));
4.7
(1) 求提供了零件的供应商的个数
SELECT distinct Sno FROM SPJ;
(2) 求所有零件的平均重量
SELECT avg(weight) FROM Parts;
(3) 求供应商S1供应工程J1的每种零件的总重量
SELECT sum(weight) FROM Parts,SPJ
WHERE SPJ.Pno=Parts.Pno AND Sno=?S1? AND Jno=?J1? GROUP BY Pno;
(4) 求供应商S1提供的每种零件的总数量
SELECT Pno, sum(weight) FROM SPJ
WHERE Sno=?S1? GROUP BY Pno; 4.8
(1) 将Cno、Cname、Caddress和Balance分别为C0199、李华、郑州市大学北路46号、6000的客户信息插入Customers
INSERT INTO Customers
VALUES(?C0199?,?李华?,?郑州市大学北路46号?,6000)
(2) 从Dependents(家属)中删除删除1979年前出生的子女(ReltoEmp=?子女?)
DELETE FROM Dependents
WHERE ReltoEmp=?子女? AND year(Birthday)<1979;
(3) 将销售部门(Dname=?销售?)的职工工资(Salary)提高4%
UPDATE Employees SET Salary=Salary*1.04 WHERE Dno IN (SELECT Dno
FROM Departments
WHERE Dname=?销售?);
4.9
(1) 找出2006年其车辆出过事故的总人数
SELECT Count(Distinct Driver_id) FROM Participated, Accidents
WHERE Participated.Report_no= Accidents.Report_no
AND Date=2006;
(2) 找出与王明的车有关的事故数量
SELECT Count(Report_no) FROM Participated, Clients
WHERE Participated.Driver_id= Clients. Driver_id AND Cname=?王明?; (3) 删除李莉的Mazada车
DELETE FROM Cars
WHERE Model=?Mazada? AND Car_no IN
(SELECT Car_no FROM Owns, Clients
WHERE Owns.Driver_id=Clients. Driver_id AND Cname=?李莉?);
(4) 对于一个新事故,需要将相应信息插入表Accidents和Participated中。
4.10 所谓基本表是其关系元组存储在数据库中的表。视图是一种用查询定义的命名的导出表,其关系不存储在数据库中,而是在查询时执行定义视图的查询,由基本表导出。
基本表与视图之间的主要区别是前者对应的关系存储在数据库中,而后者对应的关系不在数据库中存储(物化视图除外)。从使用角度而言,对于查询,二者没有区别;而对于更新,只有可更新视图才可以更新。
二者之间的联系体现在:所有视图都是直接或间接由基本表定义的。
4.11 使用视图的优点有:
(1) 使用视图可以使一些查询表达更加简洁。 (2) 视图提供了一定程度的逻辑独立性。
(3) 视图与授权配合使用,可以在某种程度上对数据库起到保护作用。 (4) 视图使得用户能够以不同角度看待相同的数据。
4.12 并非所有的视图都是可以更新的,因为对视图的更新要转化为对相应基本表的更新,而对于某些视图,有些更新不能唯一地转换成对基本表的更新。
所有更新都能唯一转换成对基本表的更新的视图是可更新的,否则是不可更新的。目前,二者之间的明确边界尚不清楚。我们知道“行列子集”视图是可更新的,而使用聚集函数定义的视图不是可更新的。
4.13 在需要使用数据库管理数据时,使用SQL语言建立数据库,并对数据进行操作比使用其他通用程序设计语言更便捷,常常也更有效。然而,由于(1)SQL能够表达常见的查询,但是不能表达所有查询。(2)一些非数据库操作,如打印报表、将查询结果送到图形用户界面中,都不能用SQL语句实现。一个应用程序通常包括多个组件,查询、更新只是一个组件,而许多其他组件都需要用通用编程语言实现。这时,我们需要使用嵌入式SQL,而不是单独使用SQL或某种通用程序设计语言。
第5章 完整性和安全性
习题参考答案
5.1 数据库的完整性是指数据库中的数据的正确性、一致性和相容性。
所谓计算机系统安全性是指为计算机系统建立和采取各种安全保护措施,以保护计算机系统中的硬件、软件及数据,防止因偶然或恶意的原因使系统遭到破坏,数据遭到更改或泄露。所谓数据库的安全性是指保护数据库,防止因用户非法使用数据库造成数据泄露、更改或破坏。
数据的完整性和安全性是一个问题的两个方面,都是为了保护数据库中的数据。前者旨在保护数据库中的数据,防止合法用户对数据库进行修改时破坏数据的一致性;而后者旨在保护数据库,防止未经授权的访问和恶意破坏和修改。
5.2 为了维护数据库的完整性,完整性控制应当作为DBMS核心机制,必须提供:
(1) 说明和定义完整性约束条件的方法:DBMS的DDL允许用户根据实际问题的语义说明
和定义各种完整性约束条件。
(2) 完整性检查机制:DBMS在数据更新可能破坏完整性时自动进行完整性检查。检查可
以在更新操作执行时立即执行,也可以在事务提交时进行。
(3) 违约处理:当数据更新违反完整性约束时,DBMS应当采取相应的措施,确保数据的
完整性。
5.3 当违反参照完整性时,除了简单的拒绝之外,还可以:
(1) 级联:进行更新,并且对更新导致违反参照完整性的参照关系元组进行相应更新。
通常,这种情况发生在被参照关系的主码改变时。例如,部门调整时将部分或所有部门重新编号,可以级联地更新其他包含部门号的关系元组。
(2) 置空值:进行更新,并且对更新导致违反参照完整性的参照关系元组的外码置空值。这
种处理方法仅当外码允许取空值时才能使用。
通常,这发生在被参照关系的元组被删除,并且允许参照关系的元组不参照时。例如,通常允许某个职工不在任何具体部门,这种职工的部门号(外码)可以取空值。当一个部门被撤销时,可以删除该部门在Departments中的对应元组,并且同时将原来在该部门的职工的EMPS元组置空值。 (3) 置缺省值:进行更新,并且对更新导致违反参照完整性的参照关系元组的外码置缺省值;
其中缺省值必须是被参照关系某元组主码上的值。 通常,这发生在被参照关系的元组被删除,并且参照关系的元组在外码上有合理缺省值时。例如,许多单位都有人才交流中心这样的部门,对职工进行再培训和重新安排。当一个部门被撤销时,该部门原有职工可以到人才交流中心。这时,可以将这些职工的部门号设置成缺省值——人才交流中心的部门号。 5.4
CREATE TABLE Suppliers (Sno CHAR (8) PRIMARY KEY, Sname CHAR (8) NOT NULL, Status INT, Scity CHAR(10));