读书笔记:数据库系统概念

449

一. 关系模型介绍

基本术语:

关系用来指代表,元组用来指代行,属性用来指代列,关系实例指一组特定的行。对于关系的每一个属性,都存在一个允许取值的集合,称为该属性的域。大部分情况下关系中的所有域都应该被设计为原子的,也就是不可再分的。

码:

码分为超码、候选码、主码和外码。超码是一个或多个属性的集合,这些属性的组合可以使我们在一个关系中唯一地标示一个元组。候选码指的是一个任意真子集都不会成为超码的超码。主码代表被数据库设计者选中的、主要用来在一个关系中区分不同元组的候选码。一个关系模式可能在它的属性中包括另一个关系模式的主码,这个属性被成为外码。

数据库模式和数据库实例:

数据库模式是数据库的逻辑设计,一个含有主码和外码依赖的数据库模式可以用模式图来表示;数据库实例是给定时刻数据库中数据的一个快照。

关系查询语言:

查询语言是用户用来从数据库中请求信息的语言,分为过程化语言和非过程化语言。

关系运算:

提供了一组运算,它们以一个或多个关系为输入,返回一个关系作为输出。例如SQL。

二. SQL

SQL语言:

  • 数据定义语言(DDL):提供定义关系模式、删除关系以及修改关系模式的命令。
  • 数据操纵语言(DML):提供从数据库中查询信息,以及在数据库中插入元组、删除元组、修改元组的能力。
  • 完整性:DDL包括定义完整性约束的命令,保存在数据库中的数据必须满足所定义的完整性约束。破坏完整性约束的更新是不允许的。
  • 视图定义:DDL包括视图定义。
  • 事务控制:SQL包括定义事务的开始和结束的命令。
  • 嵌入式SQL和动态SQL:嵌入到通用编程语言。
  • 授权:DDL包括定义对关系和视图的访问权限的命令。

SQL数据的定义:

DDL不仅能够定义一组关系,还能够定义每个关系的信息,包括:

  • 每个关系的模式。
  • 每个属性的取值类型。
  • 完整性约束。
  • 每个关系维护的索引集合。
  • 每个关系的安全性和权限信息。
  • 每个关系在磁盘上的物理存储结构。

基本模式定义 :

create table 定义SQL关系,其支持不同的完整性约束例如:

  • primary key(a,b,c,...):声明主码。
  • foreign key(a,b,...) reference r:声明外码并与关系r的主键关联。
  • not null:表示该属性上不允许出现空值。 insert命令将数据加载到关系中:insert into table_name values(a,b,c);

delete命令可以从关系中删除指定元组:delete from table_name;

drop命令可以从数据库中删除一个关系:drop table table_name;

alter table命令可以增加或者删除关系的属性:alter table table_name add A D;alter table table_name drop A; A为属性名,D为对应的域。

SQL查询的基本结构

单关系查询: 基本结构为select,from,where。查询的输入是在from子句中列出关系,在这些关系上进行where和select子句中指定的运算。select子句支持用distinct强行去重,支持四则运算。where子句允许使用and,or,not逻辑连词。

多关系查询:

  • select子句用于列出查询结果中所需要的属性。
  • from子句是一个查询求值中需要访问的关系列表。
  • where子句是一个作用在from子句中关系的属性上的谓词。

一个简答SQL应用步骤:

  • 为from子句中列出的关系产生笛卡尔积。
  • 在步骤1的结果上应用where子句中指定的谓词。
  • 对于步骤2结果中的每个元组,输出select子句中指定的属性。

自然连接:

两个关系的自然连接条件:1.属性名相同 2.相同属性上的取值相同。 陷阱:多项属性相同,但只需要某一项相同。解决方法:用using指定属性名。

附加的基本运算

更名运算:

使用as可以对关系以及属性重命名。

字符串运算:

用单引号表示字符串。SQL在字符串上一般允许串联(||)、提取子串、计算字符串长度、大小写转换(upper(),lower())、去掉字符串后面的空格(trim(s))。字符串可以使用like来实现模式匹配,使用“%”来匹配任意子串,“_” 来匹配任意一个字符。此外使用escape关键词可以定义转义字符,一般常用(\)。

排序元组的显示次序:

order by 子句可以让查询结果中元组按排列顺序显示,默认使用升序。如果想用升序则添加desc关键词。

where子句谓词:

支持使用between比较运算符来说明一个值是小于或等于某个值,同时大于等于另一个值。

集合运算

SQL作用在关系上的union,intersect,except运算对应于数学集合论中的并,交,差运算。三者查询结果默认去重,如果要保留重复的关系示例,则在这三个关键词后面加上all。

空值

空值NULL给关系运算带来了特殊的问题,故SQL将涉及空值的任何比较运算结果视为unknown。布尔运算的定义被扩展到可以处理unknown值。 and: true and unknown结果为 unknown;false and unknown结果为false。 or:true or unknown 结果为true;false or unknown结果为unknown。 not:not unknown 结果为unknown。