本博文涉及《数据库系统概论》第 6 版的主要理论知识,包含了前 7 章的理论知识。以题单的形式记录核心知识以应对期末考试。如有错误,欢迎纠正。
上一期的内容在《数据库系统概论(二)》中,包含了绪论,关系模型,数据库安全与触发器的内容。
# 关系代数
关系代数的运算对象是关系,运算结果不是关系。
关系代数的运算结果还是关系。
关系代数分为传统的集合运算和专门的关系运算,则专门的关系运算有哪些?
传统的集合运算有并,差,交,笛卡尔积。
关系的差运算,对于两个关系 R 和 S,R-S 和 S-R 一定是等价的。
关系的差运算有顺序,R-S 与 S-R 一般不等价。
关系代数中,表示不等于的运算符是!=。
表示不等于的运算符只能是 <>。
用关系代数查询信息安全专业的全体学生。
常见的在选择运算的条件表达式的运算符有 >(大于),>=(大于等于),<(小于),<=(小于等于),=(等于),<>(不等于), (非), (与), (或)。
查询 2001 年后(包含 2001 年)出生的学生。
查询学生的学号和主修专业。
检索选修课程号为 C1 的学生学号与成绩。
检索选修课程名为 ' 数据库原理 ' 的学生学号与姓名。
检索所学课程包含 ZHANG 老师所讲授的所有课程的学生学号。
检索至少选修了两门课程的学生学号。
这里的数字代表列号。1=4 表示同一个学生,2=5 表示同一门课程,2!=5 表示与当前课程不同的课程。已知 2=5 的元组一定成立,如果 2!=5 成立,那么选修的课程数就至少有 2 个了。
检索学号为 S3 的学生选修的课程号与成绩。
检索选修课程号为 C2 或 C4 的学生姓名与专业。
检索学号为 S1 的学生所学课程的课程名与任课教师名。
检索选修了全部课程的学生学号。
# SQL 语言
本博文涉及的表有学生表 Student、课程表 Course、学生选课表 SC。
Student(,Sname,Ssex,Sbirthdate,Smajor)
学生 (, 姓名,性别,出生日期,专业)
Course(,Cname,Ccredit,Teacher)
课程 ()
SC(,Cno,Grade,Semester)
学生选课 (, 课程号,成绩,选修学期)
- 查询学号为 20180003 的学生的详细情况。
SELECT * FROM Student | |
WHERE Sno='20180003'; |
- 查询所有姓刘的学生的姓名、学号和性别。
SELECT Sname, Sno, Ssex FROM Student | |
WHERE Sname LIKE '刘%'; |
- 如果课程号长度为 5 个字符,查询课程号为 81 开头,最后一位是 6 的课程名称和课程号。
SELECT Cname, Cno FROM Course | |
WHERE Cno LIKE '81__6'; |
- 查询所有不姓刘的学生的姓名、学号和性别。
SELECT Sname, Sno, Ssex FROM Student | |
WHERE Sname NOT LIKE '刘%'; |
- 查询 DB_Design 课程的课程号和学分。
SELECT Cno, Ccredit FROM Course | |
WHERE Cname = 'DB\_Design' ESCAPE'\'; |
- 将学生 20180001 的出生日期改成 2001 年 3 月 18 日。
UPDATE Student | |
SET Sbirthdate='2001-03-18' | |
WHERE Sno='20180001'; |
- 将 2020 年第 1 学期选修 81002 课程的所有学生的成绩减少 5 分。
UPDATE Student | |
SET Grade=Grade-5 | |
WHERE Semester='20201' AND Cno='81002'; |
- 将计算机科学与技术专业学生的成绩置零。
UPDATE SC | |
SET Grade=0 | |
WHERE Sno IN ( | |
SELECT Sno From Student | |
WHERE Smajor='计算机科学与技术' | |
); |
- 建立信息管理与信息系统专业学生的视图,并要求进行插入、修改和删除操作时,仍需保证该视图只有信息管理与信息系统专业的学生。
CREATE VIEW xinxiguanli | |
AS | |
SELECT * FROM Student | |
WHERE Smajor='信息管理与信息系统' | |
WITH CHECK OPTION; |
- 按照前文信息要求,创建 SC 表,说明 Sno, Cno, Grade 属性不允许取空值。
CREATE TABLE SC | |
( | |
Sno CHAR(8) NOT NULL, | |
Cno CHAR(5) NOT NULL, | |
Grade SMALLINT NOT NULL, | |
Semester CHAR(5), | |
PRIMARY KEY(Sno, Cno) | |
) |
- 建立学院表 School,要求学院名称 SHname 列取值唯一,且要求为变长的字符,长度最大为 40,学院编号 SHno 列为主码,要求为 8 个字符长度,另外还有属性 SHfounddate 表示建立日期。
CREATE TABLE School | |
( | |
SHno CHAR(8) PRIMARY KEY, | |
SHname VARCHAR(40) UNIQUE, | |
SHfounddate DATE | |
) |
- 按照前文信息要求,创建 Student 表,且要求性别属性为 6 字符长度且只允许取 ' 男' 或 ' 女',学号属性为 8 个字符长度且为主码,姓名属性为 20 个字符长度且不为空,专业属性为变长的字符串,最长为 20。
CREATE TABLE Student | |
( | |
Sno CHAR(8) PRIMARY KEY, | |
Sname CHAR(20) NOT NULL, | |
Ssex CHAR(6) CHECK(Ssex In('男','女')), | |
Sbirthdate DATE, | |
Smajor VARCHAR(20) | |
) |
- 检索学生 S1 所选修全部课程的课程号与成绩,并按照成绩逆序排序。
SELECT Cno, Grade FROM SC | |
WHERE Sno = ( | |
SELECT Sno FROM Student | |
WHERE Sname='S1' | |
) | |
ORDER BY Grade DESC。 |
- 检索同时选修了至少两门课程的学生学号与姓名。
SELECT Sno, Sname FROM Student | |
WHERE Sno IN ( | |
SELECT Sno FROM SC | |
GROUP BY SNO | |
HAVING COUNT(*)>=2 | |
); |
- 检索至少选修 LIU 老师所授课程中一门课程的女学生姓名、课程名及成绩。
SELECT a.Sname, c.Cname, b.Grade FROM Student a, SC b, Course c | |
WHERE a.Sno=b.Sno AND b.Cno=c.Cno AND a.Ssex='女' AND b.Teacher LIKE 'LIU%'; |
- 检索 ZHANG 老师所授课程的每门课程的平均成绩。
SELECT AVG(SC.Grade) FROM SC, Course | |
WHERE SC.Cno=Course.Cno AND Course.Teacher LIKE 'ZHANG%' | |
GROUP BY SC.Cno; |
- 检索所有女学生的学号和姓名,并按学号逆序排序。
SELECT Sno, Sname FROM Student | |
WHERE Ssex='女' | |
ORDER BY Sno DESC; |
- 检索同时选修了至少三门课程的学生学号与姓名。
SELECT Student.Sno, Student.Sname FROM Student, SC | |
WHERE Student.Sno=SC.Sno | |
GROUP BY Student.Sno | |
HAVING COUNT(SC.Cno)>=3; |
# 数据库设计
数据库设计的基本步骤有 需求分析阶段、概念结构设计阶段、逻辑结构设计阶段、物理结构设计阶段、数据库实施阶段、数据库运行和维护阶段。
数据字典是进行详细的 数据收集 和 数据分析 之后所获得的主要成果。它是关于数据库中对数据的 描述,即元数据,而不是数据本身。
数据字典在需求分析阶段被建立,在数据库设计过程中不断修改、充实和完善。
数据字典通常包括哪些部分?
数据项是数据的最小组成单位,若干个数据项能组成一个数据结构。