基本概念
- 数据库:相互之间有关联关系的表的集合
- 数据库系统包括
- DB
- DBMS
- DBAP
- DBA
- 计算机基础系统
- DBMS:数据库管理系统
- DBAP:数据库应用
- DBA:数据库管理员
- DDL:数据定义语言
- DML:数据操纵语言
- DCL:数据控制语言
- SQL:结构化查询语言,包含DDL、DML和DCL
DBMS的功能
- 语言翻译器
- 查询优化与实现
- 数据存取
- 通信控制
- 事务管理
- 故障恢复
- 安全性控制
- 完整性控制
- 数据字典管理
- API
- 性能分析
数据库系统的结构
三个层次
- 用户层:某一能看到和处理的数据,全局数据的一部分
- 逻辑层:全局角度理解管理的数据,包含了关联约束
- 物理层:储存在介质上的数据,包含了路径、储存方式和索引方式
数据的结构
- 模式:对数据库中数据所进行的一种结构性的描述所观察到数据的结构信息
- 视图:某一表现形式下展现出的数据
- 三级视图:
- 外视图:某一用户能看到的
- 概念视图:全局角度理解管理的数据结构描述,包含关联约束
- 内视图:介质上的数据结构描述
- 两层映像:
- E-I映射:外模式到概念模式,便于用户观察使用
- C-I映射:概念模式到内模式,便于计算机储存和管理
- 两个独立性
- 逻辑数据独立性:概念模式变化时 ,可以不改变外部模式
- 物理数据独立性:内部模式变化时,可以不改变概念模式
- 经典模型
- 表:关系模型
- 树:层次模型
- 图:网状模型
关系代数和SQL
关系
- 一个关系就是一个表
- 表的每列的范围称为域,域是一个集合
- 关系是一组域的笛卡尔积的子集
- 关系的性质:
- 同质:每一列都来自同一个域
- 不同列可以来自同一个域
- 行间、列间可以互换
- 区分列靠列名,行靠行的关键字
- 理论上,任意两个元组不能完全相同
- 关系的属性不可再分
- 候选码:一个属性组,可以唯一标识一个元组
- 主码:候选码之一。主码中的属性值不能为空。
- 主属性:包含在任何候选码中的属性
- 外码:R的一个属性组,不是R的候选码,但是与S的候选码相对应
关系完整性
- 实体完整性:主码中的属性不为空
- 参照完整性:外码要么空,要么对应了另一个实体的主码
- 用户自定义完整性:用户针对应用环境定义的完整性约束条件
关系运算
集合运算
- 交、并、差等,需要两个关系直接有一定的对应性(并兼容性)。
- 广义笛卡尔积
纯关系运算
- 选择:
- 投影
- 连接:
- 等值连接:为'='
- 自然连接:A=B的等值连接,简写为
- 除:; 笛卡尔积的逆运算
- 外连接:允许连接后的部分元组因失配而为空
- 左外连接:左侧表中不为空
- 右外连接:右侧表中不为空
- 全外连接:两侧表都可以为空
- 更名:
SQL
建库、建表和增删改
CREATE DATABSE {DBNAME}
CREATE TABLE {TableName}({Args})
:参数包含列名 数据类 型 修饰
: 修饰包含:PRIMARY KEY
UNIQUE
NOT NULL
DEFAULT {默认值}
CHECK({条件,只能使用当前列的值})
REFERENCES {表名}[{列名}] [ON DELETE [CASCADE|SET BULL]]
:当被引用的列被删除时,设为空或级联删除。
CONSTRAINT {约束名称}
表约束:UNIQUE {列集合}
几列值合在一起是唯一的PRIMARY KEY {列集合}
几列联合为主键CHECK {条件}
检查多列的值满足条件,只能用某一元组的值FOREIGN KEY {列集合} REFERENCES {表名}({列集合} [ON DELETE [CASCADE|SET BULL]])
:引用另一个表的若干列为外键
INSERT INTO {TableName}({Columes}) Values {Values}
DELETE FROM {TableName} WHERE {条件}
, 如果没有WHERE语句,则全部删除UPDATE {TableName} SET {赋值语句} WHERE {条件}
DROP TABLE {TableName}
ALTER TABLE {TableName} {操作}
:操作内容包含:ADD {列参数|约束参数}
DROP {完整性约束名}
MODIFY {列参数}
DROP DATABASE {DBNAME}
USE {DBNAME}
和CLOSE {DBNAME}
表查询
DISTINCT
关键字可以保证结果无重复ORDER BY {列名} [ASC|DESC]
可以完成结果排序(默认升序)[NOT ] LIKE '{模式}'
可以完成模糊查询,模式中:- %:匹配0或多个字符
- _:匹配任意单字
- :转义
- 多表联查:可以直接把表名接在
FROM
后 [NOT ]IN {集合}
,其中集合可以来自子查询<OP> ALL|SOME {集合}
: 将前置与集合中的值进行比较[NOT ]EXISTS {集合}
查询是否有集合中的元组存在- 聚合函数: COUNT,SUM,AVG,MAX,MIN; 经常搭配
GROUP BY {分组条件(列名和HAVING)}
使用。聚合函数的参数是列名。 HAVING {分组过滤条件}
UNION|INTERSECT|EXCEPT [ALL} {集合}
:并,交,差另一个集合。ALL允许重复元素出现。IS [NOT ]NULL
判断是否为空[NATURAL] [INNER|{LEFT|RIGHT|FULL}[ OUTER]] JOIN {集合} {ON {连接条件}|USING {列集合}}
:NATURAL,ON,USING
只能三选一。默认为内连接。NATURAL
:公共属性上取值相等,且属性只出现一次ON
: 取值满足指定条件。如果有公共属性,则会出现两次USING
:使用公共属性的子集完成连接,各属性只出现一次。
- 子查询的变量只能由外层向内层传递
视图
对应外模式,
CREATE VIEW view_name[(列名)]
AS
{子查询}
[WITH CHECK OPTION]
视图可以像表一样被各种操作使用,也可以被DROP VIEW
删除。
视图可以插入删除更新,但是出现以下情况时则不能更新:
- 目标列包含聚合函数
- 使用了
UNIQUE
或DISTINCT
- 使用了
GROUP BY
- 使用了算术表达式计算出的列
- 未包含主键
完整性约束
- 表约束和列约束:见
CREATE TABLE
- 断言
CREATE ASSERTION {名称} CHECK {条件}
,条件写法与WHERE类似。断言在每次DB更新时都检查,加重DB负担。 - 触发器:动态约束,
CREATE TRIGGER {名称}
BEFORE|AFTER
INSERT|DELETE|UPDATE
[OF {列名集合}]
ON {表名}
[REFERENCING {引用变量声明}] [FOR EACH ROW|STATEMENT]
[WHEN(条件)]
{操作}|
{BEGIN ATOMIC
{一堆操作}
END}
- 引用变量声明:
OLD|NEW [ROW|TABLE] [AS] {名称}
数据库访问控制
-
权力分级
- 读
- 更新(INSERT,UPDATE,DELETE)
- 创建(CREATE,DROP,ALTER)
-
授权指令
GRANT {ALL PRIVILEGES|{权限}}
ON 表|视图
TO {public|userid}
[WITH GRANT OPTION]- 权限包括
SELECT,INSERT,UPDATE,DELETE
- public表示所有用户
WITH GRANT OPTION
表示被授权者可以传播这些权利GRANT
换为REVOKE
可以收回权力
- 权限包括
嵌入式SQL
这是什么🐂🐎?不会吧,不会吧,1202年还有人拿C语言连数据库?
那为什么不用ODBC呢?每行一个exec sql
宁看着难不难受啊?
反正不算学分绩,这几个破分,不要也罢。
实锤不考了。
数据库设计
数据建模和数据库设计
- 数据模型:表达计算机世界的模型
- 概念模型:概念数据模型,表示信息世界的模型
- 理解-区分-命名-表达
ER模型
- 实体-关系模型
- 实体:客观存在,可互相区分
- 属性:实体的某一方面特性
- 关键字/码:实体中能用其值唯一区分每一实例的属性或属性组合
- 联系:某一实体的实例与其它实体实例之间可能发生的联系;发送联系的实体数目,称为联系的度或元。
- 角色:实体在联系中的作用
Crow’s Foot法
- 实体:矩形框
- 属性:实体框横线的下面
- 关键字:属性下加下划线
- 联系:菱形框或直接以名替代
- 联系基数:0,1,多
设计过程
- 需求分析
- 概念数据库设计:ER图
- 逻辑数据库设计:建立逻辑模型
- 物理数据库设计:建立物理模型
概念数据库设计-可能冲突
- 属性冲突
- 属性域冲突
- 属性取值单位冲突
- 结构冲突
- 同一对象在不同应用中抽象不同
- 同一实体在不同ER图中属性组成不同
- 联系在不同ER图中类型不同
- 命名冲突
- 同名异义
- 异名同义
错误设计引起的问题
- 冗余数据
- 非受控:单纯重复
- 受控:外键重复
- 插入异常:插入新数据时,会因为信息不足而无法插入
- 删除异常:当某些实体被删掉后,他们共有的某些信息随之丢失
IDEF1x
根据去年试题,本部分是可选的。考虑到复杂性,我决定PartiallyIgnore()
- 实体:现实和抽象事物的集合
- 独立实体:一 个实体的实例都被唯一的标识而不决定于它与其他实体的联系,直角矩形框;主关键字没有外键
- 从属实体:一个实体的实例的唯一标识需要依赖于该实体与其他实体的联系,圆角矩形框;需要从其他实体继承属性作为关键字的一部分,主关键字有外键
- 联系:实体间的连接关系
- 标定连接联系:子实体的实例都是由它与父实体的联系而确定,父实体的主关键字是子实体主关键字的一部分;实线表示,子实体侧有圆圈
- 非标定连接联系:子实体的实例能够被唯一标识而无需依赖与其实体的联系,父实体的主关键字不是子实体的主关键字;虚线表示,子实体侧有圆圈
- 分类联系:一个实体实例是由一个一般实体实例及多个分类实体实例构成的
- 完全分类:一圆圈带两横线
- 不完全分类:一圆圈带一横线
- 非确定联系:多对多联系,必须分解为若干个一对多的联系来表达,引入相交实体
- 属性
- 属性
- 主键
- 候选键
- 外键
数据依赖
函数依赖
设是属性集合上的一个关系模式,X、Y是U的两个子集。若对于中的任何一个关系,其中不可能有两个元组满足在X中的属性组相等而在Y中的属性值不等,则称“X函数决定Y”或“Y函数依赖于X”,记作
- 对于,称为非平凡的函数依赖
- 记作
完全函数依赖
如果对于中X的任何真子集X'都有则称Y完全函数依赖于X,记作,否则称Y部分函数依赖于X,记作;部分函数依赖导致非受控冗余