本博文涉及《数据库系统概论》第 6 版的主要理论知识,包含了前 7 章的理论知识。以题单的形式记录核心知识以应对期末考试。如有错误,欢迎纠正。
上一期的内容在《数据库系统概论(二)》中,包含了绪论,关系模型,数据库安全与触发器的内容。

# 关系代数

  1. 关系代数的运算对象是关系,运算结果不是关系。

    关系代数的运算结果还是关系。

  2. 关系代数分为传统的集合运算和专门的关系运算,则专门的关系运算有哪些?

    • 选择。
    • 笛卡尔积。
    • 连接。
    • 除。
    • 投影。

    传统的集合运算有并,差,交,笛卡尔积。

  3. 关系的差运算,对于两个关系 R 和 S,R-S 和 S-R 一定是等价的。

    关系的差运算有顺序,R-S 与 S-R 一般不等价。

  4. 关系代数中,表示不等于的运算符是!=。

    表示不等于的运算符只能是 <>。

  5. 用关系代数查询信息安全专业的全体学生。

    σSmajor=信息安(Student)\sigma_{Smajor='信息安全'}(Student)

    常见的在选择运算的条件表达式的运算符有 >(大于),>=(大于等于),<(小于),<=(小于等于),=(等于),<>(不等于),¬\lnot (非),\land (与),\lor (或)。

  6. 查询 2001 年后(包含 2001 年)出生的学生。

    σSbirthdate>=200111(Student)\sigma_{Sbirthdate>=2001-1-1}(Student)

  7. 查询学生的学号和主修专业。

    πSno,Smajor(Student)\pi_{Sno,Smajor}(Student)

  8. 检索选修课程号为 C1 的学生学号与成绩。

    πSno,Grade(σCno=C1(SC))\pi_{Sno,Grade}(\sigma_{Cno='C1'}(SC))

  9. 检索选修课程名为 ' 数据库原理 ' 的学生学号与姓名。

    πSno,Sname(σCname=数据库原(SCStudentCourse))\pi_{Sno,Sname}(\sigma_{Cname='数据库原理'}(SC \bowtie Student \bowtie Course))

  10. 检索所学课程包含 ZHANG 老师所讲授的所有课程的学生学号。

    πCno,Sno(SC)÷πCno(σTeacher=ZHANG(Course))\pi_{Cno,Sno}(SC) \div \pi_{Cno}(\sigma_{Teacher='ZHANG'}(Course))

  11. 检索至少选修了两门课程的学生学号。

    πSno(σ1=42!=5(SCSC))\pi_{Sno}(\sigma_{1=4 \wedge 2!=5}(SC \bowtie SC))

    这里的数字代表列号。1=4 表示同一个学生,2=5 表示同一门课程,2!=5 表示与当前课程不同的课程。已知 2=5 的元组一定成立,如果 2!=5 成立,那么选修的课程数就至少有 2 个了。

  12. 检索学号为 S3 的学生选修的课程号与成绩。

    πCno,Grade(σSno=S3(SC))\pi_{Cno,Grade}(\sigma_{Sno='S3'}(SC))

  13. 检索选修课程号为 C2 或 C4 的学生姓名与专业。

    πSname,Smajor(σCno=C2Cno=C4(StudentSC))\pi_{Sname,Smajor}(\sigma_{Cno='C2' \vee Cno='C4'}(Student \bowtie SC))

  14. 检索学号为 S1 的学生所学课程的课程名与任课教师名。

    πCname,Teacher(σSno=S1(SCCourse))\pi_{Cname,Teacher}(\sigma_{Sno='S1'}(SC \bowtie Course))

  15. 检索选修了全部课程的学生学号。

    πSno,Cno(SC)÷πCno(Course)\pi_{Sno,Cno}(SC) \div \pi_{Cno}(Course)

# SQL 语言

本博文涉及的表有学生表 Student、课程表 Course、学生选课表 SC。
Student(Sno\underline{Sno},Sname,Ssex,Sbirthdate,Smajor)
学生 (学号\underline{学号}, 姓名,性别,出生日期,专业)

Course(Cno\underline{Cno},Cname,Ccredit,Teacher)
课程 (课程号,课程名,学分,授课老师\underline{课程号},课程名,学分,授课老师)

SC(Sno\underline{Sno},Cno,Grade,Semester)
学生选课 (学号\underline{学号}, 课程号,成绩,选修学期)

  1. 查询学号为 20180003 的学生的详细情况。
SELECT * FROM Student 
WHERE Sno='20180003';
  1. 查询所有姓刘的学生的姓名、学号和性别。
SELECT Sname, Sno, Ssex FROM Student 
WHERE Sname LIKE '刘%';
  1. 如果课程号长度为 5 个字符,查询课程号为 81 开头,最后一位是 6 的课程名称和课程号。
SELECT Cname, Cno FROM Course 
WHERE Cno LIKE '81__6';
  1. 查询所有不姓刘的学生的姓名、学号和性别。
SELECT Sname, Sno, Ssex FROM Student
WHERE Sname NOT LIKE '刘%';
  1. 查询 DB_Design 课程的课程号和学分。
SELECT Cno, Ccredit FROM Course
WHERE Cname = 'DB\_Design' ESCAPE'\';
  1. 将学生 20180001 的出生日期改成 2001 年 3 月 18 日。
UPDATE Student
SET Sbirthdate='2001-03-18'
WHERE Sno='20180001';
  1. 将 2020 年第 1 学期选修 81002 课程的所有学生的成绩减少 5 分。
UPDATE Student
SET Grade=Grade-5
WHERE Semester='20201' AND Cno='81002';
  1. 将计算机科学与技术专业学生的成绩置零。
UPDATE SC
SET Grade=0
WHERE Sno IN (
SELECT Sno From Student
WHERE Smajor='计算机科学与技术'
);
  1. 建立信息管理与信息系统专业学生的视图,并要求进行插入、修改和删除操作时,仍需保证该视图只有信息管理与信息系统专业的学生。
CREATE VIEW xinxiguanli
AS
SELECT * FROM Student
WHERE Smajor='信息管理与信息系统'
WITH CHECK OPTION;
  1. 按照前文信息要求,创建 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)
)
  1. 建立学院表 School,要求学院名称 SHname 列取值唯一,且要求为变长的字符,长度最大为 40,学院编号 SHno 列为主码,要求为 8 个字符长度,另外还有属性 SHfounddate 表示建立日期。
CREATE TABLE School
(
	SHno CHAR(8) PRIMARY KEY,
	SHname VARCHAR(40) UNIQUE,
	SHfounddate DATE
)
  1. 按照前文信息要求,创建 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)
)
  1. 检索学生 S1 所选修全部课程的课程号与成绩,并按照成绩逆序排序。
SELECT Cno, Grade FROM SC
WHERE Sno = (
	SELECT Sno FROM Student
	WHERE Sname='S1'
)
ORDER BY Grade DESC
  1. 检索同时选修了至少两门课程的学生学号与姓名。
SELECT Sno, Sname FROM Student
WHERE Sno IN (
	SELECT Sno FROM SC 
 	GROUP BY SNO
   	HAVING COUNT(*)>=2
);
  1. 检索至少选修 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%';
  1. 检索 ZHANG 老师所授课程的每门课程的平均成绩。
SELECT AVG(SC.Grade) FROM SC, Course
WHERE SC.Cno=Course.Cno AND Course.Teacher LIKE 'ZHANG%'
GROUP BY SC.Cno;
  1. 检索所有女学生的学号和姓名,并按学号逆序排序。
SELECT Sno, Sname FROM Student
WHERE Ssex='女'
ORDER BY Sno DESC;
  1. 检索同时选修了至少三门课程的学生学号与姓名。
SELECT Student.Sno, Student.Sname FROM Student, SC
WHERE Student.Sno=SC.Sno
GROUP BY Student.Sno
HAVING COUNT(SC.Cno)>=3;

# 数据库设计

  1. 数据库设计的基本步骤有 需求分析阶段概念结构设计阶段逻辑结构设计阶段物理结构设计阶段数据库实施阶段数据库运行和维护阶段

  2. 数据字典是进行详细的 数据收集数据分析 之后所获得的主要成果。它是关于数据库中对数据的 描述,即元数据,而不是数据本身。

  3. 数据字典在需求分析阶段被建立,在数据库设计过程中不断修改、充实和完善。

  4. 数据字典通常包括哪些部分?

    • 数据项。
    • 数据结构。
    • 数据流。
    • 数据存储。
    • 处理过程。
  5. 数据项是数据的最小组成单位,若干个数据项能组成一个数据结构。