数据库理论 03 intermediateSQL——基于《数据库系统概念》第七版

本文深入探讨了SQL中的连接操作、视图、事务处理及完整性约束等内容。介绍了不同类型的连接及其应用场景,视图的定义与使用,事务的概念及ACID特性,并详细解析了各种完整性约束的作用与实现。

连接表达式

Join以两个关系输入,结果返回
得到笛卡尔积
通常在from子句中使用

select * from 
course natural join prereq

select * from
course join prereq using(course_id);

两个句子等价,因为结果没有重复属性

join… on

select * from
course c join prereq p on c.course_id = p.course_id

select *
from course c, prereq p
where  c.course_id = p.course_id

也是等价的

on的优点

  1. SQL语句简洁易懂
  2. on条件子句在外连接与where子句有区别

外连接

外连接(Outer Join)是一种扩展的连接操作,可以
避免连接操作结果信息的丢失

先执行连接操作,然后将两个关系中不匹配的元组都加入到最后的结果关系中,并使用null作为属性值补全

连接操作默认为内连接 Inner Join

左外连接

select * from course natural left outer join prereq;

在这里插入图片描述

右外连接

select * from course natural right outer join prereq;

在这里插入图片描述
全外连接

select * from course natural full outer join prereq;

在这里插入图片描述

概念

  1. 连接操作:以两个关系为输入,将另一个关系作为结果返
  2. 连接类型(Join types)-决定了如何处理连接条件(属性)不匹配的元组
  3. 连接条件(Join Conditions)-决定了两个关系中哪些属性相匹配,以及连接结果中是否出现重复属性

需要注意:
natural 会把名字相同的列“融合”在一起,而join … on不会

视图

在某些情况下,让所有用户看到数据库的整个逻辑模型(存储
于数据库的所有关系模式)是不合适的

比如不应该让学生知道老师的工资

select ID, name, dept_name
from instructor;

视图:向用户隐藏特定数据

任何像这种不是逻辑模型的一部分,但作为“虚关系”对用户可见的关系称为视图

定义

create view

create view v [(<列名1>, <列名2>,)]
as <查询表达式>
[with check option];

有别于with子句

<查询表达式> 为SQL表达式
v表示视图名字

视图的定义 有别于 通过查询表达式创建一个新关系

视图导致表达式被吃醋呢,使用这个视图查询过程的表达式会被带入使用
create view faculty as
select  ID, name, dept_name
from instructor;

# 使用视图
select name from faculty # 视图
where dept_name = 'biology';

create view departments_total_salary (dept_name, total_salary) as
select dept_name, sum (salary)
from instructor
group by dept_name;

还可以利用视图创造视图

  1. 视图v2用于v1定义中,称v1直接依赖v2
  2. v1直接依赖v2或v1到v2由依赖路径,称v1依赖v2
  3. 若v依赖自己,称v是递归的

视图展开

View expansion 视图用其他视图定义

若v1由表达式e1定义且e1可能包含其他视图关系,视图展开可以用如下命令

repeat 
	找出e1任意关系视图vi
	定义视图vi的表达式替换视图vi
until e1不存在视图关系

使用这个命令的前提是视图不是递归的

物化视图

创建一个物理表(关系),表中包含视图定义的查询结果中的所有元组

特定数据库系统允许视图关系被存储,并保证用于定义视图的实际关系改变,视图也跟着修改,这样的视图被称为物化视图

定义视图的实际关系改变,物化视图会outdated,所以需要实时更新

  1. 保持物化视图一直在最新状态的过程称为物化视图维护,也称视图维护
  2. 及时的视图维护 / 延迟的视图维护 / 周期性的视图维护
  3. 增量的视图维护

更新视图

新增

nsert into faculty 
values (30765, ’Green’, ’Music’);

一般不允许对视图关系更新

更新需要满足以下条件

  1. from 子句只有一个关系
  2. select 只包含属性名,不包含表达式、聚集函数、distinct
  3. 未出现在select子句的属性可以取null
  4. 不包含group by和having子句

可在视图定义加入with check option子句,用于拒绝不满足视图的where子句条件的元组更新、插入

 create view history_instructors as
select *
from instructor
where dept_name= ’History’
with check option;
# 检查视图更新SQL语句是否满足视图定义的where语句

这样更新语句

update history_instructors set salary = 80000
where ID = '25566'
# 转换为
update instructors set salary = 80000
where ID = '25566' and dept_name = 'history'
create view history_instructors as
select *
from instructor
where dept_name= ’History’
with check option;


insert into history_instructors (ID, name, salary) 
values (69987, ’White’, 80000);
# 转换为
insert into instructors (ID, name, salary, dept_name) 
values (69987, ’White’,80000, ‘History’);

事务

Transaction 是查询 “和” “或”更新语句的序列组成
commit或者rollback结束一个事务

  1. commit 提交当前事务,持久保持事务更新
  2. rollback 回滚当前事务,撤销更新

事务的ACID

  1. 原子性
  2. 一致性
  3. 隔离性
  4. 持久性

每个SQL语句默认一个事务
多个sql也可构成一个事务

begin atomic ... end

语句,但只有少数SQL数据库支持

完整性约束

防止的是对数据的意外破坏,它保证授权用户对数据库所做的修改不会破坏数据的一致性

比如:
支票账户存款大于1w
客户电话号码不能为空

已有表加约束

alter table table_name add <constraint>

create table的完整性约束

  1. not null
  2. primary key
  3. unique
  4. foreign key
  5. check (<谓词>)

实体完整性约束: 每个元素可识别且唯一
参照完整性约束: 多个实体关系之间的关联关系
用户自定义完整性约束(域完整性或 语义完整性):关系中属性取值范围,避免属性值与应用语义矛盾

not null
声明非空

unique(A1,A2,……,An)

  1. 指出这个元组行成超码
  2. 候选码允许为null (有别于primary key
  3. 重复元组存在性测试unique结构

check 子句

check(P)关系中每个元组必须满足谓词P
P 可以是包括子查询在内的任意谓词,但实现开销较大
如确保semester时四季之一

create table a
(
semester verchar(6),
primary key(semester),
check(semester in ('FALL', 'WINTER', 'SPRING', 'SUMMER'))
)

参照完整性

Recall参照完整性:保证在一个关系中给定属性集上的取值也在另一关系的特定属性集的取值中出现

比如instructor里面有‘biology’,department一定会存在有关‘biology’的元素

详细定义:
关系r1,r2r_1, r_2r1,r2属性集为R1,R2R_1,R_2R1,R2,有K1⊆R1,K2⊆R2K_1 \sube R_1, K_2 \sube R_2K1R1,K2R2
∀t2∈r2,  ∃t1∈r1,有t1.K1=t2.K2\forall t_2 \in r_2,\ \ \exists t_1 \in r_1, 有t_1.K_1 = t_2.K_2t2r2,  t1r1t1.K1=t2.K2
我们称r2中K2属性集参照r1中的K1属性集

上述要求称为参照完整性约束or子集依赖

K1如果是r1的主码,K2时参照关系r1中K1的外码

级联操作

 create table course (
…
dept_name varchar(20),
foreign key (dept_name) references department
on delete cascade
on update cascade,)

意思为:department删除元组,即删除course中参照被删除系的元组

若把cascadeset null,set default
表示department删除元组,九八course参照被删除系设为null或默认值

如何不违反完整性约束插入元组?

  1. 配偶信息设置为null
  2. 插入配偶元组后再更新
  3. (注意配偶信息不能设置为not null)

法二:
推迟完整性约束检查事务结束时进行

  1. 约束声明后加入initially deferred
  2. 或者对约束条件加入set constrants <>

复杂check条件与断言

check(P)的我i此P可以作为子查询
检测在关系section中每个元组的time_slot_id的确是在time_slot关系中某个时间段的标识

(
	time_slot_id in
	(
		select time_slot_id
		from time_slot
	)
)

不用foreign key的原因是time_slot_id不是time_slot关系的主码

修改section关系和time_slot关系任意元组都须检测check子句是否满足,因此,开销较大。
大多数DBMS不支持check子句嵌套子查询,一般可以使用触发器保证完整性约束

断言
一个为此,属性与约束和参照完整性约束时断言的特殊形式

create assertion <assertion_name> check <predicate>;

student在tot_cred的取值必须等于其选修完毕的课程学分总和

create assertion credits_earned_constraint check
(
	not exists (
		select ID from student
		where tot_cred 
		<>
		(
			select sum(credits)
			from takes natural join course
			where student.ID = takes.ID
			and grade is not null 
			and grade <> ‘F’
		)
	)
);

SQL的数据类型与模式

  1. date 日历日期,年月日 如 date’1999-01-01’
  2. time 如 time ‘09:11:11’ time(2)‘09:09:09.30’
  3. timestamp date和time的结合
  4. interval 一段时间

支持算术运算
date,time, timestamp相减同类值获得interval值

type translation

cast(e as t)把表达式e转换为类型t

select cast(ID as numeric(5)) as inst_id 
from instructor
order by inst_id;

不输出空值
可以使用coalesce()避免输出空值,他接受任意数量参数(参数需要同类型)返回第一个非空参数

select ID, coalesce(salary, 0) as salary
from instructor;

默认值
create table的时候在变量后面加上
default 0 表示默认值为0

创建索引
索引是一种数据结构(如B+树)

它允许数据库系统高效地找到关系中那些在索引属性上取给定值的元组

example

create index studentID_index on student(ID);

后续使用where ID = '111’就不需要读取关系所有元组,直接找ID‘111’的记录

大对象类型
照片视频储存为large object

  1. blob 二进制大对象
  2. clob 字符大对象

返回大对象的时候 通常返回一个定位器(可理解为HANDLE)

➢ 优势与劣势:
✓无需为大对象数据类型指定长度,使用方便;
✓一般需与主表分表存储;影响数据库性能;谨慎使用

自定义类型
create type

create type dollars as numeric(12,2) final;
# final 无 实际意义

create table department
( dept_name varchar (20),
building varchar (15),
budget Dollars );

类似typedef
强制类型转换cast (department.budget as numeric(12,2) );

域和属性域
create domain

create domain person_name char(2) not null;

域可以有约束 or 默认值
如not null
domain上可以用check约束

create domain degree_level varchar(10)
constraint degree_level_test
check
(
	value in ('bachelors', 'masters', 'doctorate')
);

domain不是强类型,基本类型相容的域类型值可以被赋予另一个域类型

拓展create table
拓展某个表模式相同表

create table temp_instructor like instructor;

模式、目录、环境

目录: 用户或应用,一个管理员可以有多个数据库模式一个数据库有多个关系模式、视图

SQL标准未提供目录操作,但有对模式操作

create schema
drop schema

L环境包括目录、模式和用户标识(授权标识符),用户提交的SQL语句在该环境中运行

授权

数据库用户在数据上权限形式

  1. select 读取但不能修改
  2. insert 可插入但不可修改
  3. update 可更新不能删除
  4. delete 可以删除

修改数据库模式权限

  1. index - 创建删除索引
  2. resources 创建新关系
  3. alteration 添加or删除关系属性
  4. drop 删除关系

授权规范

grant

grant <权限列表>
on <关系名 or 视图名>
to <用户/角色列表>
[with grant option];

用户角色范围

  1. ID
  2. public, 当前和将来所有有效用户
  3. 角色

对视图授权不带表对视图相关的实际关系授权
权限授予人本身要有制定项目权限

权限列表

  1. select: 允许读取关系,或者使用视图完成查询的权限
  2. insert: 插入元组的权限,可指定属性列
  3. update: 使用SQL update语句更新的权限,可指定属性列
  4. delete: 删除元组的权限
  5. all: 允许所有权限
grant insert (ID) on instructor to U4 
with grant option# 允许用户U4可以将在instructor关系ID属性上的insert权限授予其他用户

用户具有权限的充分必要条件是:当且仅当存在从授权图的根(即代表数据库管理员的顶点)到代表该用户顶点的路径

回收权限

revoke <权限列表>
on <关系名或视图名> from <用户/角色列表>
[ restrict | cascade ];

  1. <权限列表> 可能是all,收回被收回用户所持有的所有权限
  2. <用户列表> 是public, (除了那些隐含授权的用户)其他用户的权限将都被收回
  3. 默认级联收回权限(cascade),restrict可用于避免一些不合适的权限级联收回

示例:

revoke update (budget) on department from U1, U2, U3;

revoke grant option for select on department from U1, U2, U3;
  1. 如果某些权限被不同的授权者授予同一个用户两次,那么在一次权限回收后该用户可能仍保有这个权限
  2. 一个权限被回收后,基于这一权限的其他权限(如视图)也将被回收

角色授权

• 权限可以被授予给角色:
– grant select on takes to instructor;
• 角色可以被授予给用户,同时也可以被授予给其他角色

– grant instructor to Amit ;
– create role teaching_assistant ;
grant teaching_assistant to instructor;


Instructor 具有teaching_assistant 的所有权限
• 角色链

– create role dean;
grant instructor to dean;
grant dean to Satoshi;

• SQL允许权限由一个角色授予(p86)
– [granted by current_role]

view授权

➢ 大学地理系工作人员的视图授权示例

create view geo_instructor as
( select *
from instructor
where dept_name = ’Geology’);

grant select on geo_instructor to geo_staff ;
➢ 一个geo_staff 成员的查询操作可以写为:

select *
from geo_instructor ;

模式授权

SQL标准为数据库模式指定了一种基本的授权机制:只有模式的拥有者才能够执行对模式的任何修改

➢ SQL提供了references权限,允许用户在创建关系时声明外码

grant references (dept_name) on department 
to Mariano;

小结

➢ 什么是内连接、外连接、全连接?
➢ 什么是视图?如何定义视图关系?
➢ 什么是事务?事务的特性有哪些?
➢ 什么是完整性约束?参照完整性约束?外码约束?
➢ SQL提供时间日期类型和用户自定义类型
➢ 如何对数据库、视图进行授权?什么是权限的转移?

目 录 译者序 第7版序言 第一部分 基础知识 第1章 数据库管理概述 1 1.1 引言 1 1.2 什么是数据库系统 3 1.3 什么是数据库 6 1.4 为什么用数据库 10 1.5 数据独立性 12 1.6 关系系统及其他 15 1.7 小结 17 练习 17 参考文献和简介 19 部分练习答案 19 第2章 数据库系统体系结构 22 2.1 引言 22 2.2 三级体系结构 22 2.3 外模式 24 2.4 概念模式 26 2.5 内模式 26 2.6 映象 27 2.7 数据库管理员 27 2.8 数据库管理系统 28 2.9 数据通信管理器 31 2.10 客户/服务器体系结构 31 2.11 工具 33 2.12 分布式处理 33 2.13 小结 35 练习 35 参考文献和简介 36 第3章 关系数据库介绍 38 3.1 引言 38 3.2 关系模型概述 38 3.3 关系和关系变量 41 3.4 关系的含义 42 3.5 优化 44 3.6 数据字典 45 3.7 基本关系变量和视图 46 3.8 事务 49 3.9 供应商和零件数据库 49 3.10 小结 51 练习 52 参考文献和简介 53 部分练习答案 54 第4章 SQL概述 55 4.1 引言 55 4.2 综述 56 4.3 目录 58 4.4 视图 59 4.5 事务 59 4.6 嵌入式SQL 59 4.7 SQL是不完美的 66 4.8 小结 66 练习 67 参考文献和简介 68 部分练习答案 73 第二部分 关系数据模型 第5章 域、关系和基本关系变量 77 5.1 引言 77 5.2 域 79 5.3 关系值 86 5.4 关系变量 90 5.5 SQL的支持 93 5.6 小结 96 练习 97 参考文献和简介 98 部分练习答案 101 第6章 关系代数 106 6.1 引言 106 6.2 关系封闭性 107 6.3 语法 109 6.4 语义 110 6.5 举例 117 6.6 关系代数的作用 119 6.7 附加的操作符 120 6.8 分组与分组还原 125 6.9 关系比较 127 6.10 小结 128 练习 129 参考文献和简介 131 部分练习答案 133 第7章 关系演算 140 7.1 引言 140 7.2 元组演算 141 7.3 举例 147 7.4 关系演算与关系代数的比较 149 7.5 计算能力 152 7.6 域演算 153 7.7 SQL语言 155 7.8 小结 162 练习 163 参考文献和简介 165 部分练习答案 167 第8章 完整性 179 8.1 引言 179 8.2 类型约束 180 8.3 属性约束 181 8.4 关系变量约束 182 8.5 数据库约束 182 8.6 黄金法则 183 8.7 静态约束和动态约束 184 8.8 码 185 8.9 SQL对完整性的支持 191 8.10 小结 194 练习 194 参考文献和简介 196 部分练习答案 201 第9章 视图 209 9.1 引言 209 9.2 视图的用途 211 9.3 视图检索 213 9.4 视图更新 214 9.5 快照 225 9.6 SQL对视图的支持 226 9.7 小结 227 练习 228 参考文献和简介 229 部分练习答案 232 第三部分 数据库设计 第10章 函数依赖 238 10.1 引言 238 10.2 基本概念 239 10.3 平凡的函数依赖和非平凡的函数 依赖 241 10.4 依赖集的闭包 241 10.5 属性集的闭包 242 10.6 最小函数依赖集 244 10.7 小结 245 练习 246 参考文献和简介 247 部分练习答案 249 第11章 进一步规范化Ⅰ:1NF、2NF、 3NF和BCNF 252 11.1 引言 252 11.2 无损分解和函数依赖 254 11.3 第一、第二和第三范式 257 11.4 保持函数依赖 262 11.5 BOYCE/CODD范式 264 11.6 具有关系值属性的关系变量 268 11.7 小结 270 练习 270 参考文献和简介 272 部分练习答案 274 第12章 进一步规范化Ⅱ:高级范式 282 12.1 引言 282 12.2 多值依赖与第四范式 282 12.3 连接依赖与第五范式 285 12.4 规范化过程小结 289 12.5 逆规范化 291 12.6 正交设计 292 12.7 其他的规范化形式 295 12.8 小结 296 练习 296 参考文献和简介 297 部分练习答案 302 第13章 语义建模 306 13.1 引言 306 13.2 总体方法 307 13.3 E/R模型 309 13.4 E/R图 312 13.5 基于E/R模型的数据库设计 313 13.6 简单分析 317 13.7 小结 319 练习 320 参考文献和简介 321 第四部分 事务管理 第14章 恢复 333 14.1 引言 333 14.2 事务 334 14.3 事务恢复 335 14.4 系统恢复 337 14.5 介质恢复 338 14.6 两阶段提交 338 14.7 SQL对事务的支持 339 14.8 小结 340 练习 341 参考文献和简介 341 部分练习答案 345 第15章 并发 347 15.1 引言 347 15.2 三个并发问题 347 15.3 锁 349 15.4 重提三个并发问题 350 15.5 死锁 352 15.6 可串行性 353 15.7 隔离级别 354 15.8 意向锁 355 15.9 SQL的支持 357 15.10 小结 358 练习 359 参考文献和简介 360 部分练习答案 365 第五部分 高级专题 第16章 安全性 369 16.1 引言 369 16.2 自主存取控制 371 16.3 强制存取控制 375 16.4 统计数据库 377 16.5 数据加密 381 16.6 SQL的支持 384 16.7 小结 386 练习 387 参考文献和简介 388 部分练习答案 390 第17章 优化 394 17.1 引言 394 17.2 一个启发性的例子 395 17.3 查询处理概述 396 17.4 表达式变换 399 17.5 数据库统计信息 403 17.6 分而治之的策略 404 17.7 关系操作的实现算法 406 17.8 小结 410 练习 411 参考文献和简介 413 部分练习答案 430 第18章 信息空缺 432 18.1 引言 432 18.2 3VL方法概述 433 18.3 上述方案所造成的某些结果 437 18.4 空值和码 440 18.5 外连接 442 18.6 特殊值 444 18.7 SQL的支持 444 18.8 小结 447 练习 448 参考文献和简介 449 部分练习答案 452 第19章 类型继承 454 19.1 引言 454 19.2 类型的层次结构 457 19.3 多态性和可置换性 459 19.4 变量与赋值 462 19.5 约束特化 465 19.6 比较 467 19.7 操作、版本和签名 470 19.8 一个圆是一个椭圆吗 473 19.9 约束特化—再次讨论 476 19.10 小结 478 练习 479 参考文献和简介 480 部分练习答案 481 第20章 分布式数据库 484 20.1 引言 484 20.2 一些预备知识 484 20.3 十二个目标 487 20.4 分布式系统面对的问题 493 20.5 客户/服务器系统 502 20.6 DBMS独立性 504 20.7 SQL的支持 508 20.8 小结 509 练习 509 参考文献和简介 510 第21章 决策支持 518 21.1 引言 518 21.2 决策支持的特征 519 21.3 决策支持的数据库设计 520 21.4 数据准备 525 21.5 数据仓库和数据集市 527 21.6 联机分析处理 530 21.7 数据挖掘 535 21.8 小结 536 练习 537 参考文献和简介 538 部分练习答案 540 第22章 时态数据库 541 22.1 引言 541 22.2 时态数据 542 22.3 问题是什么 544 22.4 时间间隔 548 22.5 间隔类型 549 22.6 间隔上的标量操作符 551 22.7 间隔上的聚集操作符 551 22.8 与间隔有关的关系操作符 552 22.9 间隔上的约束 557 22.10 间隔上的更新操作符 559 22.11 关于数据库设计 560 22.12 小结 562 练习 563 参考文献和简介 563 部分练习答案 565 第23章 基于逻辑的数据库 567 23.1 引言 567 23.2 综述 567 23.3 命题演算 569 23.4 谓词演算 572 23.5 数据库的证明理论观点 577 23.6 演绎数据库系统 580 23.7 递归查询过程 583 23.8 小结 588 练习 589 参考文献和简介 590 部分练习答案 596 第六部分 对象和对象/关系数据库 第24章 对象数据库 599 24.1 引言 599 24.2 对象、类、方法和消息 602 24.3 进一步的分析 605 24.4 一个详实的例子 611 24.5 混合性问题 618 24.6 小结 624 练习 626 参考文献和简介 627 部分练习答案 634 第25章 对象/关系数据库 637 25.1 引言 637 25.2 第一个根本性错误 639 25.3 第二个根本性错误 644 25.4 实现上的问题 645 25.5 真正融合的好处 647 25.6 小结 648 参考文献和简介 649 附 录 附录A SQL表达式 657 附录B SQL3概览 666 附录C 缩略语和符号 678
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值