《数据库系统概论》学习笔记——王珊 萨师煊

第一章 绪论

一、数据库系统概述

1.数据库的4个基本概念

(1)数据

描述事物的符号记录称为数据

(2)数据库

存放数据的仓库

(3)数据库管理系统

主要功能:
(1)数据定义功能
(2)数据组织、存储和管理
(3)数据操纵功能
(4)数据库的事务管理和运行管理
(5)数据库的建立和维护

(4)数据库系统

由数据库、数据库管理系统、应用程序、数据库管理员组成的存储、管理、处理和维护数据的系统

2.数据库的发展

人工管理阶段——>文件系统阶段——>数据库系统阶段
在这里插入图片描述

3.数据库系统的特点

(1)数据(整体)结构化
这就要求在描述数据时不仅要描述数据本身,还要描述数据之间的关系
(2)数据的共享性高、冗余度低且易扩充
数据共享——>减少了数据冗余
(3)数据独立性高
物理独立性:应用程序和数据库中数据的物理存储是相互独立的
逻辑独立性:用户的应用程序与数据库的逻辑结构是相互独立的
(4)数据由数据库管理系统统一管理和控制
数据库管理系统必须提供以下几方面的数据控制功能:
数据的安全性保护
数据的完整性检查
并发控制
数据库恢复

二、数据模型

1.模型分类

(1)第一类:概念模型

概念模型是现实世界到信息世界的第一层现象

信息世界中的基本概念:
1)实体
2)属性:实体所具有的某一特性(如:性别,学号,姓名)
3)码:唯一标识实体的属性(如:学号)
4)实体型:用实体名和属性名集合来抽象和刻画同类实体,称为实体型。
如:学生(姓名,学号,性别)
5)联系:实体之间的联系通常指实体集之间的联系
有:一对一,一对多,多对多

概念模型的一种表示方法:
实体-联系方法(E-R模型)

(2)第二类:逻辑模型和物理模型

逻辑模型,包括层次模型、网状模型、关系模型、面向对象数据模型、对象关系模型、半结构化数数据模型
物理模型,描述数据在系统内部的表示方式和存取方法,或在磁盘或磁带上存储方式和存取方法

2.数据模型的组成要素

(1)数据结构
描述对象和对象之间的联系
(2)数据操作
(3)数据的完整性约束条件

3.常用的数据模型

(1)层次模型

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/77baf6a2ff2e4ec3ba65f3c12f7116f7.jpeg具体例子:
在这里插入图片描述

完整性约束:
插入时,若没有相应双亲结点就不能插入它的子女节点值
删除时,如果删除双亲结点值,则相应的子女节点值也将同时删除

(2)网状模型

在这里插入图片描述具体例子:
在这里插入图片描述

(3)关系模型在这里插入图片描述

一些术语:
在这里插入图片描述

(4)面向对象数据模型、对象关系数据模型、半结构化数据模型

三、数据库系统的结构

1.数据库系统模式的概念

型: 对一类数据的结构和属性的说明,如(学号,姓名,性别)
值: 型的一个具体赋值,如(12345,李明,男)
模式: 数据库中全体数据的逻辑结构和特征的描述,仅涉及型的描述(相对稳定)
实例: 模式的一个具体值(相对变动)

2.数据库系统的三级结构

(1)模式(逻辑模式): 数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共视图。
一个数据库只有一个模式,定义模式时,不仅要定义数据的逻辑结构,还要定义数据之间的联系,定义与数据有关的安全性、完整性要求。
(2)外模式(子模式、用户模式): 是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。
(3)内模式(存储模式): 是数据物理结构和存储方式的描述,是数据在数据库内部的组织方式。

3.数据库的二级映像功能与数据独立性

(1)外模式/模式映像
(2)模式/内模式映像

在这里插入图片描述

第二章 关系数据库

一、关系数据结构及形式化定义

1.关系 —— 一张二维表

域: 一组具有相同数据类型的值的集合,类似数学中的值域
笛卡尔积: D1XD2XD3X……Dn
关系: 笛卡尔积的子集,表示为R(D1,D2,…Dn),R表示关系的名字,n是关系的目或度
候选码: 能唯一标识一个元组的属性组
主码: 选定一个候选码作为主码(类似身份证号)
全码: 所有属性都是候选码

基本关系的性质:
(1)列是同质的
每一列中的分量是同一类型的数据,来自同一个域
(2)不同的列可以出自同一个域
(3)列的顺序无所谓
(4)行的顺序无所谓
(5)任意两个元组的候选码不能相同
(6)分量必须取原子值,即每个分量都必须是不可分的数据项

2.关系模式——关系的描述

关系模式可以表示为
R(U,D,DOM,F)
其中R为关系名,U为组成该关系的属性名集合,D为U中属性所来自的域,DOM为属性向域的映像集合,F为属性见数据的依赖关系集合

3.关系数据库

在一个给定的应用领域中,所有关系的集合构成一个关系数据库
型: 也称为关系数据库模式,是对关系数据库的描述
值: 这些关系模式在某一时刻对应的关系的集合

二、关系操作

1.基本的关系操作

常用:查询、插入、删除、修改
其中,查询可分为选择、投影、连接、除、并、差、交、笛卡尔积
基本操作: 选择、投影、并、差、笛卡尔积

2.关系数据语言分类

(1)关系代数
用对关系的运算来表达查询要求
(2)关系演算
用谓词来表达查询要求
(3)SQL(结构化查询语言)
介于关系代数与关系演算之间,是集查询、数据定义语言、数据操纵语言、数据控制语言于一体的关系数据语言

三、关系的完整性

1.实体完整性

主属性不能取空值

2.参照完整性

外码要么取空值,要么等于被参照关系某个元组的主码值

3.用户定义完整性

针对某一具体关系数据库的 约束条件
如某个属性必须取一值,某个非主属性不能取空值,等等

四、关系代数 !

在这里插入图片描述

1.传统的集合运算

在这里插入图片描述

2.专门的关系运算

(1)选择(限制)

σ F ( R ) = { t ∣ t ∈ R ∧ F ( t ) = ′ 真 ′ } \sigma_F(R)=\{t|t\in R \wedge F(t)='真'\} σF(R)={ ttRF(t)=}

其中,F表示选择条件,取逻辑值“真”或“假”
F的基本形式为 X 1 θ Y 1 X_1 \theta Y_1 X1θY1 θ \theta θ的取值如下:
在这里插入图片描述

(2)投影

Π S n a m e ⋅ S d e p t ( S t u d e n t ) \Pi_{Sname·Sdept}(Student) ΠSnameSdept(Student)

投影是选择出若干属性列组成新的关系。

(3)连接

R ⋈ A θ B S = { t r t s ∣ t r ∈ R ∧ t s ∈ S ∧ t r [ A ] θ t s [ B ] } R\underset{A\theta B}{\bowtie}{}S=\{\overset{}{t_rt_s|t_r\in R \wedge t_s\in S\wedge t_r[A]\theta t_s[B]}\} RAθBS={ trtstrRtsStr[A]θts[B]}

其中,A和B分别为R和S上列数相等且可比的属性组, θ \theta θ是比较运算符。连接运算从R和S的笛卡尔积RxS中选取R关系在A属性组上的值与S关系在B属性组上的值满足比较关系 θ \theta θ的元组。

等值连接( θ \theta θ为=)
自然连接
要求两个关系中进行基表的分量必须是同名的属性组,并且在结果中把重复的属性列去掉。

悬浮元组
R中某些元组可能在S中不存在公共属性上值相等的元组,从而被丢失,S也是类似。要想不丢失悬浮元组,则需用外连接
外连接: 保留悬浮元组
左外连接: 只保留左边关系中的悬浮元组
右外连接: 只保留右边关系中的悬浮元组

具体例子如下:
连接的例子:
在这里插入图片描述
几种外连接的例子:

在这里插入图片描述

(4)除运算

R ÷ S = { t r [ X ] ∣ t r ∈ R ∧ Π Y ( S ) ⊆ Y x } \div S=\{t_r[X] |t_r\in R\wedge \Pi_Y(S)\subseteq Y_x\} ÷S={ tr[X]trRΠY(S)Yx}

除运算的结果为P(X)
P是R中满足满足以下条件的元组在X属性上的投影:元组在X上分量值x的象集 Y x Y_x Yx包含S在Y上投影的集合。

其实除法运算的本质就是找到R满足S中所有条件的元组

这个运算比较抽象,可以参考大佬的博客:
数据库——关系代数的除法运算最白话解析 by lmo星星呐
也可以参考我自己写的博客:
对数据库关系代数中除法运算的理解 by 云霄星乖乖的果冻

例:
在这里插入图片描述

第三章 关系数据库标准语言SQL

一、SQL基本概念

在这里插入图片描述基本表: 一个关系就对应一个表。一个或多个基本表对应一个存储文件,一个表可以带若干索引,索引也可以存放在存储文件中。
存储文件: 构成关系数据库的内模式,存储文件的物理结构对最终用户是隐蔽的。
视图: 视图是从一个或几个基本表导出的表,本身不独立存储在数据库中。

二、学生-课程数据库

为了后续方便,首先定义一个数据库S-T和几个基本的表:
(1)学生表:Student(Sno,Sname,Ssex,Sage,Sdept) ,主码为Sno
(2)课程表:Course(Cno,Cname,Cpno,Ccredit) ,主码为Cno
(3)学生选课表:SC(Sno,Cno,Grade) ,主码为Sno,Cno

具体表如下图:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、具体语言

1.数据定义

在这里插入图片描述

(1)模式

定义:
CREATE SCHEMA <模式名> AUTHORIZATION <用户名> [<表定义子句>|<视图定义子句>|<授权定义子句>];
若没有指定<模式名>,则隐含为<用户名>
删除:DROP SCHEMA<模式名><CASCADE|RESTRICT>;
CSACADE(级联)表示在删除模式的同时把该模式中所有数据库对象全部删除
RESTRICT(限制)表示如果该模式中已经定义了下属的数据库对象(如表,视图等),则拒绝该删除语句的执行

(2)基本表

数据类型:
在这里插入图片描述在这里插入图片描述

定义:CREATE TABLE <表名> (<列名><数据类型[列级完整性约束条件]>)[<列名><数据类型>[列级完整性约束条件]……[,<表级完整性约束条件>];
删除:DROP TABLE <表名> [CASCADE|RESTRICT];
默认为RESTRICT,删除有限制条件,要删除的表不能被其他表的约束所引用,不能有视图,不能有触发器,不能有存储过程或函数等;
若为CASCADE,则删除无限制条件,删除表时,相关的对象也将被删除
修改:ALTER TABLE <表名>
\quad \quad \quad [ADD [COLUMN] <新列名><数据类型>[完整性约束]]
\quad \quad \quad [ADD <表级完整性约束>]
\quad \quad \quad [DROP [COLUMN] <列名>[CASCADE|RESTRICT]
\quad \quad \quad [DROP CONSTRAINT <完整性约束名[CASCADE|RESTRICT]
\quad \quad \quad [ALTER [COLUMN] <列名><数据类型>]
表所属模式:
(1)在表中明显地给出模式名 CREATE TABLE "S-T".Student(...)
(2)在创建模式语句中同时创建表
(3)设置所属模式
若用户创建表时没有指定模式,系统根据搜索路径来确定该对象所属的模式。搜索路径包含一组模式列表,关系数据库管理系统会使用模式列表中第一个存在的模式作为数据库对象的模式名。若搜索路径中的模式名都不存在,系统将给出错误。
可以显示搜索路径:SHOW search_path;
也可以设置搜索路径:SET search_path TO "S-T,PUBLIC"
然后定义基本表:CREATE TABLE Student(...);

例:
建立一个学生表:

CREATE TABLE Student
	(Sno CHAR(9) PRIMARY KEY,
	Sname CHAR(20) UNIQUE,
	Ssex CHAR(2),
	Sage SMALLINT,
	Sdept CHAR(20) 
	);

建立一个课程表:

CREATE TABLE Course
	(
	Cno CHAR(4) PRIMARY KEY,
	Cname CHAR(4) NOT NULL,
	Cpno CHAR(4),
	Ccredit SMALLINT,
	FOREIGN KEY (Cpno) REFERENCES Course(Cno) /*表级完整性约束条件,Cpno是外码,被参照表是Course,被参照列是Cno
	);
(3)索引

建立:CREATE [UNIQUE][CLUSTER] INDEX <索引名>
\quad \quad ON <表名><列名>[<次序>][,<列名>[<次序>]]...
其中,<次序>可选ASC(升序)或DESC(降序)
UNIQUE表名此索引的每一个索引值只对应唯一的数据记录,CLUSTER表示要建立的索引是聚簇索引
修改:ALTER INDEX <旧索引名> RENAME TO <新索引名>;
删除:DROP INDEX <索引名>

2.数据查询

一般格式:
SELECT [ALL|DISTINCT] <目标列表达式> [,<目标列表达式>]...
FROM <表名或视图名> [,<表名或视图名>]|(<SELECT 语句>)[AS]<别名>
[WHERE <条件表达式>
[GROUP BY <列名1> [HAVING <条件表达式>]
[ORDER BY <列名2> [ASC|DESC]];

上述语句的含义是,根据WHERE子句的条件表达式从FROM子句指定的基本表、视图或派生表中找出满足条件的元组,再按SELECT子句中的目标表达式选出元组中的属性值形成结果表。若有GROUP BY子句,则按<列名1>的值进行分组,若有ORDER子句,则结果表还要按<列名2>的值的升序或降序排序。

(1)单表查询

常用查询条件

查询条件 谓词
比较 =,>,<,>=,<=,!=,<>,!>,!<;NOT+上述运算符
确定范围 BETWEEN AND,NOT BETWEEN AND
确定集合 IN,NOT IN
字符匹配 LIKE,NOT LIKE
空值 IS NULL,IS NOT NULL
多重条件(逻辑运算) AND,OR,NOT

其中,LIKE用法 如下:
[NOT] LIKE <匹配串> [ESCAPE '<换码字符>']
匹配串可以是一个完整的字符串,也可以含有通配符%(任意长度字符串)和_(任意单个字符)

常用聚集函数

函数 含义
COUNT(*) 统计元组个数
COUNT([DISTINCT|ALL] <列名>) 统计某一列中值的个数
SUM([DISTINCT|ALL] <列名>) 计算一列值的总和(必须是数值型)
AVG([DISTINCT|ALL] <列名>) 计算一列的平均值(必须是数值型)
MAX([DISTINCT|ALL] <列名>) 求一列中最大值
MIN([DISTINCT|ALL] <列名>) 求一列中最小值
(2)连接查询

1)等值与非等值连接
[<表名1>].<列名><比较运算符>[<表名2.><列名2>]
[<表名1>].<列名>BETWEEN[<表名2.>]<列名2>AND[表名2.]<列名3>

若在等值连接中把目标列中重复的属性列去掉则为自然连接

2)自身连接
一般会取别名

SELECT FIRST.Cno,SECOND.Cpno
FROM Course FIRST,Course SECOND
WHERE FIRST.Cpno=SECOND.CNO;

3)外连接
外连接会保留悬浮元组

SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
FROM Student LEFT OUTER JOIN SC ON (Student.Sno-SC.Sno);

4)多表连接

SELECT Student.Sno,Sname,Cname,Grade
FROM Student,SC,Course
WHERE Student.Sno=SC.SNO AND SC.Cno=Course.Cno
(3)嵌套查询

查询块: 一个SELECT-FROM-WHERE 语句为一个查询块
将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询为嵌套查询

上层查询块为外层查询父查询,下层查询块为内层查询子查询
不相关子查询: 子查询的查询条件不依赖于父查询
相关子查询: 子查询的查询条件依赖于父查询

1)带有in的查询

SELECT Sname
FROM Student
WHERE Sno IN
		(SELECT Sno
		FROM SC
		WHERE Cno='2');

2)带有比较运算符的查询

SELECT Sno,Sname,Sdept
FROM Student
WHERE Sdept=
		(SELECT Sdept
		FROM Student
		WHERE Sname='刘晨');

3)带有any或all的查询

(<)ANY,>(<)ALL,>=(<=)ANY,>=(<=)ALL,=ANY,=ALL(通常没有实际意义),!=ANY(ALL)

\*查询非计算机系中比计算机系任意一个学生年龄小的学生姓名和年龄*\
SELECT Sname,Sage
FROM Student
WHERE Sage<ANY(SELECT Sage
				FROM Student
				WHERE Sdept='CS')
AND Sdept<>'CS'

4)带有EXISTS谓词的子查询
带有EXISTS的子查询不返回任何数据,只产生逻辑真值"ture"和"false"
若内层查询为空,则外层的WHERE子句返回真值,否则返回假值
有EXISTS引出的子查询,其目标列表达式通常都用*,给出列名无实际意义

例:

SELECT Sname
FROM Student
WHERE EXISTS
		(SELECT *
		FROM SC
		WHERE Sno=Student.Sno AND Cno='1');

有关含EXIST的查询具体可见博客:
数据库含EXISTS的查询

(4)集合查询

并操作(类似OR): UNIOIN(去掉重复元组)/UNION ALL(保留重复元组)
交操作(类似AND) :INTERSECT
差操作(A-B) :EXCEPT
注: 参加集合操作的各查询结果的列数必须相同,对应项的数据类型也必须相同

例:

SELECT *
FROM Student
WHERE Sdept='CS'
EXCEPT
SELECT *
FROM Student
WHERE Sage<19;
(5)基于派生表的查询

子查询可以出现在FROM语句中,此时子查询生成的临时派生表为主查询的查询对象,此时必须为派生表指定一个别名,但是AS可以省略。

例:

SELECT Sname
FROM Student,(SELECT Sno FROM SC WHERE Cno='1') [AS] SC1
WHERE Student.Sno=SC1.Sno;

3.数据更新

(1)插入数据

可以插入一个元组,也可以插入子查询结果

1)插入元组:
INSERT
INTO <表名> [<属性列1>[,<属性列2>...]]
VALUES(<常量1>[,<常量2>]...);

注:
(1)没有出现的属性列,新元组将取空值
(2)若没有指定任何属性名,则新插入的元组必须在每个属性列上均有值,且次序应与CREATE TABLE中的次序相同

2)插入子查询结果
INSERT
INTO <表名> [<属性列1>[,<属性列2>...]]
子查询;

例:

CREATE TABLE Dept_age
		(Sdept CHAR(15)
		Avg_age SMALLINT);

INSERT
INTO Dept_age(Sdept,Avg_age)
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept;
(2)修改数据

UODATE <表名>
SET <列名>=<表达式>[,<列名>=<表达式>]...
[WHERE <条件>];

若没有WHERE条件,则对所有的元组作修改

(3)删除数据

DELETE
FROM <表名>
[WHERE <条件>]

若省略WHERE条件,表名删除表中全部元组,但表的定义仍在字典中

4.对空值的处理

(1)空值的判断

IS NULL 或 IS NOT NULL

(2)空值的约束条件

不能取空值:
1)属性定义中有NOT NULL约束条件的
2)加了UNIQUE限制的属性
3)码属性

(3)空值的算术运算、比较运算和逻辑运算

四、视图

参考资料

1.《数据库系统概论》王珊 萨师煊
2. 数据库——关系代数的除法运算最白话解析 by lmo星星呐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-09 02:56:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-09 02:56:04       106 阅读
  3. 在Django里面运行非项目文件

    2023-12-09 02:56:04       87 阅读
  4. Python语言-面向对象

    2023-12-09 02:56:04       96 阅读

热门阅读

  1. oracle 19c创建db_link名称带.com域名问题处理

    2023-12-09 02:56:04       60 阅读
  2. C++ Primer Plus第十四章笔记

    2023-12-09 02:56:04       43 阅读
  3. Win32编辑框消息学习

    2023-12-09 02:56:04       52 阅读
  4. postgresql-effective_cache_size参数详解

    2023-12-09 02:56:04       45 阅读
  5. leetcode - 2264. Largest 3-Same-Digit Number in String

    2023-12-09 02:56:04       53 阅读