SQL笔记 --- 基本表,表完整性,索引,视图
目录
基本表
定义基本表
语法格式:
CREATE TABLE <表名>
(<列名> <数据类型>[ <列级完整性约束条件> ]
[,<列名> <数据类型>[ <列级完整性约束条件>] ] …
[,<表级完整性约束条件> ] );
要求:
如果完整性约束条件涉及到该表的多个属性列,则必须定义在表级上,否则既可以定义在列级也可以定义在表级
约束类型:
名称 作用 实现的完整性
Primary key 定义主键,保证主键列无重复值 实体完整性
Unique 保证该列无重复值 实体完整性
Foreign key 定义外键,保证数据表间数据的一致性 参照完整性
Check 定义表中某些列的数据范围 自定义完整性
Default 为列的数据提供默认值 自定义完整性
数据基本类型:
数据类型 含义
CHAR(n) 长度为n的定长字符串
VARCHAR(n) 最大长度为n的变长字符串,实际存储有效长度
INT 长整数(也可以写作 INTEGER)
SMALLINT 短整数
NUMERIC(p,d) 定点数,由p位数字(不包括符号、小数点)组成,小数后面有d位数字
REAL 取决于机器精度的浮点数
Double Precision 取决于机器精度的双精度浮点数
FLOAT(n) 浮点数,精度至少为n位数字
DATE 日期,包含年、月、日,格式为 YYYY-MM-DD
TIME 时间,包含一日的时、分、秒,格式为 HH:MM:SS
数据库与表:
- 关系:
- 每一个表都属于某一个数据库
- 一个数据库可以包含多个表
例子:
建立一个“学生选课”表SC
CREATE TABLE SC (Sno CHAR(9), Cno CHAR(4), Grade SMALLINT, PRIMARY KEY (Sno,Cno), /* 主码由两个属性构成,必须作为表级完整性进行定义*/ FOREIGN KEY (Sno) REFERENCES Student(Sno), /* 表级完整性约束条件,Sno是外码,被参照表是Student */ FOREIGN KEY (Cno) REFERENCES Course(Cno) /* 表级完整性约束条件, Cno是外码,被参照表是Course*/ );
修改基本表
语法格式:
ALTER TABLE <表名>
[ ADD <新列名> <数据类型> [ 完整性约束 ] ]
[ DROP <完整性约束名> ]
[ ALTER COLUMN<列名> <数据类型> ]
[ADD [COLUMN<约束名> ] <约束定义> ]
;
例子:
- 向Student表增加“入学时间”列,其数据类型为日期型 .
ALTER TABLE Student ADD S_entrance DATE;
- 将年龄的数据类型由字符型 (假设原来的数据类型是字符型)改为整数 .
-
ALTER TABLE Student ALTER COLUMN Sage INT;
删除基本表
语法格式:
DROP TABLE <表名>[RESTRICT| CASCADE];(缺省情况是 RESTRICT)
说明:
- RESTRICT 欲删除的基本表不能被其他表的约束所引用如果存在依赖该表的对象,则此表不能被删除,删除表是有限制的
- CASCADE 在删除基本表的同时,相关的依赖对象一起删除,表上建立的索引、视图、触发器等一般也将被删除.删除该表没有限制
例子:
- 删除Student表
DROP TABLE Student CASCADE ;
表完整性
实体完整性
说明:
关系模型的实体完整性在 CREATE TABLE 中用 PRIMARY KEY 定义
违约处理:
- 插入或对主码列进行更新操作时,RDBMS 按照实体完整性规则自动进行检查
- 检查主码值是否唯一,如果不唯一则拒绝插入或修改
- 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改
- 检查记录中主码值是否唯一的一种方法是进行全表扫描,由于对基本表进行全表扫描十分耗时的, RDBMS 核心一般都在主码上自动建立索引
定义:
- 单属性构成的码有两种方法:
- 定义为列级约束条件:
CREATE TABLE Student( Sno CHAR(9) PRIMARY KEY, Sname CHAR(20) NOT NULL, Ssex CHAR(2) , Sage SMALLINT, Sdept CHAR(20));
- 定义为表级约束条件:
CREATE TABLE Student( Sno CHAR(9), Sname CHAR(20) NOT NULL, Ssex CHAR(2) , Sage SMALLINT, Sdept CHAR(20), PRIMARY KEY (Sno));
- 定义为列级约束条件:
- 对多个属性构成的码只有一种说明方法:
- 定义为表级约束条件:
参照完整性
定义:
在 CREATE TABLE 中用 FOREIGN KEY 短语定义哪些列为外码用REFERENCES短语指明这些外码参照哪些表的主码
CREATE TABLE SC (Sno CHAR(9) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT, PRIMARY KEY (Sno, Cno), /*在表级定义实体完整性*/ FOREIGN KEY (Sno) REFERENCES Student(Sno), /*在表级定义参照完整性*/ FOREIGN KEY (Cno) REFERENCES Course(Cno) /*在表级定义参照完整性*/ );
违约处理:
- 拒绝(NO ACTION)执行:不允许该操作执行(默认策略)
- 级联(CASCADE)操作:当删除或修改被参照表的一个组员造成了与参照表的不一致,则删除或修改参照表的所有造成不一致的元组
- 设置为空值(SET-NULL):当删除或修改被参照表的一个组员造成了与参照表的不一致,则将参照表中的所有造成不一致的元组的对应属性设置为空置
说明:
- 对于参照完整性,除了应该定义外码,还应定义外码列是否允许空值
- 可能破坏参照完整性的情况
约束:
任何约束都有约束名
用户定义完整性
说明:
- 用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求,由 RDBMS 提供,而不必由应用程序承担
- 在CREATE TABLE时定义
- 列值非空(NOT NULL)
- 列值唯一(UNIQUE)
- 检查列值是否满足一个布尔表达式(CHECK)
- 设置默认值(DEFAULT)
类别:
- NOT NULL:
- 设置选项值不能为空(不能设置为表属性)
- UNIQUE:
- 唯一性约束用于指定一个或者多个列的组合的值具有唯一性,以防止在列中输入重复的值.当使用唯一性约束时,需要考虑以下几个因素:
- 主键自动具有 unique 的特性
- 一个表中可以允许有多个唯一性约束
- 可以把唯一性约束定义在多个字段上
- 唯一性约束用于强制在指定字段上创建一个唯一性索引
- 可以设置为表属性
- 唯一性约束用于指定一个或者多个列的组合的值具有唯一性,以防止在列中输入重复的值.当使用唯一性约束时,需要考虑以下几个因素:
- CHECK:
- 用CHECK短语指定列值应该满足的条件:
- 一个列级检查约束只能与限制的字段有关;一个表级检查约束只能与限制的表中字段有关.
- 一个表中可以定义多个检查约束
- 每个 CREATE TABLE 语句中每个字段只能定义一个检查约束
- 在多个字段上定义检查约束,则必须将检查约束定义为表级约束
- 当执行 INSERT 语句或者 UPDATE 语句时,检查约束将验证数据
- 用CHECK短语指定列值应该满足的条件:
- DEFAULT:
- 定义:
- [constraint 约束名]
- default 常量表达式 for 字段名
- 注意:
- 每个字段只能定义一个缺省约束
- 如果定义的缺省值长于其对应字段的允许长度,那么输入到表中的缺省值将被截断
- 不能加入到带有 IDENTITY 属性的字段上
- 定义:
违约处理:
- 属性上的约束条件检查和违约处理
- 插入元组或修改属性的值时,RDBMS 检查属性上的约束条件是否被满足如果不满足则操作被拒绝执行
- 元组上的约束条件检查和违约处理
- 插入元组或修改属性的值时,RDBMS 检查元组上的约束条件是否被满足如果不满足则操作被拒绝执行
完整性约束:
- 定义约束:
- CONSTRAINT 约束
CONSTRAINT <完整性约束条件名>
[ PRIMARY KEY短语
|FOREIGN KEY短语
|CHECK短语 ]
- CONSTRAINT 约束
- 删除表完整性约束:
-
ALTER TABLE Student DROP CONSTRAINT C3;
- 修改表完整性限制:
- 使用 ALTER TABLE 语句修改表中的完整性限制(可以先删除原来的约束条件,再增加新的约束条件)
-
ALTER TABLE Student DROP CONSTRAINT C3; ALTER TABLE Student ADD CONSTRAINT C3 CHECK (Sage < 40);
索引
用途:
建立索引的目的:加快查询速度
说明:
- 只有 DBA 或 表的属主(即建立表的人)可以建立索引
- 由 DBMS 自动完成维护索引,DBMS一般会自动建立以下列上的索引
- PRIMARY KEY
- UNIQUE
- DBMS 自动选择是否使用索引以及使用哪些索引
使用索引:
- RDBMS 中索引一般采用 B+ 树、HASH 索引来实现
- B+ 树索引具有动态平衡的优点
- HASH 索引具有查找速度快的特点
- 采用 B+ 树,还是HASH索引 则由具体的 RDBMS 来决定
- 索引是关系数据库的内部实现技术,属于内模式的范畴
- CREATE INDEX 语句定义索引时,可以定义索引是唯一索引、非唯一索引或聚簇索引
聚簇索引与非聚簇索引:
- 聚簇索引
- 对表的物理数据页中的数据按列进行排序,然后再重新存储到磁盘上,即聚簇索引与数据是混为一体的,它的叶节点中存储的是实际的数据
- 非聚簇索引
- 具有完全独立于数据行的结构,使用非聚簇索引不用将物理数据页中的数据按列排序.非聚簇索引的叶节点存储了组成非聚簇索引的关键字值和行定位器
建立索引:
- 语法格式:
- CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
- CREATE [UNIQUE] [CLUSTER] INDEX <索引名>
- 格式说明:
- <表名> 是要建索引的基本表名字
- UNIQUE 表明此索引的每一个值只对应唯一的数据记录
- CLUSTER 表明要建立的索引是聚簇索引.所谓聚簇错应是指索引项的顺序与表中记录的物理顺序一致的索引组织
- 说明:
- 索引可以建立在一个表的一列或多列上,各列名字之间用逗号隔开,每个<列名>后面还可以用<次序>指定索引值的排列次序,可以选 ASC (升序,此为默认值)或 DESC (降序)
- 要求:
- 在最经常查询的列上建立聚簇索引以提高查询效率
- 一个基本表上最多只能建立一个聚簇索引
- 经常更新的列不宜建立聚簇索引
- 例子:
- 在 Student 表的 Sname(姓名)列上建立一个聚簇索引
CREATE CLUSTER INDEX Stusname ON Student(Sname);
- 在 Student 表的 Sname(姓名)列上建立一个聚簇索引
删除索引:
- 语法格式:
- DROP INDEX <索引名>;
- 注意:
- 删除索引时,系统会从数据字典中删去有关该索引的描述
- 例子:
- 删除 Student 表的 Stusname 索引
DROP INDEX Stusname;
- 删除 Student 表的 Stusname 索引
视图
特点:
- 是从一个或几个基本表(或视图)导出的表
- 只存放视图的定义,不存放视图对应的数据
- 基表中的数据发生变化,从视图中查询出的数据也随之改变
- 一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化
特殊用途:
定义基本表是,为了减少数据库中的沉余数据,表中只存放基本数据,由基本数据经过各种计算派生出的数据一般是不存储的,但由于视图中数据并不是实际存储,所以定义视图时可以根据应用的需要,设置一些派生属性列.这些派生属性由于在基本表中并不实际存在也称它们为虚拟列.带虚拟列的视图也称为带表达式的视图
作用:
- 视图能够简化用户的操作
- 视图使用户能以多种角度看待同一数据
- 视图对重构数据库提供了一定程度的逻辑独立性
- 视图能够对机密数据提供安全保护
- 适当的利用视图可以更清晰的表达查询
基于视图的操作:
- 查询
- 删除
- 受限更新
- 定义基于该视图的新视图
行列子集视图:
从单个基本表导出,且只是去掉了基本表的某些行和某些列,但保留了主码
建立视图:
- 语法格式:
- CREATE VIEW
<视图名> [(<列名> [,<列名>]…)]
AS <子查询>
[WITH CHECK OPTION];
- CREATE VIEW
- 说明:
- WITH CHECK OPTION
- 表示对视图进行 UPDATE , INSERT 和 DELETE 操作时要保证更新,插入,删除的行满足视图定义的谓词条件(即子查询中的条件表达式)
- RDBMS 执行 CREATE VIEW 语句时只是把视图定义存入数据字典,并不执行其中的 SELECT 语句.
- 在对视图查询时,按视图的定义从基本表中将数据查出
- WITH CHECK OPTION
- 要求:
- 子查询可以使任意复杂的 SELECT 语句,但是子查询不允许含有 ORDER BY 子句和 DISTINCT 短语
- 下列三种情况下必须指明组成视图的所有名字
- 某个目标列不是单纯的属性名,而是聚集函数或列表达式
- 多表连接时选出几个同名列作为视图的字段
- 需要在视图中为某个列启用新的更合适的名字
- 必须明确指定组成视图的所有列名情况:
- 的情况 某个目标列不是单纯的属性名,而是聚集函数或列表达式
- 多表连接时选出了几个同名列作为视图的字段
- 需要在视图中为某个列启用新的更适合的名字
- 例子:
- 建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生
CREATE VIEW IS_Student AS SELECT Sno,Sname,Sage FROM Student WHERE Sdept= 'IS' WITH CHECK OPTION;
- 基于多个基表的视图 (建立信息系选修了1号课程的学生视图)
CREATE VIEW IS_S1(Sno,Sname,Grade) AS SELECT Student.Sno,Sname,Grade FROM Student,SC WHERE Student.Sno=SC.Sno AND Sdept= 'IS' AND SC.Cno= '1';
- 分组视图 (将学生的学号及他的平均成绩定义为一个视图假设SC表中“成绩”列Grade为数字型)
CREATE VIEW S_G(Sno,Gavg) AS SELECT Sno,AVG(Grade) FROM SC GROUP BY Sno;
- 基于视图的视图 (建立信息系选修了1号课程且成绩在90分以上的学生的视图)
CREATE VIEW IS_S2 AS SELECT Sno,Sname,Grade FROM IS_S1 WHERE Grade>=90;
- 建立信息系学生的视图,并要求进行修改和插入操作时仍需保证该视图只有信息系的学生
- 例子解析:
- 当对 IS_Student 视图的更新操作:
- 修改操作:在选择条件处自动加上 Sdept= 'IS' 的条件
- 删除操作:在选择条件处自动加上 Sdept= 'IS' 的条件
- 插入操作:在选择条件处自动检查 Sdept 属性值是否为 'IS' (如果不是,则拒绝该插入操作.如果没有提供 Sdept 属性值,则自动定义Sdept为 'IS')
- 当对 IS_Student 视图的更新操作:
删除视图:
- 语法格式:
- DROP VIEW <视图名>[CASCADE];
- 作用:
- 该语句从数据字典中删除指定的视图定义,如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除
- 注意:
- 删除基表时,由该基表导出的所有视图定义都必须显式地使用DROP VIEW语句删除
视图查询:
- 语法格式:
- 用户角度:查询视图与查询基本表相同用SETECT来查询视图
- RDBMS 实现视图查询方法:
- 视图消解法(View Resolution):
- 进行有效性检查
- 转换成等价的对基本表的查询
- 执行修正后的查询
- 视图消解法(View Resolution):
- 视图消解法的局限:
- 有些情况下,视图消解法不能生成正确查询
更新视图:
- 限制:
- 一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应基本表的更新
- 允许对行列子集视图进行更新
- 对其他类型视图的更新不同系统有不同限制
- 若视图是由两个以上基本表导出的,则此视图不允许更新
- 若视图的字段来自字段表达式或常数,则不允许对此视图执行INSERT和UPDATE操作,但是允许执行DELETE操作,
- 若视图的字段来自聚集函数,则此视图不允许更新
- 若视图定义中含有GROUP BY子句,则此视图不允许更新
- 若视图定义中含有DISTINCT,则此视图不允许更新