实验五 视图与完整性约束
目录
- 实验五 视图与完整性约束
- 选择题
- sql评测题
- 1、SQl视图:建立视图CJ\_STUDENT
- 题目
- 代码
- 题解
- 2、SQL视图:建立视图AVG\_CJ
- 题目
- 代码
- 3、SQL视图:建立视图IS\_STUDENT
- 题目
- 代码
- 题解
- 4、SQL视图:根据视图CJ\_STUDENT创建视图CJ\_TJ
- 题目
- 代码
选择题
-
数据库db_student中基本表的数据如下:
学生表:Student
Sno Sname Ssex Sage Sdept 9512101 李勇 男 19 计算机系 9512103 王敏 女 20 计算机系 9521101 张莉 女 22 信息系 9521102 吴宾 男 21 信息系 9521103 张海 男 20 信息系 9531101 钱小平 女 18 数学系 9531102 王大力 男 19 数学系 课程表:Course Cno Cname Ccredit Semster Period — ----- ------- ------- ------ C01 计算机导论 3 1 3 C02 VB 4 3 4 C03 计算机网络 4 7 4 C04 数据库基础 6 6 4 C05 高等数学 8 1 8 sc表建立有与student(sno)的外码约束(规则:限制);与course(cno)的外码约束(规则:限制) 选课表:SC
Sno Cno Grade 9512101 C03 95 9512103 C03 51 9512101 C05 80 9512103 C05 NULL 9521101 C05 NULL 9521102 C05 80 9521103 C05 45 9531101 C05 81 9531101 C01 67 9531102 C05 94 9521103 C01 80 9512101 C01 NULL 9531102 C01 NULL 9512101 C02 87 9512101 C04 76 在Sc表中插入一条数据: 9512121 C01 NULL ------- — ---- 插入是否成功?为什么 D A. 成功
B. 不成功,成绩为NULL
C. 不成功,课程号违反外码约束
D. 不成功,学号违反外码约束根据题目中的描述,SC表建立了学号Sno和课程号Cno的外键约束,而在学生表中并没有Sno为9512121的记录,因此在向SC表中插入数据时,学号Sno为9512121违反了外键约束,因此插入不成功,答案为选项D。
-
在关系R ( R # , RN , S # )和S ( S # , SN , SD )中, R 的主码是R # , S 的主码是S #,则S#在R 中称为 A
A 外码
B 候选码
C 主码
D 超码 -
在关系模型中,一个关键字是( D )。
A 不能由全部属性组成
B 由一个属性组成
C 由一个或多个任意属性组成
D 可由一个或多个能惟一标识该关系模式中任意元组的属性组成在关系模型中,一个关键字是可由一个或多个能惟一标识该关系模式中任意元组的属性组成,因此答案为选项 D。关键字是关系模型中非常重要的概念,它用于唯一地标识关系模型中的每个元组。一个关键字必须满足以下两个条件:1)唯一性,即该关键字能够唯一地标识每个元组;2)最小性,即该关键字不能是任何其他属性的真子集。
-
假设存在一张职工表,包含“性别”属性,要求这个属性的值只能取“男”或“女”,这属于(A )。
A 用户定义的完整性
B 参照完整性
C 实体完整性
D 关系不变性
用户定义的完整性是指用户为了满足某些特定的业务需求而定义的完整性约束,例如本题中对性别属性的取值范围进行了限制,只能取“男”或“女” -
等值联接和自然联接相比较,正确的是( B )。
A 等值联接的属性个数大于或等于自然联接的属性个数
B 等值联接的属性个数大于自然联接的属性个数
C 等值联接和自然联接的结果完全相同
D 等值联接和自然联接的联接条件相同- 自然连接一定是等值连接,但等值连接不一定是自然连接。应为自然连接要求相等的值属于公共属性,而等值连接要求相等的等的值不一定是公共属性。
- 等值连接不把重复属性去掉,而自然连接要把重复属性去掉。
-
有两个关系R ( A , B , C )和S ( B , C,D),则R和S自然连接后所得结果的属性个数是( B) 。
A 5
B 4
C 3
D 6自然连接是指将两个关系中所有具有相同属性名的属性作为连接条件,然后将这些属性只保留一次,其余属性合并成一个关系。
在此情况下,R和S具有相同的属性B和C,因此这些属性将被用作连接条件。自然连接后,结果将包含属性A、B、C、D,共4个属性。
-
关系运算中花费时间可能最长的运算是( A )。
A 笛卡尔积
B 选择
C 投影
D 除 -
设关系R和S的属性个数分别为2和3,那么
等价于。 B
A. σ1<2(R×S)
B. σ1<4(R×S)
C. σ1<2(R∞S)
D. σ1<4(R∞S)
σ1<4(R×S) 表示选择(R×S)中属性数量小于4的部分。  
由于R×S连接后有5个属性,所以选择1<4就选择了其中的4个属性,符合要求。
-
σF1(σF2(E))与 A 等价。
A. σF1∧F2(E)
B. σF1(E)
C. σF2(E)
D. σF1∨F2(E)
σF1(σF2(E)) 表示先用F2 σ运算得到结果,再用F1 σ运算得到最终结果。
-
关系表A有p1个属性t1个元组;关系表B有p2个属性t2个元组。则A与B的笛卡尔积A×B分别有( C )属性和元组。
A p1+p2、t1+t2
B t1×t2、p1+p2
C p1+p2、t1×t2
D p1×p2、t1×t2 -
学生表:Student
表结构:
列名 说明 数据类型 约束 SNO 学号 CHAR(7) 主码 SNAME 姓名 CHAR(10) NOT NULL SSEX 性别 CHAR(2) 取“男”或“女” SAGE 年龄 SMALLINT SDEPT 所在系 VARCHAR(20) 默认“计算机系” 表中数据: Sno Sname Ssex Sage ------- ----- ---- ---- 9512101 李勇 男 19 9512103 王敏 女 20 9521101 张莉 女 22 9521102 吴宾 男 21 9521103 张海 男 20 9531101 钱小平 女 18 9531102 王大力 男 19 在Student表中插入一条数据: 9512101 张海 女 20 ------- – - – 插入是否成功?为什么? C A. 成功
B. 不成功,因为缺少sdept列的数据
C. 不成功,因为违反主码约束
D. 不成功,因为姓名重复 -
已有视图is_student,视图中包含信息系全体学生的基本信息。(已设置了限制更新)
执行如下语句:
UPDATE is_student
set sage=sage+1;
student表中数据如何变化? C
A. 全体学生年龄加1
B. 信息系学生年龄加1
C. 没有数据更新发生 -
已有视图is_student,视图中包含信息系全体学生的基本信息。(已设置了限制更新)
执行如下语句:
INSERT INTO is_student(sno,sname,ssex,sage,sdept)
VALUES(‘9531103’,‘张玉’,‘女’,21,‘计算机系’);
student表中数据如何变化?B
A. 新增一条数据
B. 语句执行被拒绝
-
数据库db_student中基本表的数据如下:
学生表:Student
Sno Sname Ssex Sage Sdept 9512101 李勇 男 19 计算机系 9512103 王敏 女 20 计算机系 9521101 张莉 女 22 信息系 9521102 吴宾 男 21 信息系 9521103 张海 男 20 信息系 9531101 钱小平 女 18 数学系 9531102 王大力 男 19 数学系 课程表:Course Cno Cname Ccredit Semster Period — ----- ------- ------- ------ C01 计算机导论 3 1 3 C02 VB 4 3 4 C03 计算机网络 4 7 4 C04 数据库基础 6 6 4 C05 高等数学 8 1 8 sc表建立有与student(sno)的外码约束(规则:限制);与course(cno)的外码约束(规则:限制) 选课表:SC
Sno Cno Grade 9512101 C03 95 9512103 C03 51 9512101 C05 80 9512103 C05 NULL 9521101 C05 NULL 9521102 C05 80 9521103 C05 45 9531101 C05 81 9531101 C01 67 9531102 C05 94 9521103 C01 80 9512101 C01 NULL 9531102 C01 NULL 9512101 C02 87 9512101 C04 76 修改SC表中记录,将学号9512101改为9512109,更改是否成功?为什么?B A. 成功
B. 不成功,违反外码约束
C. 不成功,违反主码约束 -
数据库db_student中基本表的数据如下:
学生表:Student
Sno Sname Ssex Sage Sdept 9512101 李勇 男 19 计算机系 9512103 王敏 女 20 计算机系 9521101 张莉 女 22 信息系 9521102 吴宾 男 21 信息系 9521103 张海 男 20 信息系 9531101 钱小平 女 18 数学系 9531102 王大力 男 19 数学系 课程表:Course Cno Cname Ccredit Semster Period — ----- ------- ------- ------ C01 计算机导论 3 1 3 C02 VB 4 3 4 C03 计算机网络 4 7 4 C04 数据库基础 6 6 4 C05 高等数学 8 1 8 选课表:SC Sno Cno Grade ------- — ----- 9512101 C03 95 9512103 C03 51 9512101 C05 80 9512103 C05 NULL 9521101 C05 NULL 9521102 C05 80 9521103 C05 45 9531101 C05 81 9531101 C01 67 9531102 C05 94 9521103 C01 80 9512101 C01 NULL 9531102 C01 NULL 9512101 C02 87 9512101 C04 76 在Course表中删除课程代号为C01的记录,观察SC表中选课C01的记录是否删除? A A. 删除
B. 不删除 -
设W=R∞S,且W,R,S的元组个数分别为p,m,n,那么三者之间满足。 D
A. p<(m+n)
B. p≤(m+n)
C. p<(m×n)
D. p≤(m×n)
由关系代数中笛卡尔积的定义可知,关系W=R∞S 的元组个数为 R 的元组个数乘以 S 的元组个数,即 p=m×n。因此,不等式 p≤(m×n) 成立
sql评测题
1、SQl视图:建立视图CJ_STUDENT
题目
#建立视图cj_student,视图中包含所有成绩不及格(含没有成绩)的学生的学号,姓名,课程名,成绩,按成绩降序排序。
学生数据库db_student包括三个数据表student(学生表)、course(课程表)和sc(选课表)。表结构如下:
1、student(学生表):
SNO学号CHAR(7)
SNAME姓名CHAR(10)
SSEX性别CHAR(2)
SAGE年龄SMALLINT
SDEPT所在系 VARCHAR(20)
2、course(课程表)
CNO课程号CHAR(10)
CNAME课程名VARCHAR(20)
CCREDIT学分SMALLINT
SEMSTER学期SMALLINT
PERIOD学时SMALLINT
3、sc(选课表)
SNO 学号CHAR(7)
CNO 课程号CHAR(10)
GRADE 成绩 SMALLINT
[注意:SQL表名请用小写]
代码
CREATE VIEW cj_student AS
SELECT
sc.Sno,sname,
cname,
grade
FROM
student,
course,
sc
WHERE sc.Sno=student.Sno
AND sc.Cno=course.Cno
AND (grade<60 OR grade IS NULL)
ORDER BY grade DESC
题解
用于创建一个名为 cj_student 的视图。视图是一个虚拟的表,可以看作是一个基于一个或多个表的查询结果集,视图的数据并不存储在数据库中,而是在查询时动态生成。
这个视图的查询语句首先使用了一个 JOIN 操作,将 student、course 和 sc 三个表联接起来。其中,student、course 和 sc 分别表示学生表、课程表和选课表,它们之间的关系是通过学生编号 Sno 和课程编号 Cno 进行关联的。
然后,在联接的结果集中,使用了一个 WHERE 子句来过滤出 grade 小于 60 或者 grade 为 NULL 的记录,也就是挂科或者没有成绩的记录。最后,使用了一个 ORDER BY 子句将符合条件的记录按照 grade 值的降序排序,也就是把成绩最差的放在前面。
最终,通过 SELECT 子句选取了 Sno、sname、cname 和 grade 四个属性,作为视图的列,这些列的值都来自于联接的结果集。因此,视图 cj_student 的结果集包含了所有选修了挂科课程的学生的信息,按照成绩从高到低排序。
2、SQL视图:建立视图AVG_CJ
题目
#建立视图avg_cj,视图包括学生的学号以及他们的平均成绩(取整),按成绩降序排列。
1、student(学生表):
SNO学号CHAR(7)
SNAME姓名CHAR(10)
SSEX性别CHAR(2)
SAGE年龄SMALLINT
SDEPT所在系 VARCHAR(20)
2、course(课程表)
CNO课程号CHAR(10)
CNAME课程名VARCHAR(20)
CCREDIT学分SMALLINT
SEMSTER学期SMALLINT
PERIOD学时SMALLINT
3、sc(选课表)
SNO 学号CHAR(7)
CNO 课程号CHAR(10)
GRADE 成绩 SMALLINT
[注意:SQL表名请用小写]
代码
create view avg_cj
as
select sno,round(avg(grade)) from sc
group by sno order by round(avg(grade)) desc;
3、SQL视图:建立视图IS_STUDENT
题目
#建立视图is_student,视图中包含信息系全体学生的基本信息。(要求限制更新)
1、student(学生表):
SNO学号CHAR(7)
SNAME姓名CHAR(10)
SSEX性别CHAR(2)
SAGE年龄SMALLINT
SDEPT所在系 VARCHAR(20)
2、course(课程表)
CNO课程号CHAR(10)
CNAME课程名VARCHAR(20)
CCREDIT学分SMALLINT
SEMSTER学期SMALLINT
PERIOD学时SMALLINT
3、sc(选课表)
SNO 学号CHAR(7)
CNO 课程号CHAR(10)
GRADE 成绩 SMALLINT
[注意:SQL表名请用小写]
代码
create view is_student
as
select * from student where sdept='信息系'
with check option;
题解
首先,该视图使用了一个 SELECT 语句,选取了所有的列,即使用了通配符 *,表示选取 student 表中的所有列。
然后,该视图使用了一个 FROM 子句,从 student 表中选取数据。
接着,该视图使用了一个 WHERE 子句,过滤出 sdept =‘信息系’ 的学生记录。其中,sdept 表示学生所在的系别,‘信息系’ 表示信息系的学生。
最后,该视图使用了一个 WITH CHECK OPTION 语句,用于限制对视图的更新操作。该语句的作用是确保只有符合条件的记录(即 sdept =‘信息系’)才能被插入到视图中,否则将会抛出错误。例如,如果尝试将一个非信息系的学生记录插入到 is_student 视图中,将会失败并抛出错误。
因此,视图 is_student 的结果集包含了所有信息系的学生信息,并且使用 WITH CHECK OPTION 语句来限制对视图的更新操作。
4、SQL视图:根据视图CJ_STUDENT创建视图CJ_TJ
题目
#已建有视图cj_student,视图中包含所有成绩不及格(含没有成绩)的学生的学号,姓名,课程名,成绩,按成绩降序排序。
根据视图cj_student创建视图cj_tj,包含课程名,不及格人数,不及格人姓名列表(以 | 分割),按照不及格人数降序排列。
学生数据库db_student包括三个数据表student(学生表)、course(课程表)和sc(选课表)。表结构如下:
1、student(学生表):
SNO学号CHAR(7)
SNAME姓名CHAR(10)
SSEX性别CHAR(2)
SAGE年龄SMALLINT
SDEPT所在系 VARCHAR(20)
2、course(课程表)
CNO课程号CHAR(10)
CNAME课程名VARCHAR(20)
CCREDIT学分SMALLINT
SEMSTER学期SMALLINT
PERIOD学时SMALLINT
3、sc(选课表)
SNO 学号CHAR(7)
CNO 课程号CHAR(10)
GRADE 成绩 SMALLINT
[注意:SQL表名请用小写]
代码
CREATE VIEW cj_tj AS
SELECT
cname,
COUNT(*) a,
GROUP_CONCAT(sname SEPARATOR '|')
FROM
cj_student
GROUP BY cname
ORDER BY a DESC
首先,该视图使用了一个 SELECT 语句,选取了三个列:cname、COUNT() a 和 GROUP_CONCAT(sname SEPARATOR ‘|’)。其中,cname 表示课程名称,COUNT() a 表示该课程挂科或成绩为空的学生人数,GROUP_CONCAT(sname SEPARATOR ‘|’) 表示该课程所有挂科或成绩为空的学生姓名列表,多个姓名之间使用竖线 | 分隔。
然后,该视图使用了一个 FROM 子句,从 cj_student 视图中选取数据。cj_student 视图表示所有选修了挂科或成绩为空课程的学生信息,包含了每个学生的姓名、课程名称和成绩信息。
接着,该视图使用了一个 GROUP BY 子句,按照课程名称 cname 将 cj_student 视图中的记录分组,以便统计每门课程挂科或成绩为空的学生人数,并获取每门课程对应的学生姓名列表。
然后,该视图使用了一个聚合函数 COUNT(*),计算每门课程挂科或成绩为空的学生人数,并使用 GROUP_CONCAT 函数将该课程所有挂科或成绩为空的学生姓名连接成一个字符串,多个姓名之间使用竖线 | 分隔。
最后,该视图使用了一个 ORDER BY 子句,按照挂科或成绩为空的学生人数的降序对课程进行排序,以便于查询时快速获取挂科或成绩为空学生人数排名靠前的课程。
因此,视图 cj_tj 的结果集包含了每门课程挂科或成绩为空的学生人数和所有挂科或成绩为空的学生姓名列表,并按照挂科或成绩为空的学生人数从高到低排序。