外模式-模式映像
模式对应全局逻辑结构,外模式描述局部逻辑结构,一个模式可以对应多个外模式,当模式发生改变时,通过改变外模式-模式映像可以保持外模式不变,即不必修改根据外模式编写的应用程序,从而实现了数据的逻辑独立性
模式-内模式映像
模式和内模式映像是唯一的,当数据库的存储结构发生改变时,通过数据库管理员修改模式-内模式映像,模式无需改变,可以保证数据与程序的物理独立性。
选择(selection)
σ F ( R ) = { t ∣ t ∈ R ∧ F ( t ) = ′ 真 ′ } \sigma_{F}(R) = \{t|t\in R \land F(t)='真'\} σF(R)={t∣t∈R∧F(t)=′真′}
F为逻辑判别式,含义为从关系中选择使得F成立的元组组成新的关系
投影(projection)
关系R上的投影,是从R中选出若干属性列组成新关系
π A ( R ) = { t [ A ] ∣ t ∈ R } \pi_A(R)=\{t[A] |t\in R\} πA(R)={t[A]∣t∈R}
A为R中的属性列表
连接(join)
$ R{\Join\atop A\theta B}S= {{\stackrel \frown {{t_R}{ t_S}}}|t_R\in R\land t_S\in S\land t_R[A]\theta t_S[B]} $
由R和S中满足A θ \theta θB关系式的属性列连接而成的关系。A、B为属性列, θ \theta θ代表运算符。
两种重要的连接:等值连接(equijoin)和自然连接(natural join)
θ \theta θ是等号时,即为等值连接。
自然连接是特殊的等值连接,要求进行比较的分量必须是同名属性,并在结果中去掉重复的属性列
语句基本格式为:
操 作 语 句 工 作 空 间 名 ( 表 达 式 ) : 操 作 条 件 \boxed {操作语句 \quad 工作空间名(表达式): 操作条件} 操作语句工作空间名(表达式):操作条件
表达式用于指定预计的操作对象,可以说关系名或属性名。
操作语句为GET、PUT、HOLD、UPDATE、DELETE、DROP
RANGE 关系名 变量名
可以声明元组变量用来代替关系
操作条件中可以添加DOWN/UP 属性名来使得结果降序或升序排列
元组演算表达式: { t ∣ ϕ ( t ) } \{t\ |\ \phi(t)\} {t ∣ ϕ(t)} ϕ ( t ) \phi(t) ϕ(t)是元组关系演算公式,由原子公式和运算符组成。
原子公式分类:
R ( t ) R(t) R(t) :R代表关系,t是元组变量,表示t是R中的元组
t [ i ] θ u [ j ] t[i]\theta u[j] t[i]θu[j] :t和u是元组变量,表示t的第i个分量和u的第j个分量满足运算 θ \theta θ
t [ i ] θ c t[i]\theta c t[i]θc 或 c θ t [ i ] c\theta t[i] cθt[i]:c是常量, 表示t的第i个分量和c满足运算 θ \theta θ
综合统一,包括了模式数据定义语言模式DDL,外模式数据定义语言外模式DDL,数据存储描述语言DSDDL,数据操纵语言DML
高度非过程化,无需了解存取路径和操作过程
面向集合的操作方式
以同一种语法结构提供多种使用方式
语言简洁,易学易用,只有九个核心动词:
SQL功能 | 动词 |
---|---|
数据查询 | SELECT |
数据定义 | CREATE,DROP,ALTER |
数据操纵 | INSERT,UPDATE,DELETE |
数据控制 | GRANT,REVOKE |
支持关系数据库三级模式结构,外模式包括若干视图和部分基本表,数据库模式包括若干基本表,内模式八廓若干存储文件。用户使用SQL可以对基本表和视图进行查询或其它操作。
数据定义语句
操作对象 | 创建 | 删除 | 修改 |
---|---|---|---|
模式 | CREATE SCHEMA | DROP SCHEMA | |
表 | CREATE TABLE | DROP TABLE | ALTER TABLE |
视图 | CREATE VIEW | DROP VIEW | |
索引 | CREATE INDEX | DROP INDEX | ALTER INDEX |
--定义
CREATE SCHEMA 模式名 AUTHORIZATION 用户名
--可以后接视图和基本表的定义子语句
--删除
DROP SCHEMA 模式名 CASCADE|RESTRICT
--CASCADE和RESTRICT二选一,前者表示删除该模式下的所有对象,后者则仅在无下属的视图、表对象时执行删除
--定义
CREATE TABLE 表名 (属性名 数据类型 列级完整性约束,
...
属性名 数据类型 列级完整性约束,
表级完整性约束
);
--修改
ALTER TABLE 表名
ADD COLUMN 列名 数据类型 列级完整性约束 --添加列
ADD 表级完整性约束 --添加约束
DROP COLUMN 列名 CASCADE|RESTRICT --删除列
DROP CONSTRAINT 完整性约束 RESTRICT|CASCADE --删除约束
ALTER COLUMN 列名 数据类型; --修改列
--删除
DROP TABLE 表名 RESTRICT|CASCADE
--建立索引
CREATE [UNIQUE] [CLUSTER] INDEX 索引名 ON 表名 (列名 [ASC|DESC],...列名 [ASC|DESC]);
-- UNIQUE表示唯一索引 CLUSTER 表示聚类索引 ASC|DESC表示索引按照属性值排序的方式
--删除索引
DROP INDEX 索引名;
--修改索引
ALTER INDEX 旧索引名 RENAME TO 新索引名;
所有的数据查询操作,都基于SELECT语句进行
--查询列
SELECT 列名,列名,...列名 FROM 表名;
--查询列计算值
SELECT 表达式 FROM 表名;
--去重复值
SELECT DISTINCT 查询表达式 FROM 表名;
--查询满足条件的元组
SELECT 查询表达式 FROM 表名 WHERE 限定条件;
查询条件 | 谓词 |
---|---|
比较 | =, >, <, >=, <=, !=, <>(不等于), !>, !<, |
确定范围 | BETWEEN 下限 AND 上限,NOT BETWEEN 下限 AND 上限 |
确定集合 | IN 集合(小括号内+元素), NOT IN 集合 |
字符匹配 | LIKE, NOT LIKE 后跟匹配字符串。可含通配符:%为任意长度字符,_表示任意单个字符。 |
空值 | IS NULL, IS NOT NULL |
多重条件 | ANDD, OR, NOT |
聚集函数
函数形式 | 功能 |
---|---|
COUNT(*) | 统级元组个数 |
COUNT( [DISTINCT|ALL] 列名) | 统计某一列中值的个数 |
SUM( [DISTINCT|ALL] 列名) | 计算某一列值的总和 |
AVG( [DISTINCT| ALL] 列名) | 计算该列平均值 |
MAX( [DISTINCT|ALL] 列名 ) | 求最大值 |
MIN( [DISTINCT|ALL] 列名) | 求最小值 |
使用WHERE子句连接两个或更多的表进行查询
连接格式如下:
[表1.列1] 比较运算符 [表2.列2]
[表1.列1] BETWEEN [表2.列2] AND [表2.列3]
当属性名唯一时,可以省略表名前缀
等值连接查询和非等值连接查询
连接运算符为=,是等值连接,其他运算符为非等值连接
自身连接,一表与自身进行连接
外连接:分为左外连接和右外连接,左外连接列出左边关系中的所有元组,右外连接列出右边关系中的所有元组
多表连接:先两个表连接 再把结果与第三个表连接
SELECT语句可以进行嵌套,但是子查询语句不能使用ORDER BY进行排序。
带有IN谓词的子查询
子查询的结果作为查询限定的集合
带有比较运算符的子查询
子查询结果是确定的可以用来比较的值
带有ANY(SOME)或ALL谓词的子查询
ANY(SOME)表示某个,ALL表示所有,当子查询结果有多个时,需要用谓词修饰后才能进行比较运算。
带有EXISTS谓词的子查询
带有EXISTS的子查询表示存在量词判断,不返回任何数据,只返回真假
SELECT语句的查询结果是元组的集合,因此多个SELECT语句的结果可以进行集合操作,主要包括并UNION,交INTERSECT和差EXCEPT。
子查询同样可以出现在FROM子句,此时子查询生成的临时派生表成为查询的对象。
SELECT [ALL|DISTINCT] <目标表达式>[别名],...FROM <表或视图>[别名][,<表或视图>[别名], | SELECT子语句] [AS <别名>] [WHERE <条件表达式>]
[GROUP BY <列名> [条件表达式]]
[ORDER BY <列名> [ASC|DESC]]
插入元组
INSERT INTO 表 (属性1,属性2,...)
VALUES (值1,值2,...);
批量插入子查询结果
INSERT INTO 表 (属性1,属性2,...)
SELECT 语句;
可以把子查询结果批量插入
UPDATE 表
SET 列=表达式,...
WHERE 条件
DELETE
FROM 表
WHERE 条件
IS NULL
或IS NOT NULL
CREATE VIEW 视图名 [列名,列名...] --列名全省或全写
AS <子查询> --子查询语句目标不是列名而是表达式时,必须指定列名
[WITH CHECK OPTION] --CHECK OPTION保证视图修改时必须满足子查询中的限定条件
DROP VIEW 视图名 [CASCADE]
基本表删除后,导出的视图并没有被删除,需要显式删除
同表查询类似,只是关系数据库在执行视图查询语句时,会先根据视图定义把查询语句转换成对基本表的查询,即视图消解。
同视图查询类似,同样通过视图消解实现对视图的更新,WITH CHECK OPTION 可以保证不修改不满足视图限定条件的数据。
用户标识 = 用户名+用户标识号(UID)
用户身份鉴别:
通过GRANT
和REVOKE
语句实现。
用户权限由数据库对象和操作类型组成。
--授权
GRANT 权限,权限...ON 对象类型 对象名,对象类型 对象名 TO 用户,用户...
WITH GTANT OPTION --表示当前被授权用户可以把自己的权限授予其他用户
--回收
REVOKE 权限 ON 对象类型 对象名 FROM 用户
数据库角色是被命名的一组与数据库操作相关的权限,角色是权限的集合。可以简化授权管理。
角色的创建
CREATE ROLE 角色名
角色授权
GRANT 权限 ON 对象类型 对象名 TO 角色
角色赋予
GRANT 角色 TO 角色 ,用户
WITH ADMIN OPTION -- 可以给其他用户授权
角色权限回收
REVOKE 权限 ON 对象类型 对象名
FROM 角色
用户不能直接感知或控制。
在强制存取控制中,数据库管理的实体分为主体和客体。
主体是系统中的活动实体,包括实际用户和代表用户的各个进程。
客体是系统中的被动实体,受主体操控,包括文件、基本表、索引、视图等。
对于所有主体和客体,系统为每个实例指派一个敏感度标记(label)。
敏感度标记分为若干级别。
只允许主体读取不高于主体敏感度级别的客体,实现访问控制。
只允许主体写入不低于主体敏感度级别的客体,从而防止主体把高密级的客体信息写入低密级的客体,造成信息泄露。
####4.2.7 视图机制
通过为不同用户定义不同的视图,把数据对象限制在一定范围内,实现安全防护。
审计功能把用户对数据库的所有操作自动记录下来放入审计日志(audit log)中。审计员理由审计日志监控数据库的各种行为。
审计事件分为多个类别:
AUDIT语句用来设置审计功能,NOAUDIT语句取消审计功能。
AUDIT|NOAUDIT 操作 ON 审计对象;
对用户和服务器之间通信进行加密,如链路加密和端到端加密。
链路加密在链路层加密报文和报头,端到端加密在发送多加密报文,接收端解密报文,无需中间节点密码设备。
关系模型的实体完整性在CREATE TABLE
语句中用PRIMARY KEY
定义。单属性主码可以定义为列级约束或表级约束,多属性主码只能定义为表级约束。
在数据插入修改时自动检查主属性是否为空,为空则拒绝插入或修改。
定义方式
--表级约束
CREATE TABLE 表名(属性名 数据类型 列级约束,
...
PRIMARY KEY(属性1,属性2...));
--列级约束
CREATE TABLE 表名(属性名 数据类型 PRIMARY KEY,
...
表级约束);
定义
CREATE TABLE 参照表(属性名 数据类型 列级约束,
...
FOREIGN KEY(外码1) 被参照表1(主码),
FOREIGN KEY(外码2) 被参照表2(主码),
);
检查
被参照表删除元组或修改主码,参照表修改外码或插入元组时,检查参照完整性。
NOT NULL
UNIQUE
CHECK(表达式)
表级约束,CHECK语句约束
在创建表的约束时,可以给约束条件命名,从而方便后续的修改删除。
约束命名
在完整性约束条件前加上CONSTRAINT 约束名
约束修改
--删除约束
ALTER TABLE 表名
DROP CONSTRAINT 约束名
--新增约束
ALTER TABLE 表名
ADD CONSTRAINT 约束名 约束条件
断言可以对多个表相关数据进行约束,任何涉及断言中的关系的操作都需要满足断言条件。
--定义断言
CREATE ASSERTION 断言名 CHECK子句
--删除断言
DROP ASSERTION 断言名
触发器(trigger)是用户定义在关系表上的一类由事件驱动的特殊过程,当用户对关系表执行特定操作并满足触发条件时,执行预设语句,因此又叫事件-条件-动作规则
CREATE TRIGGER 触发器名
{BEFORE|AFTER} 触发事件 ON 表名
REFERENCING NEW|OLD ROW AS 变量 -- 行级触发器的引用
FOR EACH{ROW|STATEMENT} -- 定义触发器类型
WHEN 触发条件 --可省略
触发动作体
只有表的创建者才可以在表上创建触发器,一个表上可以创建的触发器数量有限
触发器名和表名必须在同一模式下,同一模式下触发器名必须唯一
触发器只能定义在基本表上
触发事件包括:INSERT、UPDATE、DELETE
或动作组合
可以在触发事件中进一步指明细节,具体到对某一列的修改,例如UPDATE OF 触发列
FOR EACH ROW
代表行级触发器,每影响一行记录就触发一次动作,可以通过NEW |OLD
语句在过程体中引用事件发生前的旧值或发生后的新值FOR EACH STATEMENT
代表列级触发器,触发后只执行一次动作体DROP TRIGGER 触发器名 ON 表名