数据库系统原理
第一章 数据库系统概述
数据库基本概念
- 数据:符号记录(文本或多媒体)
- 数据库(DB):长期储存、有组织、可共享 的数据集合
- 数据库管理系统(DBMS):建立与管理数据库的软件
基本功能:数据-定义、操纵。数据库运行管理、建立、维护。 - 数据库系统(DBS):数据库、管理系统、工具、程序、DBA、用户等。
数据库管理技术发展
- 人工管理阶段:记录无结构、整体无结构
- 文件系统阶段:长期保存、专门管理、可共享(差)、冗余大、记录内有结构、整体无结构
- 数据库系统阶段:数据集成、数据共享性高、冗余小、数据一致性、独立性高、统一管理控制、减少开发维护工作量。
数据库系统的结构
- 三级模式结构:
模式:概念模式或逻辑模式,指数据的逻辑关系与特征
外模式:数据的表现形式(程序或表)
内模式:数据的物理存储方式与结构 - 运行与应用结构:C/S or B/S
数据模型
- 特征与模型结成要素:
数据结构:静态属性
数据操作:动态特性
数据约束(域):正确、有效、相容性。 - 模型分类:
概念层:
信息基本概念:实体、属性、码键、域、实体型、实体集、联系
概念模型的表示:E-R图 实体型、属性、联系
逻辑层:
层次模型(树)
网状模型
关系模型、面向对象模型
物理层:
存储介质上的组织结构
第二章 关系数据库
第二节 关系数据模型
- 关系数据结构:单一数据结构-关系。
- 表 table
- 表就是关系,二维表由 表名、列、行数据组成。
- 关系 Relation
- 基本关系,基本表,真实存在数据。
- 查询表,查询结果对应表。
- 视图表,其它表导出表,虚表。
- 列 Column
- 作字段Field 属性Attribute
- 同表列唯一
- 属性 Attribute
- 同 ->列
- 属性的个数:元或度
- 行 Row
- 元组Tuple 或 记录Record
- 元组 Tuple
- 一行就是一个元组
- 分量 Component
- 元组中的每一个属性值都叫分量
- 码或键 Key
- 一个表中的若干属性值,在任何元组中都不相同(标识数据行唯一),这若干属性值称为该表的码或键。
- 超码或超键 Super Key
- 移去某个属性仍然是表的码,称超码。
- 默认超码:所有属性。也是最大超码。
- 候选码或候选键 Candidate Key
- 最小超码
- 不能去掉任何一个属性
- 主码或主键 Primary Key
- 候选码中选择其中一个作为元组唯一标识,称主键。
- 全码或全键 All-Key
- 表中所有属性。
- 主属性 Primary Attribute 和非主属性 Nonprimary Attribute
- 主属性:包含在候选码中的。
- 非主属性:不包含在候选码中的。
- 外码或外键 Foreign Key
- 当前表中的非主属性是另一表的主键,称为当前表的外键。
- 参照关系 Referencing Relation 和被参照关系 Referenced Relation
- 参照关系/从关系:外键为非候选码的。
- 被参照关系/主关系:外键为主键的表。
- 域 Domain
- 属性值的取值范围。
- 数据类型 Data Type
- 属性值的数据类型。
- 关系模式 Relation Schema
- 型:表结构不变
- 值:数据变化
- 关系数据库
- 属性不可分解
- 仅有一种关系模式:表结构固定。
- 属性不为空、且唯一。
- 候选码无相同:无重复数据。
- 无行序。
- 无列序。
- 表 table
- 关系操作集合
- 基本的关系操作
- 查 Query
- 插入 Insert
- 删除 Delete
- 修改 Update
- 关系数据语言的分类
- 关系代数语言
- 关系演算语言
- both:SQL
- 数据定义:DDL
- 数据操纵:DML
- 数据控制:DCL
- 关系代数
- 操作对象:表
- 操作结果:表
- 操作符:
- 集合运算符:
- 并 UNION
- 差 DIFFERENCE
- 交 INTERSECTION
- 笛卡尔积 CERTESIAN PRODUCT
- 关系运算符:
- 选择 SELECT tableName WHERE … 生成新表
- 投影 PROJECTON tableName(Column…)生成新表
- 连接 JOIN table1 AND table2 WHERE … 生成新表
- 除 DIVISION
- 比较操作符:>,>=,<,<=,=,!=
- 逻辑操作符:非,与,或
- 集合运算符:
- 基本的关系操作
- 关系的完整性约束
- 实体完整性约束
- 参照完整性约束
- 用户定义完整性约束
- 关系模型完整性约束检验
第三节 关系数据库的规范化理论
- 关系模式中可能存在的冗余与异常问题
- 数据冗余
- 更新异常
- 插入异常
- 删除异常
- 函数依赖与关键字
- 完全函数依赖
- 部分函数依赖
- 传递函数依赖
- 范式与关系规范化过程
- 第一范式:不存在嵌套关系。属性值不可再分。
- 第二范式:在第一范式的基础上属性完全依赖于主键。
- 第三范式:关系中不包含已在其它关系已包含的非主关键字信息。
- BCNF 范式:3NF基础上,任何非主属性不能对主键子集依赖。
第三章 数据库设计
第一节 数据库设计与概述
-
数据库的生命周期
- 数据库分析与设计阶段
- 数据库实现与操作阶段
-
数据库的设计与目标
- 满足应用功能需求
- 良好的数据库性能
- 数据高效率存取、空间节省
- 良好的数据共享性、完整性、一致性及安全保密性
-
数据库设计的内容
- 数据库结构设计:表结构
- 数据库行为设计:程序
-
数据库设计的方法
- 直观设计法:个人经验与技巧,不可靠
- 规范设计法:
- 新奥尔良法:
- 需求分析
- 概念结构设计
- 逻辑结构设计
- 物理结构设计
- 基于E-R
- 基本第三范式
- 新奥尔良法:
- 基于计算机辅助设计法:
-
数据库设计过程
- 需求分析阶段
- 结构设计阶段
- 概念结构
- 逻辑结构
- 物理结构
- 行为设计阶段
- 功能设计
- 事务设计
- 程序设计
- 数据库实施
- 加载数据库数据
- 调试运行程序
- 数据库运行与维护
第二节 数据库设计的基本步骤
- 需求分析
- 确定数据库范围
- 支持哪些功能
- 分析数据应用过程
- 哪些数据
- 数据使用的顺序
- 数据任何处理
- 处理的策略
- 处理的结果
- 收集与分析数据
- 动态结构
- 数据分类表
- 数据元素表
- 动态结构
- 任务分类表
- 数据操作特征表
- 数据约束
- 数据的安全保密性
- 数据完整性
- 响应时间
- 数据恢复
- 编写需求分析报告
- 动态结构
- 编写需求分析报告
- 数据库的应用功能目标
- 标明不同用户视图范围
- 应用处理过程需求说明
- 数据流程图
- 任务分类表
- 数据操作特征表
- 操作过程说明书
- 数据字典
- 数据量
- 数据约束
- 确定数据库范围
- 概念结构设计:最理想情况
- 自顶向下法
- 自底向上法
- 逻辑结构设计
- 逻辑结构设计的
- 输入信息:
- 输出信息
- 逻辑结构设计的步骤
- 逻辑结构设计的
- 物理设计
- 数据库实施
- 加载数据
- 应用程序设计
- 数据库试运行
- 数据库运行与维护
第三节 关系数据库设计方法
- 关系数据库设计过程与各级模式
- 概念模式:应用要求的功能
- 逻辑模式:外模式,也就是应用业务逻辑实现。
- 内模式:物理模式,物理存储。
- 概念结构设计方法
- E-R图表示方法
- 实体型:矩形
- 属性:椭圆
- 联系:菱形
- 一对一
- 一对多
- 多对多
- 局部信息结构设计
- 确定局部范围
- 选择实体
- 选择实体的关键字属性
- 确定实体间的联系
- 确定实体的属性
- 全局信息结构设计
- 属性冲突
- 全名冲突
- 结构冲突
- E-R图表示方法
- 逻辑结构设计方法
- E-R图向关系模式转换
- 数据模型的优化
- 设计用户子模式
- 物理设计方法
- 建立索引:只查,动态或静态
- 建立聚集:相关数据集中存放物理块
第四章 SQL 与关系数据库基本操作
第一节 SQL概述
一、SQL发展
二、SQL特点
三、SQL的组成
- 数据查询
- 数据定义:数据定义语言 DDL
- CREATE 创建数据库或对象
- ALTER 修改
- DROP 删除
- 数据操纵:数据操纵语言 DML
- SELECT 从表或视图中检索数据
- INSERT 插入到表或视图中
- UPDATE
- DELETE
- 数据控制:数据控制语言 DCL
- GRANT 权限
- REVOKE 收回权限
- 嵌入式和动态SQL规则
- SQL调用和会话规则
第二节 MySQL 预备知识
一、MySQL使用基础
- LAMP:Linux、Apache、MySQL、PHP/Perl/Python
- WAMP:Windows、Apache、MySQL、PHP/Perl/Python
二、MySQL中的SQL
- 常量
- 字符串
- 数值:整数、浮点
- 十六进制:x X
- 日期时间:‘2021-10-10’
- b’value’ 位字段值
- 布尔:TRUE 1、FALE 0
- NULL
- 变量
1. - 运算符
- 算术运算
- 位运算符
- 比较运算
- 逻辑运算
- 表达式
- 内置函数
第三节 数据定义
一、数据库模式定义
- 创建数据库
- CREATE DATABASE/SCHEMA [IF NOT EXISTS] dbName [DEFAULT] CHARACTER SET[=] ‘UTF8’ COLLATE utf8_general_ci
- 选择数据库
- USE dbName
- 修改数据库
- ALTER DATABASE/SCHEMA dbName …
- 删除数据库
- DROP DATABASE/SCHEMA [IF EXISTS] dbName
- 查看数据库
- SHOW DATABASE/SCHEMA [LIKE ‘pattern’|WHERE expr]
- SHOW DATABASES/SCHEMAS 查看所有数据库
二、表定义
- 创建表
- CREATE [TEMPORARY] TABLE tableName (cust_id INT NOT NULL AUTO_INCREMMENT,… cust_name CHAR(50) NOT NULL DEFAULT ‘XX’, PRIMARY KEY(id) );
- TEMPORARY 临时表
- 日期:date、timestamp、time
- 更新表: ALTER TABLE …
- 新增列:ALTER TABLE db.table ADD COLUMN cust_age INT NOT NULL DEFAULT 0 AFTER cust_name
- 修改列:ALTER TABLE db.table CHANGE COLUMN cust_age cust_old INT NOT NULL DEFAULT 0
- 修改列默认值:ALTER TABLE db.table ALTER COLUMN cust_age SET DEFAULT 100
- 更新列属性(不改列名):ALTER TABLE db.table MODIFY COLUMN cust_age CHAR(20) FIRST/AFTER
- 删除列:ALTER TABLE db.table DROP COLUMN cust_age;
- 重命名表
- ALTER TABLE db.table RENAME TO db.table2
- RENAME TABLE table1 TO table2, table3 TO table4
- 删除表
- DROP TABLE [IF EXISTS] table1,table2…
- 查看表
- SHOW TABLES
- SHOW COLUMNS FROM table1 / DESCRIBE|DESC table
三、索引定义
- 索引创建
- CREATE INDEX index1 ON db.table(cust_name(length) ASC|DESC)
- CREATE INDEX index1 ON db.table(cust_name,cust_id) //组合索引
- CREATE TABLE table1(id…INDEX index_id(id));//建表时创建索引
- ALTER TABLE db.table ADD INDEX index_name(id);
- 索引查看
- SHOW INDEX|INDEXES|KEYS FROM table1 FROM db1 WHERE
- 索引删除
- DROP INDEX index_name ON table1
- ALTER TABLE db.table DROP PRIMARY KEY, DROP INDEX index_name;
第四节 数据更新
一、插入数据
- INSERT [INTO] table[(column…)] VALUES|VALUE(…)
- INSERT [INTO] table1 SET column_name=‘xxx’,…
- INSERT [INTO] table1(column…) SELECT …
二、删除数据
- DELETE FROM table1 [WHERE…] [ORDER BY] [LIMIT count]
- TRUNCATE 重置了primaryId
三、修改数据
- UPDATE table1 SET column=‘’ [WHERE…] [ORDER BY] [LIMIT count]
第五节 数据查询
一、SELECT 语句
- SELECT [ALL|DISTINCT|DISTINCTROW] … FROM table1 [WHERE…] [GROUP BY … [ASC|DESC],… [WITH ROLLUP]] [HAVING …] [ORDER BY…[ASC|DESC]] [LIMIT …]
二、列的选择与指定
- 指定列 SELECT * FROM db.table1
- 定义列别名使用 SELECT column AS column_alias FROM db.table1
- 替换查询结果:SELECT column CASE WHEN sex=‘M’ THEN ‘男’ ELSE ‘女’ END AS 性别 FROM db.table1
- 计算列值: SELECT id+100 FROM db.table1
- 聚合函数:COUNT,MAX,MIN…
三、FROM 子句与多表连接查询
- 交叉连接
- SELECT * FROM db.table1 CROSS JOIN table2
- 内连接
- SELECT * FROM db.table1 INNER JOIN table2 ON table.id = table.id
- 外连接
- SELECT * FROM db.table1 LEFT JOIN table2 ON table.id = table.id
四、WHERE 子句与条件查询
- 比较运算
- 模糊查询 LIKE '_ '代表单个字符,‘%’代表若干
- 判定范围
- WHERE id BETWEEN 10 AND 20
- WHERE id IN(1,2,4)
- 判定空值
- WHERE name IS[NOT] NULL
- 子查询
- WHERE id IN(SELECT …)
五、GROUP BY 子句与分组数据
- SELECT
- cust_address,cust_sex,
- COUNT( * ) AS ‘人数’ //按人数汇总
- FROM db.table1
- GROUP BY cust_address,cust_sex,
- WITH ROLLUP; //包含汇总项
六、HAVING 子句 与GROUP BY 组合使用
- SELECT
- cust_address,cust_sex,
- FROM db.table1
- GROUP BY cust_address,cust_sex,
- HAVING COUNT( * ) <= 3
七、ORDER BY 子句
- SELECT
- cust_address,cust_sex,
- FROM db.table1
- ORDER BY cust_address DESC,cust_sex DESC;
八、LIMIT 子句
- SELECT
- cust_address,cust_sex,
- FROM db.table1
- ORDER BY cust_id
- LIMIT 4,3 | LIMIT 3 OFFSET 4 //从第5个开始 ,找3个
第六节 视图
一、创建视图
- CREATE VIEW view1 AS SELECT * FROM table1 WHERE sex=‘M’ WITH [CASCADED|LOCAL] CHECK OPTION;
二、删除视图
- DROP VIEW IF EXISTS [RESTRICT|CASCADE]
三、修改视图定义
- ALTER VIEW view1[(columns)] AS WHERE… WITH [CASCADED|LOCAL] CHECK OPTION;
四、查看视图定义
- SHOW CREATE VIEW view1
五、更新视图数据
- INSERT INTO view1 values(‘a’,‘1’)
- UPDATE view1 SET sex=‘M’;
- DELETE FROM view1 WHERE…
六、查询视图数据
- SELECT name,sex FROM view1 WHERE…
第五章 数据库编程
第一节 存储过程
完成特定功能的SQL语句集,存储在数据库中的代码。
一、存储过程的基本概念
- 可增强SQL语句的功能和灵活性
- 良好的封装性
- 高性能
- 可减少网络流量
- 存储过程可作为安全机制:数据安全与完整性。
二、创建存储过程
- 修改语句结束符:DELIMITER $$
- CREATE PROCEDURE
- sp_name(IN cid INT,OUT name CHAR(20),INOUT age INT)
- BEGIN
- …
- END $$
三、存储过程体
- 局部变量
- DECLARE cid INT(10);
- SET语句
- SET cid=1001;
- SELECT…INTO 语句,存储列数据列变量中。
- SELECT cid,name INTO var_cid,var_name;
- 流程控制语句
- IF…THEN…ELSE / CASE
- 循环:WHILE,REPEAT,LOOP
- 游标
- 声明游标:DECLARE cursor1 CURSOR FOR SELECT id FROM table1
- 打开游标:OPEN cursor1
- 读取游标:FETCH cursor1 INTO var1
- 关闭游标:CLOSE cursor1
四、调用存储过程
- CALL sp_name
五、删除存储过程
- DROP PROCEDURE sp_name;
第二节 存储函数
- 存储函数不能拥有输出参数
- 可以直接对存储函数进行调用。不用CALL
- 存储函数中必须有RETURN 语句。
一、创建存储函数
- CREATE FUNCTION fn_name(parameter) //不能用输出参数
- RETURNS ypte //声明返回值类型
- BEGIN
- …RETURN ‘’;
- END $$
二、调用存储函数
- SELECT fn_name(…);
三、删除存储函数
- DROP FUNCTION [IF EXISTS] fn_name;
第六章 数据库安全与保护
第一节 数据库完整性
一、完整性约束条件的作用对象
- 列级约束
- 数据类型:类型、长度、精度。。。
- 数据格式:统一格式
- 取值范围:1-10
- 元组约束
- 元组中字段间约束
- 表级约束
- 关联表字段的约束
二、定义与实现完整性约束
- 实体完整性
- 主键约束:自动产生PRIMARY KEY 索引
- 一表只能有一个主键
- 主键值唯一性原则。
- 复合主键最小化规则。
- 候选键约束:自动产生UNIQUE 索引
- 可以有多个候选键
- 主键约束:自动产生PRIMARY KEY 索引
- 参照完整性:外键的校验
- CREATE TABLE table1
- (…
- PRIMARY KEY(id)
- FOREIGN KEY(id)
- REFERENCES table2(cust_id) //外键存在才能插入数据
- ON DELETE RESTRICT
- ON UPDATE RESTRICT );
- 用户自定义完整性
- 非空约束:NOT NULL
- CHECK 约束
三、命名完整性约束
- CONSTRAINT [symbol]
四、更新完整性约束
- ALTER TABLE ADD CONSTRAINT
第二节 触发器
一、创建触发器
- CREATE TRIGGER trigger_name
- trigger_timer // 触发时机:AFTER|BEFORE
- trigger_event // 触发事件:INSERT|UPDATE|DELETE
- ON table1
- FOR EACH ROW
- trigger_body // 执行事件 (多个语句):|BEGIN…END
二、删除触发器
- DROP TRIGGER IF EXISTS table1.trigger1;
三、使用触发器
直接调用相关触发事件
第三节 安全性与访问控制 MySQL
一、用户账号管理
- 创建用户账号
- CREATE USER ‘user’@‘localhost’
- IDENTIFIED BY ‘123’,
- IDENTIFIED BY PASSWORD ‘123’;
- 删除用户
- DROP USER user1,user2…
- 修改用户账号
- RENAME USER old1 TO new1,…
- 修改用户口令
- SET PASSWORD FOR user1=‘…’;
二、账户权限管理
查看权限:SHOW GRAINT FOR user1
- 权限授予
- GRANT
- priv_type // 权限类型:SELECT, UPDATE , DELETE,ALL
- [(column_list)] // 指定具体列
- ON
- [object_type] // 权限授予对象:TABLE,FUNCTION,PROCEDURE
- priv_level // 权限级别:库,表,视图, ,.* ,db.*,db.table
- TO user1,user2;
- WITH GRANT OPTION;
- 权限转移
- TO user1 IDENTIFYED BY ‘123’ //不同密码,不同权限
- WITH GRANT OPTION
- 权限撤销
- REVOKE // (ALL PRIVILEGES, GRANT OPTION FROM user1,… 撤销全部)
- priv_type // 权限类型:SELECT, UPDATE , DELETE,ALL
- [(column_list)] // 指定具体列
- ON
- [object_type] // 权限授予对象:TABLE,FUNCTION,PROCEDURE
- priv_level // 权限级别:库,表,视图, ,.* ,db.*,db.table
- FROME user1,user2;
第四节 事务与并发控制
一、事务的概念
数据操作序列,完整工作单元,不可分割。
BEGIN TRANSACTION 开始执行
COMMIT 提交
ROLLBACK 回滚
二、事务的特征 ACID
- Atomicity 原子性 :不可分割
- Consistency 一致性 :从一个一致性状态到另一个一致性状态
- Isolation 隔离性:事务彼此是独立、隔离的。
- Durability 持续性:事务提交后数据的变动是永久的。
三、迸发操作的问题
- 丢失更新
- 不可重复读
- 读脏数据
四、封锁
- 锁
- Exclusive Lock X锁
- Shared Lock S锁
- 并发控制
- 封锁粒度:粒度越细,开销越大
- 封锁级别
- 0级
- 1级:不重写未提交的更新数据
- 2级:不重写与不读取更新数据
- 3级:不重写与不读取更新数据,不写未提交的读数据。
- 活锁与死锁
- 一次性锁请求
- 锁请求排序
- 序列化处理
- 资源剥夺
- 可串行性
- 两段封锁法
第五节 备份与恢复
数据丢失因素
硬件故障
软件故障
病毒
人为误操作
自然灾害
盗窃
- 备份数据
- SELECT *
- INTO OUTFILE
- file_name //输出文件名
- FILES
- TERMINATED BY ‘string’ // 字段间隔符号
- OPTIONALLY ENCLOSED BY ‘char’ // 包裹字符串的符号
- ESCAPED BY ‘char’ // 转义字符( \n )中的\
- LINES TERMINATED BY ‘string’; // 行数据的结束标识
- 恢复数据
- LOAD DATA
- INFILE
- file_name //输出文件名
- FILES
- TERMINATED BY ‘string’ // 字段间隔符号
- OPTIONALLY ENCLOSED BY ‘char’ // 包裹字符串的符号
- ESCAPED BY ‘char’ // 转义字符( \n )中的\
- LINES
- STARTING BY ‘string’; // 行前缀,若不包含被跳过
- TERMINATED BY ‘string’;// 行数据的结束标识