天天看点

中级 SQL

文章目录

    • 3.1 连接表达式
      • 3.1.1 连接条件
      • 3.1.2 外连接
      • 3.1.3 连接类型和条件
    • 3.2 视图
      • 3.2.1 视图定义
      • 3.2.2 物化视图
      • 3.2.3 视图更新
    • 3.3 事务
    • 3.4 完整性约束
      • 3.4.1 not null 约束
      • 3.4.2 unique 约束
      • 3.4.3 check 子句
      • 3.4.4 参照完整性约束

3.1 连接表达式

SQL 提供了自然连接以外的连接运算形式,包括能够指定显示的连接谓词,能够在结果中包含被自然连接排除在外的元组。

3.1.1 连接条件

SQL 支持可以指定任意的连接条件的连接,on 条件允许在参与连接的关系上设置通用的谓词。该谓词的写法与 where 子句谓词类似,只不过使用的是 on,与 using 条件一样,on 条件出现在连接表达式的末尾。形式如下:

select A1, A2, ..., An
from r join s on P;
           

3.1.2 外连接

外连接运算通过在结果中创建包含空值的元组的方式,保留了那些在自然连接中丢失的元组。有三种形式的外连接:

  • 左外连接只保留出现在左外连接运算之前(左边)的关系中的元组。
  • 右外连接只保留出现在右外连接运算之后(右边)的关系中的元组。
  • 全外连接保留出现在两个关系中的元组。

此前的不保留未匹配元组的连接运算被称作内连接运算。

右外连接和左外连接是对称的,全外连接是左外连接与右外连接类型的组合。

on 和 where 在外连接中的表现是不同的,原因是外连接只为那些对相应内连接结果没有贡献的元组补上空值并加入结果。on 条件是外连接声明的一部分,但 where 子句是对谓词中的属性值比较条件逐一进行确认,若不符合则抛弃。

3.1.3 连接类型和条件

SQL 中把常规连接称作内连接。关键词 inner 对应内连接。当 join 子句中没有使用 outer 前缀。默认的连接类型是 inner join。

3.2 视图

SQL 允许通过查询来定义 “虚关系”,它在概念上包含查询的结果。虚关系并不预先计算并存储,而是在使用虚关系的时候才通过执行查询被计算出来。任何像这种不是逻辑模型的一部分,但作为虚关系对用户可见的关系称为视图。

3.2.1 视图定义

SQL 中用 create view 命令定义视图。为了定义视图,必须给视图一个名称,并且必须提供计算视图的查询。形式如下:

create view v as
<query expression>;
           

当视图关系被访问时,其中的元组是通过计算查询结果而被创建出来的。从而,视图关系是爱需要的时候才被创建的。

3.2.2 物化视图

  • 特定数据库系统允许存储视图关系,但是其保证:如果用于定义视图的实际关系改变,视图也跟着修改。这样的视图被称为物化视图。
  • 保持物化视图一直在最新状态的过程称为物化视图维护,或者通常简称视图维护。当构成视图定义的任何关系被更新时,可以马上进行视图维护。

3.2.3 视图更新

一般来说,如果定义视图的查询对下列条件都能满足,称这样的 SQL 视图是可更新的(即视图上可以执行插入、删除或者更新):

  • from 子句中只有一个数据库关系。
  • select 子句中只包含关系的属性名,不包含任何表达式、聚集或 distinct 声明。
  • 任何没有出现在 select 子句中的属性可以取空值;即这些属性上没有 not null 约束,也不构成主码的一部分。
  • 查询中不含有 group by 或 having 子句。

若尝试向视图插入不满足视图所要求的选择条件的元组,这个元组可以被插入到对应关系中,但不会出现在视图中,在默认情况下,SQL 允许执行上述更新。但是可以通过在视图定义的末尾包含 with check option 子句的方式来定义视图。这样如果向视图中插入一条不满足视图的 where 子句条件的元组,数据库系统将拒绝该插入操作。

3.3 事务

事物由查询和更新语句的序列组成。SQL 标准规定当一条 SQL 语句被执行,就隐式地开始了一个事务。下列 SQL 语句之一会结束一个事务:

  • Commit work:提交当前事务,也就是将该事务所做的更新在数据库中持久保存。在事务被提交后,一个新的事务自动开始。
  • Rollback work:回滚当前事务,即撤销该事务中所有 SQL 语句对数据库的更新。这样,数据库就恢复到执行该事务第一条语句之前的状态。
  • 关键词 work 在两条语句中都是可选的。

一个事务或者在完成所有步骤后提交其行为,或者在不能完成其所有动作的情况下回滚其所有动作,通过这种方式数据库提供了对事务具有原子性的抽象。

3.4 完整性约束

完整性约束保证授权用户对数据库所做的修改不会破坏数据的一致性。因此,完整性约束防止的是对数据的意外破坏。

3.4.1 not null 约束

not null 声明禁止在该属性上插入空值。

3.4.2 unique 约束

SQL 支持如下的完整性约束:

unique 声明指出属性 A1, A2, …, An 形成了一个超码,即在关系中没有两个元组能在所有列出的属性上取值相同,然而唯一属性可以为 null ,除非它们被显式的声明为 not null。

3.4.3 check 子句

当应用于关系声明时,check (P) 子句指定一个谓词 P,关系中的每一个元组都必须满足谓词 P。check 子句允许以有力的方式对属性域加以限制。

3.4.4 参照完整性约束

。。。待更

继续阅读