数据库理论(二)——索引与视图

数据库对象

表(tables):关系在数据库中的表现形式

视图(Views):虚表,从一个或者多个table中导出的,数据库中存放视图的结构而不存放视图对应的数据,可以基于存在的视图定义新的视图。

索引(index):一种特殊的存储结构,伴随基本表存在,是基本表中若干属性(组)的有序结构;用于加快数据库的查询速度。

1个关系数据库实例->多个数据库

1个数据库->多个模式

1个模式->多个表,视图,索引等数据库对象

创建和删除数据库

1
2
3
4
-- 创建数据库
CREATE DATABASE 数据库的名称;
-- 删除数据库
DROP DATABASE 数据库的名称;

模式的创建与删除

1
2
3
4
-- 创建模式,作者是用户
CREATE SCHEMA 模式名称 AUTHORIZATION 用户名;
-- 删除模式 cascade级联删除——删除该模式下的所有数据库对象,restrict限制删除——只有模式为空的时候才能删除
drop schema 模式名称 <cascade|restrict>

表的创建,修改与删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-- 创建
create table 表名{
属性名1 属性类型 约束(可选)
};
-- 约束选项:
-- primary key 可以在属性后面直接写上,表示该属性为该表的主码;也可以在最后写上,primary key(属性1,属性2,...)表示这些属性为联合主码
-- unique 表示改属性为唯一属性,可以在对应的属性后面直接写上
-- not null 该属性不为空
-- check (条件) 只有该属性满足该条件才行
-- foreign key (属性名) references 表名(属性名),给当前表定义外码

-- 添加列
alter table 表名 add 属性名 数据类型 约束(可选);
-- 删除约束
alter table 表名 drop 约束
-- 修改属性的数据类型
alter table 表名 alter column 属性名 数据类型
-- 删除一列
alter table 表名 drop 属性名

-- 删除表,使用cascade会i对应功能删除其建立的索引,视图,触发器
drop table 表名

属性的数据类型

数据类型 含义
CHAR(n) 长度为n的定长非Unicode字符串
VARCHAR(n) 最大长度为n的变长非Unicode字符串
NVARCHAR(n) 最大长度为n的变长Unicode字符串
INT 长整数(也可以写作INTEGER)
SMALLINT 短整数
NUMERIC(p,d) 定点数,由p位数字(不包括符号、小数点)组成,小数后面有d位数字
REAL 取决于机器精度的浮点数
Double Precision 取决于机器精度的双精度浮点数
FLOAT(n) 浮点数,精度至少为n位数字
DATE 日期,包含年、月、日,格式为YYYY-MM-DD
TIME 时间,包含一日的时、分、秒,格式为HH:MM:SS

索引的建立与删除

索引:数据表中一个或多个列的一种有序(存储)结构。属于内模式

每个索引项都有一个特定的搜索码与表中的记录关联,索引按顺序存储搜索码的值。

策略:空间换时间

索引会占用额外的存储空间,降低插入删除和更新的速度,但是会提高查询速度

聚簇索引

  1. 表中数据的物理存储顺序按照索引键的排序次序存储
  2. 一个数据表只能建立一个聚簇索引

非聚簇索引

1
2
3
4
5
6
7
8
9
10
11
-- 创建一个聚簇索引
create CLUSTERED index 索引名
on 表名(属性)

-- 创建一个联合,唯一,正逆序索引
create unique index 索引名
on 表名(属性1 asc,属性2 desc)
-- 索引是先按照属性1进行正顺排列,然后在属性1相同的元组中,属性2按逆序排列

-- 删除索引
drop index 索引名。

视图的创建与删除

1
2
3
4
5
6
7
create view 视图名
as
子查询

-- 子查询中不允许出现order by 或者distinct语句
-- 删除视图,可以使用cascade进行级联删除
drop view 视图名

对视图进行修改,插入,删除就和操作表一样,因为视图消解策略会使得原来的表也进行相应的修改。

数据查询

1
2
select [关系名称,算术表达式,字符串常量,函数] from 表名
where [条件表达式]

image-20210521221818980

:select A union select B

:select A except select B

:select A intersect select B

笛卡儿积:select A.a,B.b from A,B

自然连接:select A.a,B.b from R join S on A.c=B.c

去重distinct

排序order by 属性名

聚集group by 属性名

聚集附加条件having

是否为空is null

聚集运算

image-20210521223520872

like的通配符

使用通配符时需要用引号引入

a%m:表示以字母a开头,字母m结尾的所有字符串

张_:姓张,且仅由一个字的名,如张三,张B可以,但是张sc,张器才,就不行

_S%T:第二个字母是S,以T结尾

image-20210521223259285

插入

1
2
3
4
5
6
7
-- 插入
insert into 表名 values (各个属性对应的值);
-- 修改
update 表名 set 属性1 =
-- 修改可以选择使用where表示先筛选再修改,不用where表示更新所有元组的对应属性
-- 删除,删除表中满足条件的所有元组,缺省表示删除表中所有元组
delete from 表名 where 条件

代数优化的启发式规则

  1. 选择运算应尽可能先做
  2. 投影运算和选择运算同时进行
    1. 如果有若干个投影和选择运算,并且他们都是对同一个关系操作,则可以在扫描此关系的同时完成所有的这些运算,以避免重复扫描关系
  3. 把投影同其前或其后的双目运算结合起来
  4. 把某些选择同在它前面要执行的笛卡儿积结合起来成为一个连接运算符
  5. 找出公共子表达式,避免重复计算

举个例子:

image-20210522164048622