数据库系统概念
第一部分 关系数据库
第1章 引言
数据库管理系统(DataBase-Management System DBMS)是有互相关联的数据集合和一组用以访问这些数据的程序组成。这个数据集合通常称作数据库。
很早以前是用文件的形式记录数据,带来了很多问题
- 数据冗余不一致
- 数据访问难
- 数据孤立
- 完整性问题
- 原子性问题
- 并发问题
- 安全问题
1.1 数据库的三个层次
物理层(数据的存储)、逻辑层(数据的关系)、视图层(描述数据库的某个部分)
1.3.3 数据模型
数据模型是一个描述数据、数据联系、数据语义和一致性约束的概念工具的集合。
- 关系模型
- 实体-联系模型
- 基于对象的数据模型
- 半结构化数据模型
1.4.1 数据操纵语言
数据操纵语言(Data-Manipulation Language,DML)访问和操纵适当模型组织起来的数据,有以下操作
- 检索数据
- 插入数据
- 删除数据
- 修改数据
1.4.2 数据定义语言
数据定义语言(Data-Definition Language,DDL)
- 域约束
数据类型(整数、字符型) - 参照完整性
可以了解成外键管理 - 断言
这个就没用到了,是说一个学期必须开设5门课程,表达成一个断言 - 授权
读、插入、更新、删除
1.6.2 数据库设计
设计阶段中的需求描述是制定数据库的概念结构的基础
1.6.3 实体联系模型
数据库的总体逻辑结构可以用实体-联系图(entity-relationship diagram E-R 图),有几种方法画这样的图,最常用的是UML
1.6.4 规范化
设计关系数据库所用到的另外一种方法被称为规范化过程,他的目标是生成一个关系模式集合,是我们存储信息没有不必要的冗余,同时又能很轻松的检索数据,最常用的方法是使用函数依赖。
1.7 数据存储和查询
数据库系统的功能部件大致分为存储管理器和查询处理部件
1.7.1 存储管理器
- 权限及完整性管理器
完整性约束和用户权限 - 事务管理器
故障,保持一致的状态,并发执行不冲突 - 文件管理器
管理磁盘存储空间的分配,所存储信息的数据结构 - 缓冲区管理器
数据从磁盘取到内存,决定哪些数据应被缓冲存储在内存中 - 数据文件
存储数据库本身 - 数据字典
存储数据库结构的元数据,尤其是数据库模式 - 索引
对数据项的快速访问
1.7.2 查询处理器
DDL解释器
-
DML编译器
一个查询会被翻译成多种等价的执行方案的一种,DML编译器还能进行查询优化,从几种选择中选出代价最小的一种
1.8 事务管理
- 原子性 atomicity
- 一致性 consistency
- 持久性 durability
第2章 关系模型介绍
2.1 关系数据结构
关系数据结构是由表集合成的。它其实是数学中的一种概念,叫做元祖,表示一组值的序列。
我们要求关系r而言,所有的属性都是原子的,就是域中的元素是不可再分的,是否再分是由我们的定义来的区分的;比如phone_number,如果只看做是一个号码而言,它是原子的,如果是一组电话或者是定义区号等,他是非原子的。
空值是特殊的值,代表未知或者不存在,尽量避免空值的引入。
2.7 总结
- 关系的模式是指它的逻辑设计,关系的实例是指它在特定时刻的内容
- 关系的超码是一个或者多个属性的集合,这些属性的取值可以唯一识别出关系的元祖,候选码是一个最小的超码,关系的一个候选码作为主码
- 模式图,是数据库中模式的图形化表示,显示了数据库的关系,关系的属性,主码和候选码
第3章 SQL
3.1 SQL查询语言概览
最早的版本是由IBM开发的,最初被叫做Sequel。
1986年美国国家标准化组织(ANSI)和国际标准化组织(ISO)发布了SQL标准,SQL-86,SQL-92,SQL:2003,SQL:2006,SQL:2008
SQL语言有以下几个部分:
- DDL
- DML
- 完整性
完整性约束的命令 - 视图定义
- 事务控制
- 嵌入式SQL和动态SQL
定义语句如何嵌入到通用编程语言 - 授权
3.2.1 基本类型
- char
- varchar
- int
等价于integer - smallint
- numeric(p,d)
- real,double precision
- float(n)
char类型存放固定长度的字符串,例如属性A的类型是char(10),我们存入的时候如果存入“avi”;那么它会在改字符后面追加7个空格达到10个字符的长度,如果是属性B的类型是varchar(10),它是不会加空格;这样就可能出现比较的时候不相同。所以说我们建议始终使用varchar类型而不是char类型。
3.5 集合运算
union、intersect和except对应数据集合论中的并运算、交运算、差运算
union和union all 前者会去重
结果中重复元祖等于C1和C2中出现重复元祖数的和-
intersect 和 intersect all 前者会去重
结果中重复元祖等于C1和C2中出现重复次数最少的一个
3.6 空值
- and
任何条件和unknown的结果是unknown - or
true or unknown的结果是true,false or unknown的结果是unknown - not
not unknown 的结果是unknown
3.7 聚集函数
avg 平均数:在算平均数的时候切记不能去除重复元素
distinct:删除重复元祖
group by:在group by子句中的所有属性上取值相同的元祖将被分在一个组中,一个很重要的事情是需要保证出现在select语句中但没有被聚集的属性只能是出现在group by 子句中的属性。也就是说任何没有出现在group by子句中的属性如果出现在select子句中的话,它只能出现在聚集函数内部,否则这样的查询就是错误的。
having:having在形成分组后才起作用
select avg(salary) from instructor
group by dept_name
having avg(salary) > 42000;
任何出现在having子句中,但没有被聚集的属性必须出现在group by中,否则查询就被当成是错误的
sum:SQL会忽略输入的null值
3.8 嵌套子查询
子查询是嵌套在另一个查询中的select-form-where表达式中。
子查询嵌套在where子句中,通常用于对集合的成员资格、集合的比较和集合的基数进行检查。
3.8.1 集合成员资格
使用连接词in或者not in
3.8.2 集合的比较
如连接词some和any同义(某一个)、all(所有)
找出满足下面条件的所有教师的姓名,他们的工资至少比Biology系某一个教师的工资要高
select name from instructor
where salary > some (select salary
from instructor
where dept_name = 'Biology')
3.8.3 空关系测试
exists结构在作为参数的子查询非空时返回true值
找出2009年秋季学期和2010年春季学期同事开课的所有课程
select course_id from section as S
where semeter = 'FALL' AND year = 2009
AND
exist (SELECT * FROM section as T WHERE semester = 'Spring' AND year = 2010 AND S.course_id = T.course_id)
上面的查询还说明了SQL的一个特性,来自外层查询的一个相关名称(S)可以用在where子句的子查询中。使用了这种关联的查询称为相关子查询
第4章 中级SQL
4.2 视图
安全考虑、创建一个比逻辑模型更符合特定用户直接的个人化关系集合。
4.2.1 视图定义
-
create view
create view v as;
v表示视图名称表示任何合法的查询表达式 create view faculty as select ID,name,dept_name from instuctor;
定义了视图后,可以在任何的关系名中出现视图
直觉上,在任何给定时刻,视图关系中的元祖集是该时刻视图定义中的查询表达式的计算结果。所以,当我们定义一个视图时,数据库熊存储视图的定义本身,而不存储定义该视图的查询表达式的执行结果。
一个视图可能被用到定义另一个视图的表达式中
4.2.3 物化视图
特定数据库系统允许存储视图关系,但是他们保证:如果用于定义视图的实际关系改变,视图也跟着修改。
4.2.4 视图更新
除了一些有限的情况之外,一般不允许对视图关系进行修改。
- 满足下列条件我们任务SQL视图是可更新的
- from子句中只有一个数据库名称
- select子句中值包含关系的属性名,不包含任何表达式、聚集或者distinct声明
- 任何没有出现在select子句中的属性可以取控制
- 查询不包含group by或having子句
4.3 事务
事务由查询和更新语句的序列组成。SQL标准规定当一条SQL语句被执行,就隐式地开始了一个事务。下列SQL语句之一会结束一个事务
- commit work
- rollback work
4.4 完整性约束
完整性约束保证授权用户对数据库所做的修改不会破坏数据的一致性。因此,完整性约束防止的是对数据的意外破坏。
4.4.1 单个关系上的约束
- not null
- unique
- check
例如check(budget>0)子句保证budget上的取值是正数
4.4.5 参照完整性
例如外键的级联删除
4.4.6 事务中对完整性约束的违反
事务中有可能出现,例如两条语句,第一条插入的时候违反了约束,第二条符合了约束。这样的情况,有的数据库提供了延迟检查,在事务提交的时候进行检查,initially deferred
4.5 SQL的数据类型与模式
4.5.1 日期和时间类型
- date
年月日 - time
时分秒 - timestamp
date和time的组合
-
获取日期时间的函数
current_date/current_time/current_timestamp
4.5.4 大对象类型
- clob和blob
lob代表 Large OBject
4.5.5 用户定义的类型
-
为了域的比较或者统一设置一些域的类型,使用create type来定义,可以使用drop type 和 alter type来删除或修改
create type Dollars as numeric(12,2); create table department( dept_name varchar(20), budget Dollars );
4.6 授权
对数据库的授权包括增、删、改、查
select、delete、update、insert、all privilegers
grant<权限列表>
on<关系名或视图名>
to<用户/角色列表>
grant select on department to Amit,satashi
角色:create role instructor;然后可以grant select on takes to instructor
还有其他的授权略。。。
第5章 高级SQL
5.1 使用程序设计语言访问数据库
- 动态SQL
- 嵌入式SQL
5.2 函数和过程
写成存储过程的优点
它允许多个应用访问这些过程
允许当业务规则发生变化时进行单个点的改变。SQL允许定义函数、过程和方法
-
官方定义语法
CREATE [DEFINER = user] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body CREATE [DEFINER = user] FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name type func_parameter: param_name type type: Any valid MySQL data type characteristic: COMMENT 'string' | LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } routine_body: Valid SQL routine statement
参考
https://www.jianshu.com/p/b17a3a6075f2
5.3 触发器
要设置触发器,必须要满足两个条件
- 指明什么条件下执行触发器。
- 指明触发器执行时的动作。
使用场景:
- 实现未被SQL约束机制指定的某些完整性约束
- 当满足特定条件时对用户发警报或自动开始执行某些任务
5.5 开窗和排名
在给定的区间内进行排名或者聚合操作,成为开窗
https://jingyan.baidu.com/article/d8072ac48d2730ec94cefd43.html
5.6 OLAP系统
联机分析处理系统是一个交互式系统,它允许分析人员查看多维数据的不同类的汇总数据。联机一词表示分析人员必须能够提出新的汇总数据请求,几秒钟之内得到响应。
从某一个角度为固定去查看其他的统计维度称为切片