第三章
3-1解释下列术语:
基本表 视图 单表查询 连接查询 嵌套查询 交互式SQL 嵌入式SQL 宿主语言 答:
(1)基本表:简称基表。是数据库中实际存在的表,在SQL中一个关系对应于一个表。 (2)视图:SQL用视图概念支持非标准的外模式概念。视图是从一个或几个基表导出的表,虽然它也是关系形式,但它本身不实际存储在数据库中,只存放对视图的定义信息(没有对应的数据)。因此,视图是一个虚表(Virtual Table)或虚关系,而基表是一种实关系(Practical Relation)。
(3)单表查询:只涉及到一个关系的查询。 (4)连接查询:同时涉及两个以上的表的查询。 (5)嵌套查询:将一个查询块嵌套在另一个查询块的WHERE子句或HAVING条件中的查询。 (6)交互式SQL:做为独立语言由用户在交互环境下使用的SQL语言。
(7)嵌入式SQL:将SQL语言嵌入到某种高级语言中使用,利用高级语言的过程性结构来
弥补SQL语言在实现复杂应用方面的不足的SQL语言。
(8)宿主语言:嵌入SQL的高级语言称为主语言或宿主语言。
3-2试述SQL语言的特点 答:1.综合统一
2.高度非过程化
3.面向集合的操作方式
4.以同一种语法结构提供两种使用方式
`
3-3试述SQL体系结构和关系数据库模式之间的关系 答:
SQL语言支持关系数据库体系结构,即外模式、模式和内模式,利用SQL语言可以实现对三级模式的定义、修改和数据的操纵功能,在此基础上形成了SQL体系结构;在SQL体系结构中的视图对应了关系数据模式的外模式,基本表对应了关系数据模式的模式,存储文件对应了关系数据模式的内模式。
3-4 SQL是如何实现实体完整性、参照完整性和用户定义完整性的? 答:
实体完整性简单的说,就是将表中的每一行看作一个实体。实体完整性要求表的标示符列或主键的完整性。可以通过建立唯一索引、PRIMARY KEY约束、UNIQUE约束,以及列的IDENTITY属性来实施实体完整性。
参照完整性维持被参照表和参照表之间的数据一致性,他通过主键(PRIMARY KEY)约束和外键(FOREIGN KEY)约束来实现。引用完整性确保键值在所有表中一致。这样的一致性要求不能引用不存在的值,如果键值更改了,那么在整个数据库中,对该键值的所有引用要进行一致的更改。在被参照表中,当其主键值被其他表所参照时,该行不能被删除也不允许改变。在参照表中,不允许参照不存在的主键值。
用户定义完整性使得可以定义不属于其它任何完整性分类的特定业务规则。所有的完整性类型都支持用户定义完整性。
3-5讨论当对一个视图进行更新的时候可能会出现什么样的问题? 答:
1) 若视图的属性来自属性表达式或常数,则不允许对视图执行INSERT和UPDATE操作,
但允许执行DELETE操作。
2) 若视图的属性来自库函数,则不允许对此视图更新。
3) 若视图定义中有GROUP BY子句,则不允许对此视图更新。 4) 若视图定义中有DISTINCT任选项,则不允许对此视图更新。
5) 若视图定义中有嵌套查询,并且嵌套查询的FROM子句涉及导出该视图的基本表,
则不允许对此视图更新。
6) 若视图由两个以上的基本表导出,则不允许对此视图更新。
7) 如果在一个不允许更新的视图上再定义一个视图,这种二次视图是不允许更新的。
3-6设有两个基本表R(A,B,C) 和 S(A,B,C)试用SQL查询语句表达下列关系代数表达式:
⑴ R∩S ⑵ R-S ⑶R∪S ⑷ R×S
(1) (select * from R) INTERSECT (select * from S) (2) (select * from R) EXCEPT (select * from S) (3) (select * from R) UNION (select * from S) (4) select * from R,S
3-7对于教学数据库的三个基本表:
S(学号,姓名 ,年龄,性别)
SC(学号 ,课程号,成绩)
C(课程号 ,课程名,任课教师姓名) 试用SQL语句表达下列查询:
⑴ 查询“刘某”老师所授课程的课程号和课程名。 ⑵ 查询年龄大于23岁的男同学的学号和姓名。
⑶ 查询学号为S3的学生所学课程的课程号、课程名和任课教师姓名。 ⑷ 查询“张小飞”没有选修的课程号和课程名。 ⑸ 查询至少选修了3门课程的学生的学号和姓名。 ⑹ 查询全部学生都选修了的课程编号和课程名称。 ⑺ 在SC中删除尚无成绩的选课元组。
⑻ 把“高等数学”课的所有不及格成绩都改为60。 ⑼ 把低于总评均成绩的女同学的成绩提高5%。 ⑽ 向C中插入元组(‘C8’,‘VC++’,‘王昆’)。 3-7
(1) 查询“刘某”老师所授课程的课程号和课程名; SELECT课程号, 课程名 FROM C
WHERE任课教师姓名LIKE '刘*'
(2) 查询年龄大于23岁的男同学的学号和姓名; SELECT 学号,姓名 FROM S
WHERE 年龄>23 AND 性别='男'
(3) 查询学号为S3的学生所学课程和课程号,课程名和任课教师姓名 SELECT C.课程号, 课程名, 任课教师姓名 FROM C, SC
WHERE SC.学号='S3' And C.课程号=SC.课程号
(4) 查询“张小飞”同学没有选修的课程的课程号和课程名; SELECT C.课程号, C.课程名 FROM C
WHERE 课程号 NOT IN (SELECT 课程号 FROM SC
WHERE 学号 IN
(SELECT 学号 FROM S WHERE 姓名='张小飞')); 或者 SELECT * FROM C
WHERE NOT EXISTS (SELECT SC.课程号 FROM SC,S
WHERE SC.课程号=C.课程号 AND S.学号=SC.学号
AND S.姓名='张小飞') 或者 SELECT * FROM C
WHERE 课程号 NOT IN (SELECT 课程号 FROM SC,S
WHERE S.学号=SC.学号 AND S.姓名='张小飞')
(5) 查询至少选修了3门课程的学生的学号和姓名; SELECT 学号, 姓名 FROM S
WHERE 学号 IN (SELECT 学号 FROM SC
GROUP BY 学号
HAVING COUNT (课程号)>=3)
(6) 查询全部学生都选修了的课程号和课程名; SELECT 课程号,课程名 FROM C
WHERE NOT EXISTS (SELECT 学号 FROM S
WHERE NOT EXISTS (SELECT 学号 FROM SC
WHERE SC.课程号=C.课程号 AND S.学号=SC.学号)) 或者
SELECT 课程号, 课程名 FROM C
WHERE NOT EXISTS ((SELECT 学号 FROM S) EXCEPT
(SELECT 学号 FROM SC
WHERE SC.课程号=C.课程号))
(7) 在SC表中删除无成绩的选课纪录; DELETE * FROM SC
WHERE GRADE is null;