一、关系数据库的规范化

1. 函数依赖

数据依赖是通过一个关系中属性间值的相等与否体现出来的数据间的相互关系。

函数依赖是一种最重要的、最基本的数据依赖。

设 R(U) 是属性集 U 上的关系模式,X、Y 是 U 的子集。若对于 R(U) 的任意一个可能的关系 r,r 中不可能存在两个元组在 X 上的属性值相等,而在 Y 上的属性值不等,则称 X 函数确定 YY 函数依赖于 X,记作 X → Y

2. 规范化

规范化的目的是消除数据冗余和更新异常。

1NF(第一范式)

  • 关系中每个属性都是原子值,不可再分
  • 是最基本的规范形式

2NF(第二范式)

  • 满足 1NF
  • 每个非主属性完全函数依赖于主键(不存在部分依赖)

3NF(第三范式)

  • 满足 2NF
  • 每个非主属性不传递依赖于主键

BC范式(BCNF)

  • 满足 3NF
  • 每个决定因素都是候选键

3. 模式分解

模式分解是将一个关系模式分解为多个关系模式的过程。

分解准则:

  • 无损连接性:分解后通过自然连接可以恢复原来的关系
  • 保持函数依赖:分解后原来的函数依赖仍然成立

二、SQL语言详解

1. SQL数据定义(DDL)

创建表

CREATE TABLE 表名 (
    列名 数据类型 [约束条件],
    ...
    [表级约束条件]
);

创建视图

CREATE VIEW 视图名 [(列名1, 列名2, ...)]
AS 子查询
[WITH CHECK OPTION];

创建索引

CREATE [UNIQUE] [CLUSTER] INDEX 索引名
ON 表名 (列名 [ASC|DESC], ...);

删除操作

DROP TABLE 表名;
DROP VIEW 视图名;
DROP INDEX 索引名;

2. 索引详解

索引的作用:

  • 加快数据查询速度
  • 保证数据的唯一性
  • 加速表与表之间的连接

索引分类:

  • 唯一索引:索引列的值必须唯一
  • 非唯一索引:索引列的值可以重复
  • 聚簇索引:数据行的物理顺序与索引顺序一致,一个表只能有一个
  • 非聚簇索引:数据行的物理顺序与索引顺序不一致,一个表可以有多个

索引操作:

  • 创建索引:CREATE INDEX
  • 删除索引:DROP INDEX
  • 修改索引:ALTER INDEX

3. 视图详解

视图的定义:
视图是从一个或多个基本表或视图中导出的表,其结构和数据是建立在对表的查询基础上的,是虚拟表

视图的作用:

  • 简化复杂的查询操作
  • 使用户能以多种角度看待同一数据
  • 对重构数据库提供了一定程度的逻辑独立性
  • 能够对机密数据提供安全保护
  • 适当的利用视图可以更清晰的表达查询

视图的操作:

  • 创建视图:CREATE VIEW
  • 删除视图:DROP VIEW
  • 查询视图:与查询基本表相同
  • 更新视图:有限制条件

4. SQL数据查询

简单查询

SELECT * FROM 表名;
SELECT 列名1, 列名2 FROM 表名 WHERE 条件;

连接查询

若查询涉及两个以上的表,则称为连接查询。

内连接(INNER JOIN):

SELECT * FROM 表1 INNER JOIN 表2 ON 表1.列 = 表2.列;

外连接:

  • 左外连接(LEFT JOIN)
  • 右外连接(RIGHT JOIN)
  • 全外连接(FULL JOIN)

子查询与聚合函数

常用聚合函数:

函数 功能
COUNT(*) 统计元组个数
COUNT(列名) 统计该列非空值个数
SUM(列名) 计算列值总和
AVG(列名) 计算列值平均值
MAX(列名) 求列值最大值
MIN(列名) 求列值最小值

子查询:

  • 嵌套在另一个查询中的 SELECT 语句
  • 可以出现在 WHERE、FROM、SELECT 子句中

LIKE 模糊查询

SELECT * FROM 表名 WHERE 列名 LIKE '模式';
  • %:匹配任意长度的字符串(包括空串)
  • _:匹配单个字符

分组查询

SELECT 列名, 聚合函数(列名)
FROM 表名
GROUP BY 列名
[HAVING 条件];

注意:

  • WHERE 子句作用于基本表或视图
  • HAVING 子句作用于组

5. SQL数据更新

INSERT(插入)

-- 插入单条记录
INSERT INTO 表名 [(列名1, 列名2, ...)]
VALUES (值1, 值2, ...);

-- 插入子查询结果
INSERT INTO 表名 [(列名1, 列名2, ...)]
子查询;

DELETE(删除)

DELETE FROM 表名
[WHERE 条件];

UPDATE(修改)

UPDATE 表名
SET 列名 = 表达式 [, ...]
[WHERE 条件];

6. SQL访问控制

DBMS数据控制的功能包括授权和收回权限。

授权(GRANT)

GRANT 权限列表 ON 对象 TO 用户 [WITH GRANT OPTION];

权限类型:

  • SELECT
  • INSERT
  • DELETE
  • UPDATE
  • ALL PRIVILEGES

收回权限(REVOKE)

REVOKE 权限列表 ON 对象 FROM 用户 [CASCADE | RESTRICT];