1. 请将下列SQL语句的空缺部分补充完整。
(1)假设已经创建好用户关系,现在想增加一个属性“个性签名”,类型为VARCHAR(60),请给出相关的SQL语句。
(a) ;
(2)假设已经创建好用户关系,下面是创建栏目关系的SQL语句,请将空缺部分补充完整。
CREATE TABLE 栏目(
栏目编号 VARCHAR(8) PRIMARY KEY,
父栏目编号 VARCHAR(8),
名称 VARCHAR(40),
版主 VARCHAR(8) NOT NULL,
描述VARCHAR(100),
(b) ,
(c) ;
这是一道要求读者掌握SQL的数据定义语言(即SQL的DDL)的综合分析题,本题的解答思路如下。
由题干说明中的关键信息“用户编号唯一标识一个用户”可得,属性“用户编号”可以作为“用户”关系模式的主键。同理,由“栏目编号唯一标识一个栏目”可得,属性“栏目编号”可以作为“栏目”关系模式的主键;由“主题编号唯一标识一个主题”可得,属性“主题编号”可以作为“主题”关系模式的主键,属性“栏目编号”和“用户编号”是其外键;由“回复主题编号唯一识别一个回复主题”可得,属性“回复主题编号”可以作为“回复主题”关系模式的主键,属性“主题编号”和“用户编号”是其外键。
(1)在已经创建好的“用户”关系表中,增加一个属性“个性签名”,即需要增加一个新的列,则需要使用“ALTER…ADD…”语句。由于属性名称为“个性签名”,类型为VARCHAR(60),因此(a)空缺处应填入“ALTER TABLE用户ADD个性签名VARCHAR(60);”。
本题考查的是,第(1)题为基本表结构的修改,增加一个新的列;第(2)题为参照完整性约束,因为栏目关系中的父栏目编号和版主是外键,应该定义参照完整性约束。
(2)完整性约束包括3类:实体完整性、参照完整性和用户定义完整性。其中,参照完整性规则为,若属性(或属性组)A是关系R上的主键,B是关系S上的外键,A与B相对应(来自相同的域),则B取值为空或者来自于R上的某个A的值。该规则的实质是“不允许引用不存在的实体”。
由于“栏目编号唯一标识一个栏目。栏目分两级,包括父栏目和子栏目。每个栏目必须有且仅有一个版主,版主是一个用户”,即“栏目”关系模式中的“父栏目编号”和“版主”是外键,因此相应的参照完整性约束语句是:(b)空缺处应填入“FOREIGN KEY(父栏目编号)REFERENCES栏目(栏目编号)”,(c)空缺处应填入“FOREIGN KEY(版主)REFERENCES用户(用户编号)”。
2. 请将下列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 名称='数据库技术'));
这是一道要求读者掌握SQL的数据操纵语言,即SQL的DML中的SELECT语句的综合分析题,本题的解答思路如下。
(1)数据查询是数据库的核心操作,SELECT语句是SQL语言中进行查询的语句。该语句既可以完成简单的单表查询,也可以完成复杂的连接查询和嵌套查询。WHERE条件表达式中的字符串匹配操作符是“LIKE”。在该表达式中“%”通配符表示与0个或多个字符组成的字符串匹配。依题意,查询标题或内容包含“SQL”的主题标题,则(d)空缺处应填入“WHERE标题LIKE '%SQL%,OR内容LIKE'%SQL%'”。由于查询结果要求“按发布时间降序排序”,因此(e)空缺处应填入“ORDER BY发布时间DESC”。
(2)子查询是嵌套在另一个查询中的SELECT语句。判断元组是否在子查询的结果(即集合)中的操作,称为“集合成员资格比较”。其语法形式为<元组>[NOT]IN(<集合>)。其中,集合可以是一个SELECT查询语句,或者是元组的集合,但其结构应与前面元组的结构相同。由于查找名称为“数据库技术”的栏目及其子栏目中的精华主题的标题和点击率,因此,(f)空缺处应填入关键字“IN”,(h)空缺处应填入“父栏目编号IN”。
当两个子查询结果的结构完全一致时,可以使用集合运算符UNION执行“并”操作,因此(g)空缺处应填入关键字“UNION”。
3. 假设所有关系模式均已创建,回复主题关系模式的“主题编号”是外键,参照主题关系模式的“主题编号”,删除编号为“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语句完成。
4. 为了了解每个栏目用户关注的主题,对原创主题创建视图“主题_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.主题编号;