四、SQL
SQL是关系数据库的标准语言,是数据库领域中的一个主流语言
1. SQL简介
1.1 SQL特点
- 综合统一
- DDL,DML,DCL
- 高度非过程
- 用户只需提出“做什么”,而不必指明“怎么做”
- 存取路径的选择以及 SQL 语句的操作过程由系统自动完成。
- 面向集合的操作方式
- 操作对象、查找结果可以是元组的集合
- 一次插入、删除、更新操作的对象可以是元组的集合
- 同一种语法结构提供两种使用方式
- 自含式语言
- 嵌入式语言
- 语言简捷,易学易用
- 3大类,11个命令词
1.2 SQL 3大类11个命令词
SQL功能 | 动词 |
---|---|
数据定义DDL | CREATE DROP ALTER |
数据操纵DML | SELECT INSERT UPDATE DELETE |
数据控制DCL | GRANT REVOKE |
1.3 SQL支持数据库的三级模式结构
1.4 SQL语言的基本概念
用户用SQL语言对 基本表、视图、索引 等进行操作
- 基本表(模式)
- 存储文件(内模式)
- 视图(外模式)
2. SQL数据定义
2.1 SQL数据定义功能
- 定义表(模式)
- 创建表
- 删除表
- 修改表定义
- 定义索引(内模式)
- 创建索引
- 删除索引
- 间接修改索引定义:删除 + 创建
- 定义视图(外模式)
- 创建视图
- 删除视图
- 间接修改视图定义:删除 + 创建
2.2 SQL数据定义语句
2.3 定义、删除与修改基本表
1. 定义基本表
格式:
SQL支持的数据类型
- 第一大类:整数数据
- 第二大类:精确数值数据
- 第三大类:浮点数值数据
- 第四大类:字符串数据
- 第五大类:日期时间数据
2. 修改基本表
格式:
3. 删除基本表
格式:
3. SQL——SELECT
3.1 查询语句格式
3.2 数据查询
3.2.1.单表查询
查询仅涉及一个表,是一种最简单的查询操作
查询语句格式
3.2.2 连接查询
- 同时涉及多个表的查询称为连接查询
- 用来连接两个表的条件称为连接条件或连接谓词
- SQL中连接查询的主要类型
- 交叉连接(广义笛卡尔积)
- 等值连接
- 自身连接
- 一个表于其自己进行连接,称为表的自身连接
- 表示方法:
- 需要给表起别名以示区别
- 由于所有属性名都是同名属性,因此必须使用别名前缀
- 复合条件连接
- WHERE子句中含多个连接条件时,称为复合条件连接
- 复合条件连接的类型
- 两表按多个属性连接
- 自身按多个属性连接
- 多表连接
- 内连接
- 外连接
3.2.3 嵌套查询
- 查询块
- 一个SELECT语句称为一个查询块
- 嵌套查询
- 将一个查询块嵌套在另一个查询块的WHERE子句 或 HAVING短语的条件中的查询称为 嵌套查询
- WHERE condition
- HAVING condition
3.2.4 集合查询
- 标准SQL直接支持的集合操作种类
- 并操作(UNION)
- 一般商用数据库支持的集合操作种类
- 并操作(UNION)
- 交操作(INTERSECT)
- 差操作(MINUS)
4. SQL——数据更新
关系(relations)
三种类型关系
- 表(Table)——基表,存储关系
- 用CREATE TABLE语句创建
- 真实地存在于数据库中
- 数据是持久的
- 视图(Views)——虚拟关系
- 不是物理存在,是虚拟的
- 临时结果(Temporary results)——用于构建子查询的结果
4.1 视图
视图的特点
- 虚表,是从一个或几个基本表(或视图)导出的表
- 只存放视图的定义,不会出现数据冗余
- 基表中的数据发生变化,从视图中查询出的数据也随之改变
4.1.1 基于视图的操作
- 定义视图(DDL)
- 建立
- 定义基于该视图的新试图
- 删除
- 查询视图(DML)
- 更新视图(DML)
定义视图
组成视图的属性列名或 全部省略 或 全部指定
建立视图
常见的视图形式
- 行列子集视图
- WITH CHECK OPTION 的视图
- 基于多个基表的视图
- 基于视图的视图
- 带表达式的视图
- 分组视图
删除视图
查询视图
从用户角度而言,查询视图与查询基本表的方法相同
DBMS实现视图查询的方法
- 试图实体化法
- 视图消解法
更新视图
从用户角度而言,更新视图与更新基本表的方法相同
4.1.2 视图的作用
视图最终是定义在基本表之上的,对视图的一切操作最终也要转换为对基本表的操作
对于非行列子集视图进行查询或更新时还有可能出现问题
合理使用视图能够带来许多好处
- 视图能够简化用户的操作
- 视图使用户能以多种角度看待同一数据
- 视图对重构数据库提供了一定程度的逻辑独立性
- 视图能够对机密数据提供安全保护
4.2 插入数据库
两种插入数据方式
- 插入单个元组
- 插入子查询结果
插入单个元组
完整性校验
DBMS在执行插入语句时会检查所插元组是否破坏表上已定义的完整性规则
- 实体完整性
- 参照完整性
- 用户定义的完整性
- 对于有NOT NULL约束的属性列是否提供了非空值
- 对于有UNIQUE约束的属性列是否提供了非重复值
- 对于有值域约束的属性列所提供的属性值是否在值域范围内
4.3 修改数据
UPDATE语句
完整性校验 (同插入语句)
三种修改方式
- 修改某一个元组的值
- 修改多个元组的值
- 带子查询的修改语句
4.4 删除数据
完整性校验
DBMS在执行删除语句时会检查所删元组是否破坏表上已定义的完整性规则
- 参照完整性
- 不允许删除
- 级联删除
三种删除方式
- 删除某一个元组的值
- 删除多个元组的值
- 带子查询的删除语句
5. 索引
5.1 建立与删除索引
- 建立索引是加快查询速度的有效手段
- 建立索引
- DBMS自动建立
- PRIMARY KEY
- UNIQUE
- DBA或表的属主(即建立表的人)根据需要建立
- DBMS自动建立
- 维护索引
- DBMS自动完成
- 使用索引
- DBMS自动选择是否使用索引以及使用哪些索引
5.1.1 建立索引
5.1.2 删除索引
6. SQL——DCL
6.1 概述
数据控制亦称为数据保护
- 安全性控制
- 完整性控制
- 并发控制
- 恢复
SQL语言的数据控制功能
SQL语言提供了数据控制功能,能够在一定程度上保证数据库中数据的
-
完整性
-
并发控制
-
恢复
-
安全性
6.2 授权
SQL的DCL
不同的用户对不同的数据应具有何种操作权力,是由 DBA和表的建立者(即表的属主)根据具体情况决定的, SQL语言则为 DBA 和表的属主定义与回收这种权力提供了手段
SQL的DCL
- 授权 GRANT
- 回收权力 REVOKE
6.2.1 SQL的授权功能
(1)操作权限
(2)用户的权限
数据库的建立表(CREATRTAB)的权限属于DBA,可由DBA授予普通用户,普通用户拥有此权限后可以建立基本表。
基本表或视图的属主拥有对该表或视图的一切操作权限。
(3)接受权限的用户
- 一个或多个具体用户
- PUBLIC(全体用户)
(4)WITH GRANT OPTION子句
如果指定了 WITH GRANT OPTION 子句,则获得某种权限的用户还可以把这种权限 再授予 别的用户。
如果没有指定 WITH GRANT OPTION 子句,则获得某种权限的用户只能使用该权限,但不能传播该权限
6.3 收回权限
6.4 小结
SQL提供了非常灵活的授权机制:
用户对自己建立的基本表和视图拥有全部的操作权限,并且可以用GRANT语句把其中某些权限授予其他用户。
被授予的用户如果有“继续授权”的许可,还可以把获得的权限再授予其他用户。
DBA拥有对数据库中所有对象的所有权限,并可以根据应用的需要将不同的权限授予不同的用户。
所有授予出去的权力在必要时又都可以用REVOKE语句收回。
7. SQL——嵌入式SQL
SQL语言的两种使用方式
- 在终端交互方式下使用,称为交互式SQL
- 嵌入在高级语言的程序中使用,称为嵌入式SQL
- 高级语言如C、Java等,称为宿主语言
嵌入式SQL的实现方式
嵌入式SQL的使用规定
- 在程序中要区分SQL语句与宿主语言语句
- 允许浅入的SQL语句引用宿主语言的程序变量(称为主变量 或 共享变量)
- SQL的集合处理方式与宿主语言单记录处方式之间的协调
SQL DML的嵌入使用技术
- 不涉及游标的SQL DML语句
- 涉及游标的SQL DML语句
- 卷游标的定义和推进
嵌入式SQL涉及到SQL语句在主语言程序中的使用规定,以解决两种语言的不一致和相互联系的问题。