这里写目录标题
第3章 关系数据库标准语言SQL
本章主要是对上篇文章的补充:
MySQL必知必会(刘晓霞 钟鸣)
Structured Query Language:结构化查询语言,是关系数据库的标准语言。
3.1 SQL概述
- 支持SQL的关系数据库管理系统同样支持关系数据库三级模式结构,如图3.1所示,其中,外模式包含若干视图(view)和部分基本表(base table),数据库模式包括若干基本表,内模式包括若干存储文件。
用户可以用SQL对基本表和视图进行查询或其他操作,基本表和视图一样,都是关系。
3.3 数据定义
3.3.1 模式的定义与删除
- 定义模式:
(1)create schema<模式名> authorization<用户名>
如果没有指定<模式名>,那么<模式名>隐含为<用户名>
要创建模式,调用该命令的用户必须拥有数据库管理员权限,或者获得数据库管理员授予的create schema的权限。
(2)定义模式实际上定义了一个命名空间,在这个命名空间中可以进一步定义该模式包含的数据库对象,如:表、视图、索引等。目前,在create schema中可以接受create table、create view和grant子句。
create schema <模式名>authorization<用户名>[<表定义子句>|<视图定义子句>|<授权定义子句>] - 删除模式
drop schema<模式名> <cascade|restrict>:
其中,cascade|restrict两者必选其一,
(1)cascade(级联):表示在删除模式的同时把该模式中所有的数据库对象全部删除
(2)restrict(限制):表示如果该模式中已经定义了下属的数据库对象(表、视图等),则拒绝该删除语句执行。只有当该模式中没有任何下属的对象才执行drop schema语句。
3.3.2 基本表的定义、删除、修改
参考:MySQL必知必会(刘晓霞 钟鸣)第21章 创建和操纵表
- 模式与表
(1)每一个表都属于一个模式,一个模式包含多个基本表,定义基本表时一般可以有三种方法定义它所属的属性。
1)方法1:在表名中明显的给出模式名:create table “S-T”.Student(…)
2)方法2:在创建模式语句中同时创建表,例3.3(P79)
3)方法3:设置所属的模式,这样在创建表时表名中不必给出模式名。
(2)当用户创建表时,若没有指定模式,系统根据所搜路径(search path)来确定该对象所属的模式。
(3)搜索路径包含一组模式列表,关系数据库管理系统会使用模式列表中第一个存在的模式作为数据库对象的模式名。若搜索路径中的模式名不存在,系统将提示所谓。
(4)搜索路径的当前默认值是$user,PUBLIC,表示:首先搜索与用户名想通过的模式名,如果该模式不存在,则使用public模式。
(5)数据库管理员可以自己设置搜索路径,如:set search_path TO “S-T”,public;然后定义基本表:create table student(…) - 删除基本表
drop table <表名>[restrict|cascade];默认为:restrict
restrict|cascade含义同上。
基本表定义一旦被删除,不仅表中的数据和此表的定义将被删除,而且此表上建立的索引,触发器等对象都会被删除。 - 删除基本表后,SQL2011与3个关系数据库管理系统的处理策略比较
上表中:R:restrict;C:cascade;√:表示删除;×:表示不删除;保留:表示删除基本表后,保留依赖对象,但通常都会失效。
3.3.3 索引的建立与删除
- 索引
数据库索引有多种类型,常见索引包括顺序文件上的索引、B+树索引、散列(hash)索引、位图索引等。
(1)顺序文件上的索引是针对按指定属性值升序或降序存储的关系,在该属性上建立一个顺序索引文件,索引文件由属性值和相应的元组指针组成。
(2)B+树索引是将索引属性组织成B+树形式,B+树的叶结点为属性值和相应的元组指针。B+树索引具有动态平衡的优点。
(3)散列索引是建立若干个桶,将索引属性按照其散列函数值映射到相应桶中,桶中存放索引属性值和相应的元组指针。散列索引具有查找速度快的特点。
(4)位图索引是用位向量记录索引属性中可能出现的值,每个位向量对应一个可能值。 - 索引
索引虽然能够加速数据库查询,但需要占用一定的存储空间,当基本表更新时,索引要进行相应的维护,这些都会增加数据库的负担,因此要根据实际情况的需要选择性的建立索引。 - 一般来说,建立和删除索引由数据库管理员或表的属主负责完成。
- 建立索引
create [unique][cluster]index<索引名> on <表名>(<列名>[次序][,<列名>[<次序>]]…)
unique:表示此索引的每一个索引值只对应唯一的数据记录。
cluster:表示要建立的索引是聚簇索引,详见第7章
例如:为Student表按学号升序建唯一索引:
create unique index Stusno on Student(Sno); - 修改索引
alert index <旧索引名>rename to <新索引名> - 删除索引
drop index<索引名>
3.3.4 数据字典
数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有的定义信息包括关系模式定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等。
关系数据库管理系统在执行SQL的数据定义语句时,实际上就是在更新数据字典表中的相应信息。
在进行查询优化和查询处理时,数据字典中的信息是其重要依据
3.4 数据查询
参看:MySQL必知必会(刘晓霞 钟鸣) 第4章-第18章
3.4.1 单表查询
- 选择表中若干列
MySQL必知必会(刘晓霞 钟鸣)第4章 - 选择表中若干元组
(1)消除重复行:MySQL必知必会(刘晓霞 钟鸣) 4.1
(2)查询满足条件的元组:MySQL必知必会(刘晓霞 钟鸣)第6章 - order by
MySQL必知必会(刘晓霞 钟鸣)第5章 - 聚集函数
MySQL必知必会(刘晓霞 钟鸣)第12章 - group by
MySQL必知必会(刘晓霞 钟鸣)第13章
3.4.2 连接查询
3.4.3 嵌套查询
MySQL必知必会(刘晓霞 钟鸣)第14章
如果子查询的查询条件依赖于父查询,这类子查询称为相关子查询,整个查询语句称为相关嵌套查询。
- 带有in谓词的子查询
MySQL必知必会(刘晓霞 钟鸣)7.2
3.4.4 集合查询
3.4.5 基于派生表的查询
子查询不仅可以出现在where子句中,还可以出现在from子句中,这是的子查询生成的临时派生表称为主查询的查询对象。
通过from子句生成派生表时,as关键字可以省略,但必须为派生关系指定一个别名,而对于基本表,别名是可选项。
3.5 数据更新
3.5.1 插入数据
3.5.2 修改及删除数据
修改:MySQL必知必会(刘晓霞 钟鸣)第19章
删除:MySQL必知必会(刘晓霞 钟鸣)第20章
3.6 空值的处理
控制就是“不知道”、“不存在”、“无意义”的值。含有不确定性
- 空值的产生
插入某个行时,没有设置该列对应的值;
外连接产生(见3.4.2);
空值的关系运算。 - 空值的判断
判断一个值是否为空,用is null或is not null表示。 - 空值的约束条件
域定义中有 not null的约束条件的不能为null;
加了unique限制的属性不能为null;
码属性不能为null。 - 空值的算术运算、比较运算和逻辑运算
(1)空值与另一个值(包括空值)的算术运算为空;
(2)空值与另一个值(包括空值)的比较运算为unknown;此时(true和false)的二值逻辑扩展为三值逻辑。
(3)逻辑运算结果如下: