一.概述
1.什么是数据库
数据库是数据的集合;是对现实中一个企业的建模;
2.数据库管理系统
用来存储和管理数据库的一种系统软件
3.为什么要用数据库而不是文件
文件
:文件是操作系统提供的最简单的,最基本的存储数据的机制,文件是没有结构的,就是单纯的字符流;
- 数据库可以通过DBMS直接进行很多操作,而文件的话只提供了简单的操作,文件只能用文件系统提供的几个函数,比如read,write
- 当多个用户并发访问数据库,文件要加锁,而DBMS会帮你做
- 文件不具有故障处理的能力,但是DBMS可以自动恢复
- 访问控制,文件只有可读可写可执行
- …
4.一些基本术语
数据:是用来描述现实世界事物的符号
数据模型:用来描述数据的一种方法,可以理解为数据结构
数据模式:用给定的数据模型来对特定企业进行描述;
这里举个例子
:给定一个树形结构,来对班级和学生进行描述;
这就是一种模式,它可以有很多实例:
关系 : 就是表
元组:表中的一行
属性:表中的一列
三级模式:
- 第一级:
Physical Schema[物理模式]
描述数据在磁盘上是怎么存的,用的什么索引,是按照哪个属性的排序存储的… - 第二级:
Conceptal Schema [概念模式]
也叫作逻辑模式,描述数据的逻辑结构,在mysql中就是对表的定义,比如用户表里面有姓名 varchar(10)
这就是一种模式; - 第三极:外模式也是视图层,一个数据库可以有多个外模式,而这些外模式都是根据逻辑模式中的中的属性算出来的; 外模式是保证数据库安全性的一个有力措施。每个用户只能看见和访问所对应的外模式中的数据,数据库中的其余数据是不可见的。
两级映射
-
外模式/逻辑模式映像
:一个DB只有一个模式,但可以有多个外模式。
所以,对于每一个外模式,数据库系统都有一个外模式/模式映像,它定义了这个外模式与模式的对应关系。外模式的描述中通常包含了这些映像的定义。
当模式改变时(增加新的关系、新的属性、改变属性的数据类型等),由数据库管理员对各个外模式/模式映像作相应的改变,可以使得外模式保持不变。而又由于应用程序应该是依据外模式编写的,从而应用程序不必修改,这就保证了数据与程序的逻辑独立性。 -
逻辑模式/内模式映像
:由上可知:一个DB只有一个模式,也只有一个内模式,所有模式/内模式映像是唯一的,它定义了数据全局逻辑结构与存储结构之间的对应关系。
当数据库的存储结构改变时(例如选用了另一个存储结构),由数据库管理员对模式/内模式映像作出相应的改变,可以使得模式保持不变,从而应用程序也不必改变。这就保证了数据和程序的物理独立性。
二.数据模型
1.层次模型
在现实中很多事情都是有层次的,就是数据结构中的树;
在数据库中,层次模型用一种双亲子女关系
来表示现实世界中,两个不同记录之间的一对多关系;
记录
:用来表达实体
域
:用来描述实体
但是现实中不是一个学生只选一门课的,往往会出现多对多映射;
层次结构引入一个虚记录
这里我们假设上图中的学生1
选择了课程1
和课程2
;
2.层次模型
网状模型的基本数据结构为set【系】,一个set表达现实世界中两个数据类型的一对多关系。其中一为主记录,多为属记录。
在层次模型中怎么描述一对多关系呢?
这里是引入LINK记录
3.关系模型
关系模型的基本数据结构是表,即关系。将现实生活中实体和实体之间的联系全部用表来表示。将表看出多个元组【记录】的集合,可以采用数学的研究方法进行研究。
特点:
- 基于数学集合论,有更高的抽象级别
- 屏蔽了所有的底层细节,易于理解
- 可以建立新的代数系统----关系代数
- 定义一个非过程化的查询语言----SQL
1.主键(primary key)
- 一个关系中任意两个元祖的这组属性的值都不一样
- 这组属性的任何一个子集都没有这个特性
同时满足1和2
的叫做候补键
;
满足1
不满足2
的叫做超键
;
如果有多个候补键
可以选择一个成为主键
;
如果主键是由这个关系的所有属性组成称为全键
;
2.外键(foreign key)
一个关系中有一组属性用它来引用另一关系里的主键属性,那么这组属性被称为外键;
3.完整性约束
域完整性约束
:插入属性的值是否符合值域
实体完整性约束
:主键不能为空
三.关系代数
是关系模型的理论基础
- 选择操作
σ
从一个表中把满足条件的元组选出来 - projection 投影操作
π
将需要的属性列出来 - 笛卡尔乘积
×
两个关系的拼接 - 集合差
-
把属于关系A不属于关系B的元组找出来 - 并
∪
把两个模式相同的元组并起来
并兼容
:属性的个数一样,对应属性的类型一样;
满足并兼容的关系才可以做并,交,差
操作;
这5种操作是关系代数的基本操作,剩下的操作都可以用这5种操作表示;
连接操作
:笛卡尔积与选择操作的组合;
-
条件连接操作:
- 由笛卡尔乘积和选择操作的结合
- 结果模式和迪卡尔乘积的模式相同
- 连接操作的结果的元组数比笛卡尔乘积的结果元组要少
- 也称为theta-join
-
等值连接操作
- 一种特殊的条件连接,连接条件只有等值的条件
- 结果模式和笛卡尔乘积的模式类似,把等值的属性去掉一列
-
自然连接:
- 两张表在所有的公共属性上做等值连接【应用开发最常用的】
除法操作
:
先举例
这种操作适合回答一种问题:
比如找到选择了所有课程的学生;
计算思路:比如对于A/B来说,我们要找在关系A中跟关系B中所有c值都有联系的s值
- 先在A中找不满足除法条件的s
- 先把A做一个投影,投影到s属性
- 将投影结果和关系B做一个笛卡尔乘积
- 用笛卡尔乘积结果
-
A - 对上一步结果做一个投影,投影到s
- 把关系A所有的s值减去所有不满足条件的s值
- 把关系A投影到s
- 投影结果减去上一操作找到的所有不满足条件的s值
外连接
解决情况:在自然连接中不满足连接操作的元组想要保留下来。
分类
左外连接
把连接运算符的左边的所有元组都要保留,找不到匹配的补空值
右外连接
把连接运算符的右边的所有元组都保留下来,找不到匹配的补空值
全外连接
把连接运算符的左右两边的所有元组都保留下来,找不到匹配的补空值
外并操作:
有一些不满足并兼容的关系要做并交差;(类比迪卡尔积,没有的补空值)
四.SQL
- 数据定义语言【DDL】数据库定义 : 定义数据库中Table的名称、标题(内含的属性名称及对该属性的值的要求)等
- DBMS提供一套数据定义语言(DDL:Data Definition Language)给用户
- 用户使用DDL描述其所要建立表的格式
- DBMS依照用户的定义,创建数据库及其中的Table
- 数据操纵语言【DML】数据库操纵 : 向数据库的Table中增加/删除/更新数据及对数据进行查询、检索、统计等
- DBMS提供一套数据操纵语言(DML:Data Manipulation Language)给用户
- 用户使用DML描述其所要进行的增、删、改、查等操作
- DBMS依照用户的操作描述,实际执行这些操作
- 数据控制语言【DCL】数据库控制 : 控制数据库中数据的使用—哪些用户可以使用,哪些不可以
- DBMS提供一套数据控制语言(DCL:Data Control Language)给用户
- 用户使用DCL描述其对数据库所要实施的控制
- DBMS依照用户的描述,实际进行控制
- 查询语言【QL】:select语句
SELECT
[DISTINCT] target-list
FROM
relation-list
WHERE
qualification
- 关系列表 relation-list 【查询设计的表】
- 目标列表 target-list 【要查询的东西】
- 条件 qualification 【布尔表达式】
- DISTINCT 可选字符,加了的话表明要求系统对查询结果的重复元组要消除。
查询语句执行的基本策略
- 把FROM子句里出现的表做笛卡尔乘积
- 把笛卡尔乘积的觉果用qualification做筛选
- 根据target-list 内的对上一步结果做投影
- 如果有DISTINCT,将重复元组筛选
复杂的查询:
找到A表中既在Class a里又在Class b里的id
select id from A where class = ‘a’ and class = ‘b’;
这种是错的
正确的:
要对表A做自连接(笛卡尔积)
select A1.id from A A1, A A2 where A1.id = A2.id and A1.class = 'a' and A2.class = 'b'
但是这种效率不高;
可以用集合的交来做,就不会产生多余的数据:
select id from A where class = 'a' intersect select id from A where class = 'b';
mysql中要这样写
select id from A where class = 'a' and id in(select id from A where class = 'b');
这种叫做非关联嵌套子查询;
找到b班上人的姓名
select B.name From B where EXISTS (select *from A where A.class = 'b' and A.id = B.id);
这种叫做关联嵌套子查询
exists
是存在的意思,也就是前面的id后面那个不令后面的查询为空,
可以看成一个二层循环;