基本概念
- 数据库:相互之间有关联关系的表的集合
- 数据库系统包括
- 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
可以收回权力
- 权限包括