第一章
概念
- 数据库定义
- 是一种依照特定数据模型组织、存储和管理数据的文件集合。
- 数据库和普通文件区别
- 支持不同应用对数据共享访问;
- 数据管理复杂;
- 可独立于应用;
- 管理由DBMS实现。
- 数据模型定义
- 描述事物对象的数据结构组成、数据语义联系、数据约束的抽象结构以及说明。
- 主要数据模型
- 层次数据模型
- 网状数据模型
- 关系数据模型
- 关系数据模型优缺点
- 优点
- 结构简单、灵活;
- 支持关系与集合运算;
- 支持
SQL
; - 应用广泛。
- 缺点
- 只支持结构化数据存储;
- 数据类型简单;
- 无法支持非结构化数据。
- 优点
DBMS
基本功能- 创建…
- 增删查改…
- 安全控制
- 备份以及恢复
- 四个管理阶段
- 人工管理阶段
- 文件系统管理阶段
- 数据库系统管理阶段
- 数据库应用系统类型
- 业务处理系统
- 管理信息系统
- 决策支持系统
- 系统生命周期
- 需求分析
- 系统分析
- 系统实现
- 系统测试
- 系统运行与维护
第二章
概念
- 实体定义
- 包含数据特征的事物在概念模型世界中的抽象名称。
- 关系定义
- 具有关系特征、用于存放实体数据的二维表。
- 键定义
- 唯一标识元组的列。
- 复合键定义
- 关系中用来唯一标识元组的多列。
- 候选键定义
- 关系中可能有多个列作为键,则其都是候选键。
- 主键定义
- 关系中最有代表性的一个候选键。
- 主键作用
- 唯一标识元组;
- 与关联表外键建立联系;
- 组织数据存储;
- 建立索引快速检索。
- 代理键定义
DBMS
自动生成的数字序列以作为关系表主键。
- 代理键作用
- 可代替复合主键,获得更高性能的数据访问操作。
- 关系模型完整性
- 关系数据模型中对关系实施的完整性约束。
- 包含
- 实体完整性
- 参照完整性
- 用户自定义完整性
- 实体完整性规则
- 所有主属性不能取空值。
- 主键取值唯一。
- 参照完整性
- 关系表之间需要遵守的数据约束,保证关系之间的数据一致性。
- 通过外键实现。
- 用户自定义完整性
- 用户根据业务需求自定义的数据约束。
第三章
概念
SQL
- 是一种对关系数据库进行访问的数据操作语言。
- 是解释执行的。
操作
数据类型
对象 | 类型 |
---|---|
字符 | CHAR、VARCHAR、TEXT |
整数 | SMALLINT、INTEGER |
浮点数 | NUMBER(n,d)、FLOAT(n,d) |
日期 | DATE、DATETIME |
货币 | MONEY |
操作库
- 模板
CREATE DATABASE <数据库名>;
ALTER DATABASE <数据库名> <修改内容>;
DROP DATABASE <数据库名>;
操作表
CREATE TABLE <表名>
(
...
<属性名> <数据类型> [完整性约束],
...
CONSTRAINT <主键名> PRIMARY KEY(<属性名>),
CONSTRAINT <外键名> FOREIGN KEY(<属性名>)
REFERENCES <关联表名>(<属性名>)
);
ALTER TABLE <表名> <修改方式>;
DROP TABLE <表名>;
- 完整性约束
关键词 | 作用 |
---|---|
PRIMARY KEY | 主键 |
NOT NULL | 非空值 |
NULL | 空值 |
UNIQUE | 值唯一 |
CHECK | 有效性检查 |
DEFAULT | 缺省值 |
操作索引
CREATE INDEX <索引名> ON <表名>(<属性名>);
ALTER INDEX <索引名> <修改项>;
DROP INDEX <索引名>;
插入操作
INSERT INTO <表名> VALUES (属性值);
更新操作
UPDATE <表名> SET <属性名>=<表达式>
WHERE <条件表达式>;
DELETE FROM <表名>
WHERE <条件表达式>;
查询语句
SELECT <属性名> INTO <新表名> FROM <表名>
WHERE <条件表达式>
BETWEEN <属性值> AND <属性值>
WHERE <条件表达式>
LIKE <属性值>
GROUP BY <属性名>
ORDER BY <属性名> [DESC|ASC]
- 内置函数
聚合函数 | 功能 |
---|---|
AVG() | 平均值 |
COUNT() | 行数 |
MIN() | 最小值 |
MAX() | 最大值 |
SUM() | 总和 |
- 分类统计
SELECT Major AS 专业 COUNT StudentID AS 学生人数
FROM Student
WHERE StudentGender=‘男‘
GROUP BY Major
HAVING COUNT(*)> 2;
- 子查询
SELECT TeacherID,TeacherName,TeacherTitle
FROM Teacher
WHERE CollegeID IN
(
SELECT CollegeID
FROM College
WHERE CollegeName='计算机学院'
);
- 关联多表查询
SELECT B.CollegeName AS 学院名称,A.TeacherID AS 编号,A.TeacherName AS 姓名,A.TeacherGender AS 性别,A.TeacherTitle AS 职称
FROM Teacher AS A,College AS B
WHERE A.CollegeID=B.CollegeID
ORDER BY B.CollegeName,A=TeacherID;
- 连接查询
SELECT B.CollegeName AS 学院名称,A.TeacherID AS 编号,A.TeacherName AS 姓名,A.TeacherGender AS 性别,A.TeacherTitle AS 职称
FROM TEACHER AS A JOIN COLLEGE AS B
ON A.CollegeID=B.CollegeID
ORDER BY B.CollegeName,A.TeacherID;
- 外部连接
SELECT C.CourseName AS 课程名称, T.TeacherName AS 教师,
COUNT(R.CoursePlanID) AS 选课人数
FROM COURSE AS C JOIN PLAN AS P ON C.CourseID=P.CourseID
JOIN TEACHER AS T ON P.TeacherID=T.TeacherID
JOIN REGISTER AS R ON P.CoursePlanID=R.CoursePlanID
GROUP BY C.CourseName, T.TeacherName;
数据控制
GRANT <权限列表> ON <数据库对象> TO <用户|角色>;
REVOKE <权限列表> ON <数据库对象> FROM <用户|角色>;
DENY <权限列表> ON <数据库对象> TO <用户|角色>;
视图
CREATE VIEW <视图名> AS
<SELECT查询>;
SELECT * FROM <视图名>;
DROP VIEW <视图名>;
- 例子
CREATE VIEW BasicCourseView AS
SELECT CourseName,CourseCredit,CoursePeriod,TestMethod
FROM COURSE
WHERE CourseType='基础课';
SELECT *
FROM BasicCourseView
ORDER BY CourseName;
DROP VIEW BasicCourseView;
第四章
概念
- 开发过程
- 数据需求分析
- 数据库设计阶段
- 数据库实现阶段
- 数据库测试阶段
- 数据模型
- 概念数据模型
CDM
- 以用户角度
- 逻辑数据模型
LDM
- 从系统分析员角度
- 物理数据模型
PDM
- 从系统设计人员角度
- 概念数据模型
E-R
模型- 实体-联系模型
- 描述现实世界概念数据模型、逻辑数据模型的有效方法。
- 规范化数据库设计的原因
- 减少数据冗余
- 数据完整性和一致性
- 系统对数据高效访问
- 函数依赖
- 一个属性确定了,另一个属性也随之确定了。
- 完全函数依赖
- 表明函数依赖的决定因子中的最小属性集。
- 否则为部分函数依赖。
- 属性传递依赖
- 属性如果不是一一对应,可以根据属性之间的依赖关系,进行传递。
- 多值依赖
- 属性间的一对多联系。
- 规范化范式
- 关系表符合规范化程度的模式。
模式 | 程度 |
---|---|
第一范式 | 属性不可细分 |
第二范式 | 消除部分函数依赖 |
第三范式 | 切断传递函数依赖 |
BCNF | 决定因子都是候选键 |
第四范式 | 消除多值依赖 |
第五章
概念
-
数据库管理原因
- 规模扩大,系统变复杂
- 多用户带来访问复杂性
- 安全和隐私非常重要
- 意外事件
-
数据库管理目标
- 保障系统正常运行
- 发挥系统软硬件处理能力
- 确保用户数据安全
- 管理用户权限
- 解决优化等问题
- 发挥作用
-
ACID
特性- 原子性
- 一致性
- 隔离性
- 持续性
-
事务不能实现
- 对数据库的操作
- 日志操作
- 权限赋予
-
并发控制的原因
- 并发可能带来数据不一致、事务死锁等问题。
-
并发控制需解决的问题
- 丢失更新数据
- 不可重复读/幻读
- 脏数据读
-
可串行化调度
- 事务中数据操作顺序的结果和事务串行执行结果一样时,并发事务调度才能保证操作的正确性和一致性。
-
加锁访问
- 排它锁定
- 不允许其他事务加锁
- 共享锁定
- 只允许其他事务加读取锁
- 排它锁定
-
锁的相容性
排它锁 | 共享锁 | 无锁 | |
---|---|---|---|
排它锁 | 否 | 否 | 是 |
共享锁 | 否 | 是 | 是 |
无锁 | 是 | 是 | 是 |
锁协议 | 排它锁 | 共享锁 | 更新丢失 | 脏数据读 | 不可重复读 |
---|---|---|---|---|---|
一级加锁协议 | 全程加 | 不加 | √ | × | × |
二级加锁协议 | 全程加 | 读完释放 | √ | √ | × |
三级加锁协议 | 全程加 | 全程加 | √ | √ | √ |
二级和三级加锁协议都是在一级基础上的。
- 二阶段锁定协议
- 每个事务的加锁解锁分为两个阶段。
- 事务隔离级别
- 级别越高,数据不一致可能越小,系统吞吐量也越小。
- 安全模型
- 身份认证
- 权限控制
- 系统防护
- 加密存储
操作
事务
START TRANSACTION;
<SQL>;
...
COMMIT;
START TRANSACTION;
<SQL>;
...
ROLLBACK;
START TRANSACTION;
<SQL>;
...
SAVEPOINT <保存点名>;
...
ROLLBACK <保存点名>;
用户
CREATE USER "userA" WITH
LOGIN
NOSUPERUSER
NOCREATEDB
NOCREATEROLE
INHERIT
NOREPLICATION
CONNECTION LIMIT -1
RASSWORD '123456';
ALTER USER "userA"
CONNECTION LIMIT 10;
DROP USER userA;
GRANT SELECT ON COURSE TO userA;
角色
CREATE ROLE "Role_Manager" WITH
LOGIN
CONNECTION LIMIT -1;
GRANT SELECT ON COURSE TO "Role_Manager";
备份
BACKUP DATABASE CourseDB TO DISK="D:\CourseDB.bak";
RESTORE DATABASE CourseDB FROM DISK="D:\CourseDB.bak";
第六章
概念
JDBC
访问数据库步骤- 应用程序开始
- 导入
java.sql
包 - 加载并注册驱动
- 创建
Connection
对象 - 创建
Statement
对象 - 执行
SQL
- 使用
ResultSet
对象返回结果 - 关闭
ResultSet
对象 - 关闭
Statement
对象 - 关闭
Connection
对象 - 结束
- 触发器
- 可实现复杂的数据完整性。
- 本身是一个特殊的事务单位。
- 由
INSERT
、UPDATE
、DELETE
触发而被动执行。 - 必须定义在表或视图上。
- 触发器的特殊变量
NEW
:值为改变之后的行。OLD
:值为改变之前的行。TG_OP
:值为引发触发器的操作。
操作
JDBC
- 加载驱动
Class.forName("org.postgresql.Driver");
- 建立连接
String url = "jdbc:postgresql://localhost:5432/testdb";
String usrName = "admin";
String pasWord = "password";
connection conn = DriverManager.getConnection(url,usrName,pasWord);
- 创建
Statement
Statement stat = conn.createStatement();
- 执行
SQL
语句
String sql = "INSERT INTO STUDENT"
+ " VALUES('201909','DD','男');";
stat.executeUpdate(sql);
String sql = "SELECT id,name,gender FROM company;"
ResultSet rs = stat.executeQuery(sql);
- 打印结果
while(rs.next()){
System.out.println(rs.getString("id"));
}
- 关闭连接
rs.close();
stat.close();
conn.close();
存储过程
- 创建
CREATE OR REPLACE FUNCTION countRecords()
RETURNS INTEGER
AS $COUNT$
DECLARE
count integer;
BEGIN
SELECT COUNT(*) INTO count FROM STUDENT;
RETURN count;
END;
$COUNT$ LANGUAGE plpgsql;
- 执行
SELECT * FROM countRecords();
- 删除
DROP FUNCTION IF EXISTS countRecords();
PL/SQL语法
- 条件
IF count>0 THEN
count = count - 1;
ELSIF count<0 THEN
count = count + 1;
ELSE
EXIT;
END IF;
- 循环
LOOP
count=count+1;
EXIT WHEN count>100;
END LOOP;
WHILE count>0 LOOP
count=count-1;
END LOOP;
FOR i IN 1...10 LOOP
RAISE NOTICE 'i=%',i;
END LOOP;
FOR rec IN SELECT id,name FROM STUDENT LOOP
RAISE NOTICE "ID:%,NAME:%",rec.id,rec.name;
END LOOP;
触发器
- 构造触发器函数
CREATE OR REPLACE FUNCTION score_audit()
RETURNS TRIGGER
AS $SCORE$
BEGIN
IF (TG_OP = "DELETE")THEN
INSERT INTO AUIT SELECT OLD.ID,OLD.SCORE;
RETURN OLD;
END IF;
RETURN NULL;
END;
$SCORE$ LANGUAGE plpgsql;
- 操作触发器
CREATE TRIGGER AUDIT_TRIGGER
AFTER DELETE OR INSERT
ON STUDENT
FOR EACH ROW EXECUTE PROCEDURE score_audit();
ALTER TRIGGER AUDIT_TRIGGER ON STUDENT RENAME TO AT;
DROP TRIGGER IF EXISTS AUDIT_TRIGGER ON STUDENT CASCADE;
游标
- 定义
CURSOR_NAME REFCURSOR FOR SELECT * FROM STUDENT;
CURSOR_NAME REFCURSOR(KEY INTEGER) IS SELECT * FROM STUDENT WHERE SID=KEY;
- 打开
OPEN CURSOR_NAME FOR QUERY;
OPEN CURSOR_NAME EXECUTE QUERY_STRING;
OPEN CURSOR_NAME;
前两个适用于未绑定的,后面那个适用于绑定过的。
- 使用游标
FETCH CURSOR_NAME INTO ID,NAME;
IF FOUND THEN
...
END IF;
- 关闭游标
CLOSE CURSOR_NAME;
第七章
概念
- 分布式文件系统
- 文件系统的资源不存储在本地节点。
- 分布式数据库=数据库+网络技术
5V
特征- 超量
Volume
- 高速
Velocity
- 异构
Variety
- 真实
Veracity
- 价值
Value
- 超量
NoSQL
性质- 易扩展
- 数据模型灵活
- 高可用性
- 大数据量
- 高性能
- 分布式数据库不一致原因
- 多个副本
- 单点网络故障
- 通信网络故障
- 分布式提交等
- 分布式环境要求
CAP
- 一致性
- 可用性
- 分区容忍性
BASE
- 基本可用
- 软状态
- 最终一致性
NoSQL
定义- 一个非关系数据存储系统
- 不单指一个产品或技术,它代表一族产品,也是一个概念。
NoSQL
技术- 简单数据类型:键值
- 元数据与应用数据分离
NoSQL
特点- 优点
- 高可扩展性
- 分布式计算
- 低成本
- 架构灵活
- 半结构化数据
- 关系简单
- 缺点
- 没有标准化
- 查询功能有限
- 不直观
- 优点
- 列存储数据库
- 把一列中的数据值串在一起存储
- 例:
HBASE
- 键值对数据库
- 每行记录由主键和值两个部分组成
- 例:
Redis
- 文档数据库
- 将数据存储为一个文档
- 例:
MongoDB
- 图形数据库
- 通过关系来连接各个节点
- 例:
Neo4J