问答题
请将下列SQL语句的空缺部分补充完整。 (1)查询标题或内容包含“SQL”的主题标题,按发布时间降序排序。 SELECT DISTINCT 标题 FROM 主题 (d) (e) ; (2)查询名称为“数据库技术”的栏目及其子栏目中精华主题的标题和点击率。 SELECT 标题,点击率 FROM 主题 WHERE 类型='精华' AND 栏目编号 (f) (SELECT 栏目编号 FROM 栏目 WHERE 名称='数据库技术' (g) SELE]CT 栏目编号 FROM 栏目 WHERE (h) (SELECT 栏目编号 FROM 栏目 WHERE 名称='数据库技术'));
问答题
假设所有关系模式均已创建,回复主题关系模式的“主题编号”是外键,参照主题关系模式的“主题编号”,删除编号为“T005”的主题及其相关的回复主题,下面是对应的删除语句,这些语句组成一个事务。 DELETE 主题 WHERE 主题编号='T005'; DELETE 回复主题 WHERE 主题编号='T005'; (1)请问这些删除语句能否完成功能?若不能,请说明为什么? (i) (2)假设现在希望仅通过“DELETE 主题 WHERE主题编号='T005';”这一条语句就能完成此删除功能,应如何实现? (j)
【正确答案】这是一道要求读者掌握参照完整性约束的综合分析题,本题的解答思路如下。 (1)由于“回复主题”关系模式的“主题编号”是外键,参照“主题”关系模式的“主题编号”,并使用以下语句删除编号为“T005”的主题及其相关的回复主题。 DELETE 主题 WHERE 主题编号='T005'; DELETE 回复主题 WHERE 主题编号='T005'; 当执行前一个DELETE语句删除了主题编号为“T005”的主题后,可能会存在主题编号为“T005”的回复主题,违反了参照完整性约束,因此SQL语句不能完成想要完成的功能。若将这两个语句的先后顺序调换过来,则可以完成本题所要求的删除功能。 (2)若要求仅用一个DELETE语句就完成该删除要求,则需要使用数据库所提供的一些机制来实现这个要求。方法之一是:在定义回复主题关系时指定级联删除,定义主题编号属性的外键约束后加上ON DELETE CASCADE;方法之二是:通过触发器机制,在主题关系上定义触发器,当删除主题时,删除其对应的回复主题,可通过CREATE TRIGGER语句完成。
【答案解析】
问答题
为了了解每个栏目用户关注的主题,对原创主题创建视图“主题_view”,属性包括主题编号、标题、用户账号、栏目名称、回复数、点击率和发布时间。 CREATE VIEW 主题 view (主题编号,标题,用户账号,栏目名称,回复数,点击率,发布时间) AS SELECT 主题.主题编号,标题,账号,名称,回复数,点击率,发布时间 FROM 主题,用户,栏目,( (k) FROM 回复主题 (l) )AS A WHERE 主题.用户编号=用户.用户编号 AND 主题.栏目编号=栏目.栏目编号 AND (m) ;
【正确答案】这是一道要求读者掌握数据库视图中SELECT查询语句的综合应用题,本题的答案(下划线标示)示例如下。 CREATE VIEW 主题 view (主题编号,标题,用户账号,栏目名称,回复数,点击率,发布时间) AS SELECT 主题.主题编号,标题,账号,名称,回复数,点击率,发布时间 FROM 主题,用户,栏目,(SELECT 主题编号,COUNT(*)回复数 FROM 回复主题 GROUP BY 主题编号)AS A WHERE 主题.用户编号=用户.用户编号 AND 主题.栏目编号=栏目.栏目编号 AND 主题.主题编号=A.主题编号;