数据库系统概念笔记
这是在阅读机械工业出版社的《数据库系统概念》一书的一些笔记摘录,
方便以后查看,主要与 SQL 相关。
整理人:谭奇宇
2008-9-25
1 引言
数据库管理系统(DBMS)由一个互相关联的数据的集合和一组用以访问这
些数据的程序组成。这个数据的集合通常称为数据库。
1.1 数据库系统与文件系统
文件系统的主要弊端:
数据冗余和不一致
数据访问困难
数据库系统要解决的问题:
数据孤立
完整性问题
原子性问题
并发访问异常
安全性问题
1.2 数据模型
数据库结构的基础是数据模型。数据模型是一个描述数据、数据联系、数据
语义以及一致性约束的概念工具的集合。下面阐述两种数据模型:实体-联系模
型和关系模型。
1.2.1 实体联系模型
实体-联系(E-R)模型认为现实世界由一组称为实体的基本对象以及这些对
象间的联系构成。实体是现实世界中区别其他对象的一个“事件”或一个“物体”。
数据库中的实体通过属性集合来描述。联系是实体间的相互关系。
1.2.2 关系模型
关系模型(Relation Model)是用表的集合来表示数据和数据间的关系。关系
数据模型是使用最广泛的数据模型。关系模型比 E-R 模型的抽象层次更低。数
据库设计通常基于 E-R 模型来进行,然后再转化成关系模型。
1.2.3 其他数据模型
网状数据模型
层次数据模型
面向对象的数据模型
对象关系数据模型
可扩展标记语言(XML)
1.3 数据库语言
1.3.1 数据定义语言
数据定义语言(DDL)用于定义数据库模式。数据字典包含了元数据。元数
据是关于数据的数据。如表的模式(描述了表的结构)即一个元数据。数据在数
据库中的存储必须满足一致性约束,DDL 提供了指定这种约束的工具。
1.3.2 数据库操纵语言
数据库操纵语言(DML)即描述增、删、查、改等数据库操纵的语言。
1.3.3 来自应用程序的数据库访问
应用程序接口:ODBC 和 JDBC。
扩展宿主语言定义,嵌入 DML 调用,需要借助 DML 预编译器。
1.4 数据库系统结构
1.4.1 存储管理器
权限及完整性管理器
事务管理器
文件管理器
缓冲区管理器
数据文件
数据字典
索引
1.4.2 查询处理器
DDL 解释器
DML 编译器
查询求值引擎
2 基本 SQL 语句
2.1 背景
SQL(Sequel)是一种查询语言,使用了关系代数和关系演算的组合(参考
关系数据库模型)。
SQL 语言由以下几个部分组成:
数据定义语言 DDL:SQL DDL 提供定义关系模式、删除关系以及修改
关系模式的命令。
交互式数据操纵语言 DML:SQL DML 包括基于关系代数和元组关系演
算的查询语言,还包括在数据库中插入、删除、修改元组的命令。
视图定义 View Definition 命令。
事务控制 Transaction Control 命令。
嵌入式 Embeded SQL 和动态 Dynamic SQL。
完整性 Integrity:SQL DDL 包括定义数据库必须满足的完整性约束命令。
权限管理:SQL DDL 中包括说明对关系和视图的访问权的命令。
2.2 基本结构
一个关系数据库包含一个关系的集合,每个关系其实就是一个表,表中的列
即对应关系中的属性,每个属性由一个允许的值得集合,我们称之为域。
SQL 表达式基本结构包括三个子句:select、from 和 where。
select 子句对应关系代数中的投影运算,用来列出查询结果中的属性。
from 子句对应关系代数中的笛卡尔积运算,列出表达式求值中需扫描的
关系。
where 子句对应关系代数中的选择谓词,包括一个作用在 from 子句关系
属性上的谓词。
一个典型的 SQL 查询具有如下形式:
select A1, A2, …, An
from r1, r2, …, rn
where P
其中Ai表示属性,rj表示关系,P表示谓词。SQL先构造from子句中关系的笛
卡尔积,根据where子句中的谓词进行关系代数的选择运算,然后将结果投影到
select子句的属性上。最后的查询结果也是一个关系(表)。
2.2.1 select 子句
普通
select branch_name
from loan
去重
select distinct branch_name
from loan
保留重复
select all branch_name
from loan
由于默认是保留重复的,因此不需要使用 all 关键字。
*表示所有属性
select *
from loan
select 子句允许+、-、*、/四则运算以及某些算术函数。
select amount*100
from loan
2.2.2 where 子句
where 子句使用逻辑运算符 and、or、not。使用表较运算符<、<=、>、>=、
=、 <>。
普通
select loan_number
from loan
where branch_name=’Perryridge’ and amount > 1200
between…and…比较运算符
select loan_number
from loan
where amount between 900 and 1200
2.2.3 from 子句
from 子句本身定义了子句中关系的笛卡尔积。
select customer_name, borrower.loan_number, amount
from loan, borrower
where borrower.loan_number=loan.loan_number
注意,from 子句后面只是跟着一些关系,既可以是数据库中已有的表名,也
可以是运算结果产生的临时关系如 select 语句返回的关系。
select * from (select avg(balance) as average_balance
from account)
2.2.4 更名运算(as)
as 可以出现在 select 子句和 from 子句中用来更改属性和关系的名字。
在 select 子句中更改属性名称
select customer_name, borrower.loan_number as loan_id, amount
from loan, borrower
where borrower.loan_number=loan.loan_number
在 from 子句中更改关系名称
“找出资产至少比位于 Brooklyn 的某一家支行高的支行名”
select distinct T.branch_name
from branch as T, branch as S /*将一个关系变成两个关系便于计算*/
where T.assets > S.assets and S.branch_city=’Brooklyn’
其实现还可以用〉some 运算实现:
select distinct branch_name
from branch
where assets >some (select assets from branch
where branch_city=’Brooklyn’)
更改 select 语句返回的关系的名称和属性名
select branch_name, avg_balance
from (select branch_name, avg(balance)
from account
group by branch_name)
as branch_avg(branch_name, avg_balance)
where avg_balance > 1000
2.2.5 字符串匹配(like)
通配符规则
% 任意子串(0-n 个字符)
_ 任意一个字符
select customer_name
from customer
where customer_street like “%Main%”
2.2.6 排序(order by)
普通用法
select *
from customer
where customer_street like “%Main%”
order by customer_name
指名排序方式
order by 默认使用升序排序。desc 表示降序,asc 表示升序。
select *
from loan
order by amount desc, loan_number asc
2.3 集合运算
SQL 在关系上的 union、intersect 和 except 运算相当于关系代数中的并、交
和差运算。注意与 select 运算不同,union、intersect 和 except 运算会自动去除重
复,即其默认结果实 distinct,而 select 默认结果是 all。
2.3.1 并运算(union)
将 depositor 和 loan 中的 customer_name 合并起来,若有重复只保留一份。
(select customer_name
from depositor)
union
(select customer_name
from loan)
保留重复则加 all,下面的 intersect、except 与此类似。
(select customer_name
from depositor)
union all
(select customer_name
from loan)
2.3.2 交运算(intersect)
取 depositor 和 loan 中都出现的 customer_name,若有重复只保留一份。
(select customer_name
from depositor)
intersect
(select customer_name
from loan)
保留重复值,此时会保留出现次数较少的。
(select customer_name
from depositor)
intersect all
(select customer_name
from loan)