数据库复试极限学习
因为是突然自学,所以就可能顺序会比较 随意 乱.
绪论
四个基本概念
- 数据:描述事物的符号记录
- 数据库:概括地讲,数据库具有永久存储、有组织和可共享的三个基本特点
- 数据库是长期存储在计算机内、有组织的、可共享的大量数据的集合。数据库中的数据按一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和易拓展性,并可为各种用户共享。
- 数据库管理系统:是位于用户和操作系统之间的一层数据管理软件,和操作系统一样是计算机的基础软件
- 主要功能:
- 数据定义功能
- 数据组织、存储和管理
- 数据操纵功能
- 数据库的事务管理和运行管理
- 数据库的建立和维护功能
- 其他功能(数据转换功能,互访和互操作功能)
- 数据库系统:是由数据库、数据库管理系统(及其应用开发工具)、应用程序和数据库管理员(DBA)组成的存储、管理、处理和维护数据的系统。
注意:数据库系统是最大的范围
数据库的发展阶段
- 人工管理阶段:数据不保存、不共享、不具有独立性
- 文件系统阶段:可保存,但共享性差,冗余度大,独立性差
- 数据库管理系统:数据库系统的出现使信息系统从以加工数据的程序为中心转向围绕共享的数据库为中心的新阶段
实现整体数据的结构化
数据的共享性高、冗余度低:数据共享可以大大减少数据冗余,节约存储空间
数据独立性高:
物理独立性:是指用户的应用程序与数据库中数据的物理存储是相互独立的
逻辑独立性:是指用户的应用程序与数据库的逻辑逻辑是相互独立的
数据由数据库管理系统统一管理和控制
数据模型
- 概念模型:也称信息模型,他是按用户观点来对数据和信息建模,用于数据库设计
基本概念
实体:客观存在并可相互区别的事物:人
属性:实体所具有的某一特性:人的鼻子、嘴巴
码:唯一标识实体的属性:学号
实体型:用实体名及其属性集合来抽象和刻画同类实体:类
实体集:同一类型实体的集合:学号
联系:实体之间的联系通常是指不同实体集之间的联系,实体之间的联系有一对一,一对多,多对多等
概念模型的一种表示方法:实体-联系方法,用E-R图来描述现实世界的概念模型,E-R方法也称为E-R模型。
逻辑模型:它是按计算机系统的观点对数据建模,主要用于数据库管理系统的实现,包括:
- 层次模型
- 网状模型
- 关系模型
物理模型:是对数据最底层的抽象,他描述数据在系统内部的表示方法和存取方法,或在磁盘或磁带上的存储方式和存取方法,是面向计算机系统的
联系:实体内部之间的联系通常是指实体各属性之间的联系
常用的数据模型
- 层次模型
- 网状模型
- 关系模型
- 面向对象数据模型
- 对象关系数据模型
- 半结构化数据模型
关系:一个关系对应通常说的一张表
元组:表中的一行
属性:表中的一列
码:也称码键,表中某个属性组
域:是一组具有相同数据类型的值的集合
分量:元组中的一个属性
数据库系统的结构
模式数据库中全体数据的逻辑结构和特征的描述,它仅仅涉及型的描述,不涉及具体的值,其一个具体值称为模式的一个实例
模式是相对稳定的,实例是相对变动的
三级模式结构:外模式+模式+内模式
外模式:也称子模式或用户模式,他是数据库用户(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述;是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。
模式:也成为逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图
内模式:也称存储模式,一个数据库只有一个内模式,它是数据物理结构和存储方式的描述,是数据在数据库内部的组织方式
二级映像
外模式/模式映像:当模式改变时,由数据库管理员对各个外模式/模式映像作相应改变,可使外模式保持不变,应用程序不必修改,保证了数据与程序的逻辑独立性
模式/内模式映像:放数据库的存储结构改变时,由数据库管理员对模式/内模式作相应改变,可以使模式保持不变,从而应用程序也不用改变,保证了数据与程序的物理独立性
数据与程序之间的独立性使得数据的定义和描述可以从应用程序中分离出去。另外,由于数据的存取由数据库管理系统管理,从而简化了应用程序的编制,大大减少了应用程序的维护和修改。
数据库系统的组成
硬件平台及数据库:足够大内存、磁盘或磁盘阵列等设备,较高的通道能力以提高数据的传送率
软件:数据库管理系统,支持数据库管理系统运行的操作系统,具有与数据库接口的高级语言及其编译系统,以数据库管理系统为核心的应用开发工具,为特定应用环境开发的数据库应用系统
人员:开发、管理和使用数据库的人员主要包括数据库管理员、系统分析员和数据库设计人员、应用程序员和最终用户
数据库管理员职责:决定数据库中的信息内容和结构、决定数据库的存储结构和存取策略、定义数据的安全性要求和完整性的约束条件、监控数据库的使用和运行、数据库的改进和重组、重构
关系数据库
悬浮元组(dangling tuple)
两个关系R和S在做自然连接时,关系R中某些元组有可能在S中不存在公共属性上值相等的元组,从而造成R中这些元组在操作时被舍弃了,这些被舍弃的元组称为悬浮元组。
外连接(Outer Join)
如果把悬浮元组也保存在结果关系中,而在其他属性上填空值Null,就叫做外连接
左外连接:只保留左边关系R中的悬浮元组
同理有右外连接、全外连接
关系的完整性
- 实体完整性:主码唯一且非空
- 参照完整性:外码要么为空,要么对应另一表的主码
- 用户自定义完整性:用户自己写的完整性
SQL语言
- SQL的基本概念
- SQL语言的特点
- SQL的基本语法-模式定义&删除
- SQL的基本-语法表的定义和删除和修改
- SQL的基本语法-索引的建立与修改&删除
SQL的基本语言
SQL:Structured Query Language 结构化查询语言,是一种数据库管理系统中查询或对数据库里的数据进行更改的语言
- 数据库管理系统
- 关系型:MySQL,SQL Server、PostgreSQL
- 非关系型:redis、mongoDB
不同数据库管理系统的SQL语言有点不同
- 数据定义语言DDL(Data Definition Language):定义逻辑结构,包括定义基表、视图和索引,删除表,定义表,修改表
- 数据查询语言DQL(Data Query Language):对数据库中的各种数据对象进行查询
- 数据操纵语言DML(Data Manipulation Language):用于改变数据库中的数据,包括插入,删除,修改
- 数据控制语言DCL(Data Control Language):SQL的数据控制语言,对表和视图的授权,完整性规则的描述以及事物开始和结束等控制语句
SQL语言的特点
- 综合统一(独立完整数据库生命周期,包括定义关系模式、录入数据、建立数据库、查询、更新、维护、数据库重构、数据库安全)
- 高度非过程化(用户只需提出"做什么",而不必指明“怎么做”)
- 面向集合的操作方式
- 以同一种语法结构提供两种使用方式(SQL既是自含式语言,又是嵌入式语言,SQL语句能够嵌入到高级语言程序中)
- 语言渐渐,易学易用
SQL的基本语法
CHAR(n),CHARACTER(n):长度为n的定长字符串
VARCHAR(n):最大长度为n的变长字符串
DECIMAL(p,d): p一共几位(不包括小数),d表示小数点后有几位 INT 长整数(4字节) BIGINT 大整数(8字节)
模式定义
CREATE SCHEMA <模式名> AUTHORIZATION <用户名>
模式定义+视图
CREATE SCHEMA <模式名> AUTHORIZATION <用户名> p[<表定义子句>]
模式删除
DROP SCHEMA <模式名> <CASCADE|RESTRICT>
- CASCADE(级联):删除的同时也把该模式的所有数据库对象删除
- RESTRICT(限制):如果该模式下有下属对象,就拒绝这个删除语句的执行
表的定义和删除和修改
create table 表名( 字段名 类型 字段约束, 字段名 类型 字段约束, 字段名 类型 字段约束);
删除 DROP table 表名 CASCADE|RESTRICT;
修改 ALTER TABLE 表名 [ADD [COLUMN] 新列名 数据类型 [完整性约束]] [ADD 表级完整性约束];
索引的建立与删除与修改
数据量比较大的时候,查询耗时间长,建立索引可以有效减少消耗时间 索引可以建立在一列或者多列上
建立 CREATE UNIQUE|CLUSTER INDEX 索引名 ON 表名(列名 [次序] [,列名 [次序],…])
CLUSTER:聚簇索引;物理顺序和索引的逻辑顺序相同
UNIQUE:唯一索引
修改 ALTER INDEX 旧索引名 RENAME TO 新索引名
删除 DROP INDEX 索引名
查询所有&查询部分列
select * from Student; 等价于 select Sno, Sname, Ssex, Sage, Sdept from Student;
别名
例如:
select ec.id from edu_course as ec;
这里是给表起别名,然后就可以直接用了,这里as可以省略,同样列也可以取别名
结果去重
select distinct title from edu_course;
只要前面加个distinct
注:distinct 必须要放在查询字段的开头,当有多个字段时,会要求多个字段相同才去重,其实就是去重查询出来的记录
查询结果加条件
SQL中的不等于:<>
大多数数据库后来也支持:!=
两者意义相同,可移植性不同
like 匹配的时候%
可以替代过多个字符,但是_
只能替换一个字符
聚集函数
count 统计一共有多少列
分组查询
group by 分组,如果进行筛选,需要用 having
连接
等值/非等值连接,以where 为关键词
如果没有where,会直接给笛卡尔积
select * from edu_course ec1,edu_course ec2 where ec1.id = ec2.id;
外连接
select * from edu_course ec left outer join edu_course_description ecd on ec.id=ecd.id;
多表查询
select * from edu_course ec, edu_course_description ecd, edu_chapter ech where ec.id = ecd.id and ec.id = ech.course_id;
嵌套查询
select * from edu_course ec where teacher_id in (select teacher_id from edu_course where teacher_id =10);
带有ANY ALL的子查询
select * from edu_course ec where price > ANY (select price from edu_course where price<10);
这里的意思是查询出来的结果要大于某一个子查询的结果即可
如果把ANY 换成ALL,就是说要大于子查询中所有的值
带EXISTS的子查询
not exists 如果后面的子查询没有值,返回1,否则为0
exists相反
集合查询
并 select * from Student where sdept=“CS” UNION select * from student where Sage <=19;
插入
insert into 表名 [(字段列表)] values (值列表);
// 全字段
insert into stu(id, name ,age, sex) values (1,"zhangsan",20,'m');
// 部分字段
insert into stu(id, name ) values (1,"zhangsan");
//不指定字段
insert into stu values (1,"zhangsan",20,'m');
// 批量添加
insert into stu(id, name age, sex) values
(1,"zhangsan",20,'m'),
(2,"hhh",20,'m'),
(3,"aaa",20,'m');
修改
update 表名 set 字段1 = 值1, 字段2=值2,... where 条件;
删除
delete from 表名 [where 条件];
视图
视图(VIEW)也被称作虚表,即虚拟的表,是一组数据的逻辑表示,其本质是对应于一条select语句,结果集被赋予一个名字,即视图名字
视图本身并不包含任何数据,它只包含映射到基表的一个查询语句,当基表发生变化,视图数据也随之变化
目的:方便,简化数据操作
放我们业务需求要查出多张表的数据,这是我们可能会关联多张表查询处理,如果这个查询sql复杂的话也影响了查询效率
这时候我们就可创建视图,只需要
select * from view;
创建视图
create view 视图名 [列名,列名...]
as 子查询
[with check option]
加了with check option 可以防止用户对不属于视图范围的操作 进行拒绝
删除视图
drop view 视图名 [CASCADE];
CASCADE 级联删除语句把该视图和由他导出的所有视图一起删除
查询视图
查询视图和查询表的语法是一样的,只是把表名换成了视图名
更新视图
视图是不存在的,所以对视图的操作,最终要反映到对基本表的操作
数据库安全性
- 不安全因素
- 非授权对数据库的恶意存取和破坏(SQL注入)
- 数据库中重要的数据泄露
- 安全环境的脆弱性
- 自主存取控制方法
- grant/revoke
grank 权限 on table 表名 to 用户
revoke 权限 on table 表名 from 用户
安全性控制
- 用户身份鉴别
- 静态口令鉴别
- 动态口令鉴别
- 生物特征鉴别
- 智能卡鉴别
- 存取控制
- 自主存取控制方法
- 主要通过grant,revoke来进行控制
我们定义用户的存储权限 称为授权
Reference权限代表是否允许创建外键
授权 Grant
授权命令是由数据库管理员使用的,若给用户分配权限时带with grant option 子句,则普通用户获得权限后,可把自己的权限授予其他用户
回收权限 revoke
grant select on Student to CEO
grant CEO to lihua
revoke select on Student from CEO
数据库完整性
- 正确性:符合现实世界的描述
- 相容性:同一对象在不同表里面是符合逻辑的的,相同的属性应该一致
- 维护完整性
- 提供定义完整性约束条件的机制
- 提供完整性检查的方法
- 进行违约处理
三大完整性
实体完整性:主码唯一,且非空
create table course (id int not null primary key);
// 或
create table course (id int not null, primary key(id));
参照完整性:外码要么没有,要么只有一个
用户定义完整性:
- 非空: not null
- 列值唯一: unique
- 满足某一个条件表达式:check(表达式)
断言
create assertion 断言名 check子句;
// 删除断言
drop assertion 断言名字;
触发器
触发器也叫做:事件->条件->动作 规则
当对一个表增删改的时候,对触发器里面的条件进行检查,如果成立,就执行触发器里面的动作,否则不执行里面的动作
关系数据库理论
为什么引入范式?
- 数据冗余
- 更新异常
- 插入异常
- 删除异常
范式分类
设计关系数据库时,遵从不同的规范要求,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式
- 第一范式(1NF)
- 第二范式(2NF)
- 第三范式(3NF)
- 巴斯-科德范式(BCNF)
- 第四范式(4NF)
- 第五范式(5NF,又称完美范式)
一般来说,数据库只需满足第三范式(3NF)就行了
依赖
候选码
概念:可以推出所有属性
如何选出候选码?
- 只出现在左边的一定是候选码
- 只出现在右边的一定不是候选码
- 左右都出现的不一定
- 左右都不出现的一定是候选码
- 再求确定的候选码的闭包,如果可以推出全部,那么当前确定的就是候选码,否则,你要把每一个可能的值放进当前确定的候选码里面进行求闭包
三大范式
1NF:所有字段都是不可分解的原子值
2NF:不包含非主属性对码的部分函数依赖,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中
3NF:不包含非主属性对码的传递函数依赖,确保数据表中的每一列数据都和主键直接相关,而不能间接相关
BCNF:消除每一属性对候选键的依赖传递,BCNF时修正的第三范式
数据库设计
数据库设计的基本步骤
- 需求分析
- 概念结构设计:ER图或者是设计数据字典
- 逻辑结构设计:把ER图转为逻辑模型
- 物理结构设计:把逻辑模型转化为物理模型
- 数据库实施:写SQL代码
- 数据库运行维护:性能检测
ER图
数据库编程
关系查询处理和查询优化
- 查询优化的四个阶段
- 查询分析
- 查询检查
- 查询优化
- 查询执行
查询优化包括代数优化,物理优化
数据恢复技术
事务
事物的四大特性:ACID
A:原子性 atomicity 要么全做,要么不做
C:一致性 consistency
一致性与原子性密切相关,要么全做,要么不做,否则就会造成数据不一致
I:隔离性 isolation
一个事物的执行不能被其他事物所干扰
D:持久性 durability
数据库的改变是永久的,比如要写入磁盘
故障种类
- 故障种类
- 事物内部故障:采取REDO重做和UNDO撤销技术
- 系统故障 DBMS:系统突然停转,系统要重启
- 介质故障:硬件损坏
- 计算机病毒
恢复方式
数据转储:对失败的事务重新执行
日志文件:记录事务对数据的更新操作的文件
恢复策略
事务故障的恢复:事务异常终止,那么就撤销之前的所有操作
系统故障的恢复:还没执行完的事务UNDO、丢失事务REDO
介质故障的恢复:重装数据库,重做已经完成的事务
并发控制
什么是并发
并发带来的问题
- 丢失修改 修改的东西没生效
- 读脏数据 比如,你要读取数据库中的字段A、字段B,你读取时恰巧有其他用户正在更新这2个字段,而且是先更新A、再更新B,再更新一半时就读取了数据,先读取了更新后的A和准备更新的B,此时就得到了脏数据
- 不可重读性 我在一个事务中,连续两次读到的数据不一样,第一次读到还有100余额,点了外卖后只剩下80了,第二次读就变成了80元
解决方法:
- 排他锁:也叫写锁(X锁)
- 共享锁:也叫读锁(S锁)
封锁协议:
- 一级封锁协议 修改时,必须加X锁,直到结束
- 二级封锁协议 读的时候,加S锁,用完就放
- 三级封锁协议 读的时候,加S锁,直到结束
一级:解决丢失修改
二级:解决读脏数据
三级:解决不可重复读
可串行性