导图社区 关系数据库标准语言SQL
本思维导图基于《数据库系统概论》第五版第三章关系数据库标准语言SQL的内容总结,可便于大家复习学习使用。
编辑于2021-12-02 13:40:33关系数据库标准语言SQL
SQL概述
SQL的产生和发展
SQL2008 3777页 2008年
目前没有一个数据库管理系统能够支持SQL标准的所有概念和特性
有人把确立SQL为关系数据库语言标准及其后的发展称为是一场革命
SQL的特点
1. 综合统一
2. 高度非过程化
3. 面向集合的操作方式
4. 以同一种语法结构提供多种使用方式
5. 语言简洁易学易用
核心功能只用了九个动词
SQL的基本概念
SQL集数据的查询、操纵、定义、控制功能于一体
基本表
本身独立存在的表,一个关系对应一个表
可以带有多个索引,对应多个存储文件
存储文件
物理结构对用户透明
视图
虚表,只存放视图定义而不存放视图数据,视图之上还可以定义视图
数据定义
SQL数据定义语句
层次结构
早期数据库系统中,所有的数据库对象都属于一个数据库,也就是只有一个命名空间。
现代的关系数据库管理系统提供了一个层次化的数据库对象命名机制
一个关系数据库管理系统的实例种可以建立多个数据库
一个数据库种可以建立多个模式
一个模式下通常包括多个表、视图和索引等数据库对象
模式的定义与删除
定义
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]
慎删基本表
数据类型
在SQL中域的概念用数据类型来实现
不同的关系数据库管理系统支持的数据类型不完全相同
选用数据类型
数据取值范围
数据需要做的运算
索引的建立与删除
建立索引事加快查询速度的有效手段
索引事关系数据库管理系统的内部实现技术,属于内模式的范畴
索引维护由关系数据库管理系统自动完成,关系数据库管理系统自动选择合适的索引作为存取路径,用户不必也不能显式地选择索引
建立索引
数据库管理员或表的属主建立
CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…);
修改索引
ALTER INDEX <旧索引名> RENAME TO <新索引名>
删除索引
DROP INDEX <索引名>;
删除索引时,系统会同时从数据字典中上去有关该索引的描述
数据字典
数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有定义信息
关系数据库管理系统在执行SQL的数据定义语句时,实际上就是在更新数据字典表中的相应信息
数据查询
SELECT语句的一般格式
SELECT [ALL|DISTINCT] <目标列表达式> [别名] [ ,<目标列表达式> [别名]] … FROM <表名或视图名> [别名] [ ,<表名或视图名> [别名]] … |(<SELECT语句>)[AS]<别名> [WHERE <条件表达式>] [GROUP BY <列名1>[HAVING<条件表达式>]] [ORDER BY <列名2> [ASC|DESC]];
SELECT子句:指定要显示的属性列
FROM子句:指定查询对象(基本表或视图)
WHERE子句:指定查询条件
GROUP BY子句:对查询结果按指定列的值分组,该属性列值相等的元组为一个组。通常会在每组中作用聚集函数。
HAVING短语:只有满足指定条件的组才予以输出
ORDER BY子句:对查询结果表按指定列值的升序或降序排序
目标列表达式
*
<表名>.*
COUNT([DISTINCT|ALL]* )
[<表名>.]<属性列名表达式>[,<表名>.]<属性列名表达式>]…
聚集函数的一般格式
COUNT
SUM
AVG
MAX/MIN
[DISTINCT|ALL]列名
WHERE子句的条件表达式可选条件
单表查询
选择表中若干列
投影运算
查询指定列
查询全部列
查询经过计算的值
选择表中若干元组
取消取值重复的行
DISTINCT
查询满足条件的元组
比较大小
=, >, <, >=, <=, !=, <>, !>, !<; NOT+上述比较运算符
确定范围
BETWEEN AND、NOT BETWEEN AND
确定集合
IN、NOT IN
字符匹配
LIKE、NOT LIKE
通配符%
代表任意长度的字符串
通配符_
代表任意单个字符
涉及空值的查询
IS NULL、IS NOT NULL
多重条件查询
AND、OR、NOT
ORDER BY子句
空值时显示的次序由具体的实现系统决定
升序ASC,降序DESC
聚集函数
COUNT,SUM,AVG,MAX,MIN
当聚集函数遇到空值时,除COUNT(*)外,都跳过空值而处理非空值
聚集函数只能用于SELECT子句和GROUP BY中的HAVING子句
GROUP BY子句
将查询结果按某一列或者多列的值分组,值相等的为一组
与WHERE的区别
作用对象不同
WHERE子句作用于基表或视图,从中选择满足条件的元组
HAVING短语作用于组,从中选择满足条件的组
连接查询
一个查询同时涉及两个以上的表,是关系数据库中最主要的查询
等值与非等值连接查询
连接查询的WHRER子句用来连接两个表的条件称为连接条件或连接谓词, 一般格式:[<表名1>.]<列名1><比较运算符>[<表名2>.]<列名2>
连接谓词中的列名称为连接字段,各连接字段的类型必须是可比的
等值连接的执行过程
嵌套循环法
排序合并法
索引连接
把目标列中重复的属性列去掉则为自然连接
自身连接
一个表与自己的连接,称为表的自身连接
需要给表起别名以示区别,同样,必须使用别名前缀
外连接
外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出
左外连接FROM子句示例:FROM Atable LEFT OUT JOIN Btable ON (Atable.Sno=Btable.Sno);
嵌套查询
一个SELECT-FROM-WHERE语句称为一个查询块,将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询
以层层嵌套的方式来构造程序正是SQL中“结构化”的含义所在
嵌套查询子查询不支持ORDER BY子句
嵌套查询
带有IN谓词的子查询
带有比较运算符的子查询
带有ANY(SOME)或ALL谓词的子查询
带有EXISTS谓词的子查询
不返回任何数据,只产生逻辑真值或逻辑假值
内层查询结果非空,则返回真值
子查询
相关子查询
子查询的查询条件依赖于父查询
查询过程
首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表
然后再取外层表的下一个元组
重复这一过程,直至外层表全部检查完为止
不相关子查询
子查询的查询条件不依赖于父查询
由里向外逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件
集合查询
集合操作主要包括并操作(UNION),交操作(INTERSECT)和差操作(EXCEPT)
参加集合操作的各查询结果的列数必须相同,对应项的数据类型也必须相同
基于派生表的查询
子查询不仅可以出现在WHERE子句中,还可以出现在FROM子句中,这时子查询生成的临时派生表成为主查询的查询对象
通过FROM子句生成派生表时,AS关键字可以省略,但必须为派生关系生成一个别名
如果子查询中没有聚集函数,派生表可以不指定属性列,子查询SELECT子句后面的列名为其缺省属性
数据更新
插入数据
通常有两种形式,一种是插入一个元组,另一种是插入子查询结果
插入元组
INSERT INTO <表名> [(<属性列1>[,<属性列2 >…)] VALUES (<常量1> [,<常量2>]… );
INTO子句中没有出现的属性列,新元组在这些列上取空值
如果INTO子句种没有指明任何属性列值,则插入的元组必须在每个属性列上均有值
插入子查询结果
INSERT INTO <表名> [(<属性列1> [,<属性列2>… )] 子查询;
关系数据库管理系统在执行插入语句时会检查所插元组是否破坏表上已定义的完整性规则
修改数据
UPDATE <表名> SET <列名>=<表达式>[,<列名>=<表达式>]… [WHERE <条件>];
修改某一个元组的值
修改多个元组的值
带子查询的修改
具体操作
关系数据库管理系统在执行修改语句时会检查所插元组是否破坏表上已定义的完整性规则
删除数据
DELETE FROM <表名> [WHERE <条件>];
DELETE语句删除的是表中的数据,而不是关于表的定义
删除某一个元组的值
删除多个元组的值
带子查询的删除语句
具体操作
空值的处理
概念
空值就是“不知道”或“不存在”或“无意义”的值
空值是一个很特殊的值,含有不确定性
存在情况
属性应该有一个值,但目前不知道它的具体值
该属性不应该有值
由于某种原因不便于填写
判断一个属性的值是否为空用IS NULL或IS NOT NULL
空值约束条件
属性定义种有NOT NULL的约束条件的不能取空值
加了UNIQUE限制的属性不能取空值
码属性不能取空值
空值运算
算术运算结果
空值
比较运算结果
UNKNOWN
逻辑运算结果
三值逻辑
视图
视图是导出表,是虚表。数据库中只存放相关定义,不存放对应数据(数据仍然在基本表中存储)
定义视图
建立视图
CREATE VIEW <视图名> [(<列名> [,<列名>]…)] AS <子查询> [WITH CHECK OPTION];
WITH CHECK OPTION
对视图进行增删改操作时满足视图定义中的谓词条件(即子查询中的条件表达式)
组成视图的属性列名必须全部指定或全部省略
必须全部指定的情况
某个目标列是聚集函数或列表达式
原本没名字
多表连接时选出了几个同名列作为视图的字段
名字重了
需要在视图中为某个列启用新的更合适的名字
名字不合适
视图可以建立在一个或多个基本表上,或一个或多个视图上,或基本表与视图上
带虚拟列的视图也称为带表达式的视图
虚拟列指由基本表推出但不在基本表中存储的属性列
行列子集视图
从单个基本表导出,只去掉了某些行和列但保留主码的视图
分组视图
带聚集函数和GROUP BY子句的查询定义的视图
删除视图
DROP VIEW <视图名>[CASCADE];
CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除
删除基表时,由该基表导出的所有视图定义都必须显式地使用DROP VIEW语句删除
查询视图
用户查询视图与查询基本表相同
数据库实现视图查询方法
视图消解法
进行有效性检查
转换成等价的对基本表的查询
执行修正后的查询
有缺陷,对非行列子集视图的查询不一定能做转换。此时建议直接对基本表进行查询
更新视图
通过视图来对基本表进行增删改操作
一些视图是不可更新的,因为对这些视图的更新不能唯一地有意义地转换成对相应基本表的更新
一般地,行列子集视图是可以更新的,其它的视图不同的系统有不同的限制
视图的作用
1. 视图能够简化用户的操作
2. 视图使用户能以多种角度看待同一数据
3. 视图对重构数据库提供了一定程度的逻辑独立性
4. 视图能够对机密数据提供安全保护
5. 适当的利用视图可以更清晰的表达查询