数据库系统原理
还是要好好学习的…万一哪天就有用了呢?
【万字长文,持续更新,考前必备】
绪论
1.1 数据库系统概述
1. 定义与历史
- 数据库是指按照一定规则存储数据的仓库
- 数据库技术诞生于上世纪六十年代末,是信息系统的核心与基础
- 目前,数据库有三种类型,关系型数据库、非关系型数据库、键值数据库。
- 关系型数据库:如MySQL、MariaDB
- 非关系型数据库:Cassandra、MongoDB
- 键值型数据库:Dynamo、LevelDB
2. 四个基本概念
-
数据(Data)
- 数据是数据库中存储的基本对象
- 它是被描述事物的符号记录
- 数据的种类可以是文本、图形、图像等等等
- 数据和语义是密不可分的。举个例子,数字3是一个数据,他的语义可以是年龄、学年、学分等等等。
-
数据库(Database)
-
数据库管理系统(DBMS)
- 数据库管理系统,是位于用户和操作系统之间的一层数据管理软件。
- 它可以科学的组织和存储数据,高效的获取和维护数据。
- 一般而言,数据库管理系统会提供操纵语言(DML),用以实现对数据库的基本操作
- 也就是增删改查
- 数据库管理系统要保障数据的安全性、完整型,保障多用户对数据的并发使用
-
数据库系统(DBS)
- 在计算机系统中引入数据库后的系统构成数据库系统
- 这玩意包括:
- 数据库、数据库管理系统、应用程序、数据库管理员、用户
1.2 数据模型
1. 两大类数据模型
- 数据模型分为两类,概念模型,逻辑模型和物理模型
- 概念模型,又称信息模型,他是按照需求对数据和信息进行建模后得到的,用于数据库设计。
- 逻辑模型,包括层次模型,关系模型,面向对象模型,网状模型等,用于数据库管理系统实现。
- 物理模型,就是对数据最底层的抽象,描述数据在系统内部的表示方式和存取方法。
2. 基本概念
-
实体(Entity)
-
客观存在并可以相互区别的事物被称为实体。 -
可以是具体的人、事、物活抽象的概念。 -
属性(Attribute)
-
实体所具有的某一特性被称为属性 -
一个实体可以有很多很多的属性 -
码(Key)
-
可以唯一标识实体的属性集被称为码。 -
比如id就是最典型的Key。 -
域(Domain)
-
实体型(Entity Type)
-
实体集(Entity Set)
-
联系(Relationship)
3. 两个实体型之间的联系
-
一对一 ( 1 : 1 )
-
一对多联系 ( 1 : n )
-
多对多联系 ( m : n )
4. ER图
- ER图中,矩形表示实体,圆形表示属性,菱形表示联系
- 联系本身也是一种实体型,可以有属性。
- 示例如下:
5. 数据模型的组成要素
-
数据结构
- 数据结构描述了数据库的组成对象,以及对象间的联系
- 这是对系统静态特性的描述
- 比如说,学生关系模式里,可能有学号(CHAR 8)、姓名(CHAR 8)、性别(INT 1)、专业代号(INT 2)
-
数据操作
-
对各种对象或实例允许执行的操作。 -
这是对系统动态特性的描述 -
增删改查就属于这个 -
数据的完整性约束条件
-
关系模型
-
关系数据模型的完整性约束条件
1.3 数据库系统结构
1. 数据库系统模式的概念
2. 数据库系统的三级模式结构
-
模式 (Schema)
- 模式,又称逻辑模式,上一个小结刚写完
- 一个数据库只有一个模式
-
外模式 (External Schema)
- 外模式,是数据库用户使用的局部数据结构的逻辑结构和特征的描述
- 外模式通常是模式的自己
-
内模式 (Internal Schema)
-
内模式是数据物理结构和存储方式的模式 -
一个数据库只有一个内模式 -
这玩意距离的是数据在数据库内部的表示方式
关系代数
2.1 概述
1. 定义
2. 传统的集合运算
3. 专门的关系运算
-
设R一个关系模式为R(A1,A2,A3,A4)
- 把它的一个关系设为R
- t∈R表示t是R的一个元组
- t[Ai]表示t中属性Ai的一个分量
-
还是对于上面那个
- 若A={Ai1, Ai2, …, Aik},其中Ai1,Ai2是A1,A2的一部分,则称A为属性列或属性组
- t[A] = (t[Ai1], t[Ai2], …, t[Aik])表示元组t在属性列A上诸分量的集合
- A拔则表示R中去掉A的属性组
-
元组的连接
- R为n目关系,S为m目关系。
- 假设t属于R,t2∈S
- 那么元组的连接是一个n+m列的元组,前n个分量是R里的一个n元组,后m个是S里的一个m元组
-
象集Zx
- 给定一个关系R(X,Z),X 和 Z 为属性组。
- 当t[X]=x 时,x在R 中的象集(Images Set)
- Zx={t [Z] | t ∈R,t [X]=x}
- 它表示R 中属性组X上值为x的诸元组在Z上分量的集合
? 李明 在 R 中的象集课程名称李明 ={软件工程,数据库系统原理,.NET程序设计}
? 张敏在R中的象集 课程名称张敏 ={软件工程,数据库系统原理,.NET程序设计}
? 王强在R中的象集 课程名称王强={软件工程,.NET程序设计}
4. 选择、投影、连接和除
**学号 **Sno | 姓名 Sname | 性别 Ssex | **年龄 **Sage | 所在系 Sdept |
---|
200215121 | 李勇 | 男 | 20 | CS | 200215122 | 刘晨 | 女 | 19 | IS | 200215123 | 王敏 | 女 | 18 | MA | 200215125 | 张立 | 男 | 19 | IS |
教师号 | 姓名 | 年龄 |
---|
001 | Bill | 22 | 002 | Rose | 30 |
-
选择
-
选择又称为限制 -
简单的来说,就是设定一个条件,过滤出所有符合条件的元组 -
条件可以是>,<, ≥ ,≤, =等 -
顺便一提,所有空值,都算不满足条件 -
查询σSage < 20 ∧ Sdept=‘IS’(Student) -
从学生表中选出性别为女的所有学生:σ Ssex = “女”(Student) 从学生表中选出性别为女且年龄为19的所有学生σ Ssex = “女”.and.σ Sage = 19(Student) -
投影
-
投影,从R中选择出若干属性列组成新的关系 -
选择是横向选出若干个元组,投影是纵向选出若干个列 -
投影可能会取消某些元组,行数可能会减少(可能主键被干掉了) -
求全体学生的学号:∏ Sno, (Student) -
求Student关系上姓名和所在系的投影:∏ Sname,Sdept(Student) -
连接
-
又称θ连接 -
θ是比较运算符。 -
公式如下,我觉得写那么多乱乱的东西更不好理解。 -
就是先求R和S的笛卡尔积 然后在这里面选择满足AθB的。 比如,R?S(R.年龄 > S.年龄) 先笛卡尔积,如下图
学号 | R.姓名 | R.年龄 | 教师号 | S.姓名 | S.年龄 |
---|
001 | John | 23 | 001 | Bill | 22 | 001 | John | 23 | 002 | Rose | 30 | 002 | Rose | 20 | 001 | Bill | 22 | 002 | Rose | 20 | 002 | Rose | 30 |
然后选择(R.年龄 > S.年龄)的 结果就是
学号 | R.姓名 | R.年龄 | 教师号 | S.姓名 | S.年龄 |
---|
001 | John | 23 | 001 | Bill | 22 |
-
然后,我要进行一些定义 首先,连接,又称θ连接 等值连接是一种特殊的θ连接,θ运算符为=的时候,即成立等值连接 等值连接可以分为内连接和外连接 其中,内连接又称自然连接 外连接包括全外连接,左外连接,右外连接。 【这里的定义很乱,网上无数个不同版本,这只是其一。】 -
如果比较运算符θ变成了=,那么就成立为了等值连接。 比如,如果我现在有两个表,都是学生信息,以学号作为主键。一个表有选了多少课,另一个表表有参加了多少社团 那就是找到两个表里学号相同的元组,这两个表里另一个表没有的元组会被舍弃 等值连接中,公共属性不会合并,原先有多少列,结束的时候就有多少列。 -
如果在所有公共属性上都做等值连接,并且在结果中去掉重复属性,就是自然连接。 可以理解为直接把那两个学生信息表合并起来,合并主键–学号。 回到刚刚的连接,我们舍弃了不符合θ关系的元组,如果不舍弃这部分元组,并在缺失的属性上填空值,就变成了外连接。 为了方便理解,我花了半个多小时做了一个图 -
一图让你看懂内外连接 -
再举个例子 查询信息系(IS)选修了‘Access’课程的学生姓名 首先,在学生表里查询信息系的学生σSdept=‘IS’( Student) 然后在课程表查询选修了’Access’的学生σCname=‘Access’(Course) 但是这两个不能直接连接,因为没有公告信息 所以和总表连接 σSdept=‘IS’( Student)∞SC∞σCname=‘Access’(Course) 然后再投影取它的姓名 πSname(σSdept=‘IS’( Student)∞SC∞σCname=‘Access’(Course)) 简写一下,就是 πSname(σCname=‘Access‘ ∧ sdept=‘IS’(Student ∞ SC ∞ Course)) -
查询所有选修了课程的学生姓名和选修课程号 ∏Sname,cno( Student [连接] SC ) 先把这两个表合并做自然连接,再投影找到姓名和选修课程号构成的元组 -
询所有学生的学生姓名和他们的选修课程号 ∏Sname,cno( Student [左外连接] SC ) 先把这两个表做左外连接,保留没有选课信息的表 然后投影找到姓名和选修课程号构成的元组 -
除
-
关系R和S除运算的结果T为满足如下条件的最大的元组集合 T x S 包含于R -
除法运算的除数和被除数都是一个关系
-
除运算的被除数R一般是表达两个实体之间一对多或多对多之间联系的关系(ST) 其中各元组表达了现实中某实体型(X)中某个实体(x)与另一类实体型(Y)中各实体(y)之间的联系。 比如,某学生选修某一门课程 -
除数S一般是由参与该联系的某个实体型(Y)中的多个实体(y)组成的关系。 比如,信息系的所有学生 -
除法运算的具体含义是从一个实体型(X)中选择出与除数S中所有实体均有联系的实体t,组成新的关系T,即被除数T。 -
除法运算的笛卡尔积的逆运算。 有点类似于线代矩阵的除法,我们只是找到一个关系,和除数关系做笛卡尔积,能得到被除数关系。 其前提条件为,关系R和S中必须具有相同属性Y,且R中必须包含不在S中的属性集X。
-
R ÷ S , R(其他属性, 相同属性) \ S(相同属性,其他属性) -
运算第一步,把除数简化为相同属性 -
R(x,y)÷S(y,z) == R(x,y) ÷ S(y) -
除法操作同时从行角度和列角度进行运算,直接用老师课件
? Eating÷Apple
? = R(Pno, Ano) ÷ Apple(Ano)
? 找到包含Apple(Ano)里的每一个元素的Pno
? 也就是{001}
-
来个例题
-
查询选修了全部课程的学生号码和姓名 -
先在Course表里,找到所有课程的id,∏ Cno(Course) -
然后用SC表,做投影拿到学生id和课程id,除上面那个,找到选修所有课程的学生的学生id ∏Sno,Cno(SC)÷ ∏ Cno(Course) -
然后用选修了所有课程的学生的学生id,连接学生宗表,投影找他们的学号和姓名 -
(∏Sno,Cno(SC)÷ ∏ Cno(Course)) ∏ Sno,Sname(Student)
2.2 例题
1.综合案例题干
-
假设有一个供应商和零件数据库,其中有三个关系S,P和SP分别表示供应商关系表、零件关系表和供应商供应零件关系表。 -
S (S#, SNAME, STATUS, CITY),对应的属性分别为供应商编号、供应商名称、供应商状态、供应商所在城市; -
P (P#, PNAME, COLOR, WEIGHT, PRICE),对应的属性分别为零件编号、零件名称、颜色、重量和价格,其中价格的单位为元; -
SP (S#, P#, QTY),其中S#参照S.S#, P#参照P.P#,都是外码,属性分别为供应商编号、零件编号、供应量。
2. 查询
MySQL语句
3.1 SQL概述
1. 定义
- SQL,一瞅就是个简写。它是(Structured Query Language),结构化查询语言的简写。
- SQL是一种介于关系代数与关系演算之间的语言,其功能包括查询、操纵、定义和控制四个方面,是一个通用的功能极强的关系数据库标准语言。
- SQL是一种标准化的查询语言,MySQL是一种关系型数据库软件
- 这俩不在一个层面上哦
- SQL目前是一种很广泛的查询语言,很多数据库都在用
2. 特点
- 集数据定义语言(DDL),数据操纵语言(DML),数据控制语言(DCL)功能于一体。
- SQL可以独立完成数据库生命周期中的全部活动
- 定义关系模式,插入数据,建立数据库
- 对数据库中的数据进行查询和更新
- 数据库重构和维护
- 数据库安全性、完整性控制
- 非关系数据模型的数据操纵语言面向过程,必须指定存取路径
- 而SQL只需要提出做什么,不需要了解存取路径
- 存取路径的选择以及SQL的操作过程都由系统自动完成
- SQL既可以作为独立语言,也可以作为嵌入式语言,嵌入到高级语言程序中使用
3. 基本概念
-
约束
-
定义
- 约束是强加在表上的规则或条件。
- 当我们对表进行DML或DDL操作时,如果此操作会造成表中的数据库违反约束条件或规则,系统就会拒绝执行这个操作。
- 我们写的约束被称为自定义约束
-
从功能分类
- 主键约束,用于唯一表示表中的某属性,不能重复,不能为空。
- 外键约束,用来维护从表和主表之间的引用完整性。
- 唯一约束,用来保证表中每行的某属性不能彼此相通
- 非空约束,用来约束某属性不能为空值
- 条件约束,用户自定义某条件,保证表中的每行都要满足该约束条件。
-
从层级分类
-
列级约束
- 包含在列定义中,直接写在列定义后头,只对单独列有效
- 支持所有的约束
-
表级约束
-
常见的约束
-
not null 非空约束,用于保证这个字段不为空 -
default 默认约束,用于保证这个字段有默认值 -
PRIMARY KEY 主键约束,用于保证这个字段唯一且不为空 -
UNIQUE 唯一性约束,保证这个字段唯一 -
FOREGIN KEY 外键约束,保证该字段的值必须来自于主表 -
CHECK 用户自定义约束,自定义检查条件 -
名词
- 数据库中的基本单位
- 表 TABLE
- 模式 SCHEMA
- 视图 VIEW
- 索引 INDEX
3.2 SQL语法
1. 定义并添加约束
2. 表的删除和修改
-
语法 ALTER TABLE <表名> [ADD <新列名><数据类型>[完整性约束]] [ DROP column 列名] [add constraint <完整性约束名> <完整性约束>] [DROP constraint <完整性约束名>] [MODIFY<列名> <数据类型>[完整性约束]] ];
-
其中<表名>指定需要修改的基本表 -
ADD子句用于增加新列和新的完整性约束条件 -
DROP子句用于删除指定的完整性约束条件 -
MODIFY子句用于修改原有的列定义。 -
实例
-
向Student表增加“入学时间”列,其数据类型为日期型 ALTER TABLE Student ADD S_entrance date; -
向Student表中加入“入学时间”、“生源地”两列。 ALTER TABLE Student ADD (S_entrance date, S_area char(10)); -
删除Student表中的“入学时间”列 ALTER TABLE Student DROP COLUMN S_entrance; -
删除Student表中“入学时间”、“生源地”两列。 ALTER TABLE Student DROP(S_entrance date, S_area char(10)); -
将Stuent表中性别Ssex这一列由原来的char(2)修改为char(8),并赋默认值为‘女’ ALTER TABLE Student MODIFY Ssex char(8) DEFAULT(‘女’);
【先写到这,下午回来改】
|