《数据库系统概念》学习笔记

书上的例子以及练习题都是用 Mysql 实现的,操作系统使用的 macOS。在使用 Mysql 遇到问题时,推荐查看官方文档 Mysql Reference Manual。

第一章 引言

第一章就是综述整本书要讲的知识点,让读者对数据库系统有个大体的了解。我只记了一些比较重要的知识点,其他很多知识在后面章节会有更详细的讲解。

数据视图

数据抽象

物理层(pysical level) - 逻辑层(logical level)(程序设计人员)- 视图层(view level)(数据库用户)

实例和模式

物理模式(pysical schema)(物理层)- 逻辑模式(logical schema)(逻辑层)- 子模式(subschema)(视图层)
因为程序员使用逻辑模式来构造数据库应用程序,从其对应用程序的效果来看,逻辑模式是目前最重要的一种模式。
如果应用程序不依赖物理模式,那么它们就被称为是具有物理数据独立性(pysical data independence)。

数据模型

数据模型(data model)分为四类:关系模型(relational model),实体-联系模型(entity-relationshop model),基于对象的数据模型(object-based data model),半结构化数据模型(semistructured data model)

数据库语言

数据操作语言(Data-Manipulation Language, DML)

过程化 DML
声明式 DML(非过程化 DML)

数据定义语言(Data-Definition Language, DDL)

数据库系统所使用的存储结构和访问方式是通过一系列特殊的 DDL 语句来说明的,这种特殊的 DDL 称作数据存储和定义(data storage and definition)。这些语句定义了数据库的模式的实现细节,这些细节对用户来说通常是不可见的。

存放在数据库中的数据值要满足一致性约束(consistency constraint)。
数据库系统实现可以以最小代价测试的完整性约束。

  • 域约束(domain constraint)
  • 参照完整性(referential integrity)
  • 断言(assertion)
  • 授权(authorization)

DDL 的输出放在数据字典(data dictionary)中,数据字典中包含了元数据(metadata),元数据是关于数据的数据。可把数据字典看作一种特殊的表,这种表只能由数据库本身(不是常规用户)来访问和修改。在读取和修改实际数据之前,数据库先要参考数据字典。

数据存储和查询

数据库系统的功能大致分为存储管理器和查询处理部件。

事物管理

  • 原子性(atomicity)
  • 一致性(consistency)
  • 持久性(durability)

数据库体系结构

  • 客户/服务器系统(两层体系结构,三层体系结构)
  • 并行数据库系统
  • 分布式数据库系统

第一部分 关系数据库

第二章 关系模型介绍

关系模型的基本概念

  • 关系(Relation),一个关系对应通常说的一个表(Table)
  • 元组(Tuple),表中的一行即为一个元组
  • 属性(Attribute),表中的一列即为一个属性,给每一个属性起一个名称即属性名
  • 分量,元组中的一个属性值

  • 关系模式,对关系的描述,关系名(属性1,属性2,… ,属性 n),学生(学号,姓名,年龄,性别,系,年级)

  • 关系实例,表示一个关系的特定实例,也就是所包含的一组特定的行

  • 域(Domian),属性的取值范围

  • 笛卡尔积

由于关系是元组的集合,所以元组在关系中的顺序是无关紧要的。所以关系中的元素无论是排好序的还是无序的,都是无所谓的。两个关系中的元组的顺序即使不同,但这两个关系依然是相同的。

关系的概念对应于程序设计语言中变量的概念,关系模式对应于类型的定义,关系实例对应于变量的值。

  • 超码(superkey),是一个或多个属性的集合,这些属性的组合可以使我们在一个关系中唯一地标识一个元组。
  • 候选码(candidate key),任意真子集都不能作为超码的超码。
  • 主码(primary key)表示被选中的、主要用来在一个关系中区分不同元组的候选码。
  • 外码(foreign key)。一个关系模式(如r1),可能在它的属性中包括另一个关系模式(如 r2)的主码。这个属性在 r1上被称作参照 r2的外码。关系 r1也被称作外码以来的参照关系(referencing relation), r2被叫做外码的被参照关系(referenced relation)。(参照关系中的外码和被参照关系中的主码名字可以不同)
  • 主属性(prime attribute),候选码的诸属性被称作主属性。
  • 非主属性(nonprimary attribute),不被任何候选码包括的属性。
  • 全码(all-key),关系模式的所有属性都是这个关系模式的候选码。

关系的完整性

  • 实体完整性(Entity Integrity),若属性 A 是基本关系 R 的主属性,则属性 A 不能为 NULL。
  • 参照完整性(Referential Integrity),一个关系中某些属性的取值需要参照其他关系的属性取值。
  • 用户定义的完整性(User-defined Integity),用户定义的特殊的约束条件,如买某些属性必须满足函数关系,某个属性的取值范围限定等。

第三章 SQL

前两章节基本都是枯燥的概念,接下来就会结合具体数据库(Mysql)进行学习。

首先是 Mysql 的安装,这里使用的是 macOS 的包管理工具 Homebrew 安装的 Mysql。

安装命令:
    brew install mysql
启动命令:
    mysql.server start
如果是第一次运行,需要进行初始化:
    mysql_secure_installation
连接到本地的服务器:
    mysql -u root -p
查看所有数据库:
    show databases;
新建数据库 'test':
    create database test;
使用数据库 'test':
    use test;
查看'test'中所有表:
    show tables;

SQL 数据定义

基本类型

  • char(n),固定长度字符串
  • varchar(n),可变长字符串,最长为 n
  • int,整型
  • smallint,小整型
  • numeric(p,d),定点数,以字符串的形式存储的小数,如 numeric(4,2)可表示1234.56、123.4
  • real,double precision,浮点数和双精度浮点数,精度和机器有关
  • float(n),精度至少为 n 位的浮点数

基本模式定义

表的创建:

创建表 'department':
    create table department 
        (dept_name varchar(20),
        building varchar(15),
        budget numeric(12,2),
        primary key(dept_name));

创建表 'instructor'
    create table instructor
        (ID  varchar(5), 
         name varchar(20) not null, 
         dept_name varchar(20), 
         salary numeric(8,2),
         primary key (ID),
         foreign key (dept_name) references department);

create table 命令的通用形式是:

create table r
    (A1 D1, 
    A2 D2, 
    ...,
    An Dn, 
    <完整性约束1>,
    ...,
    <完整性约束k>);

SQL 更多的完整性约束条件会在第四章 完整性约束 一节详细介绍。

插入元组:

insert into department values ('Biology', 'Watson', '90000');
insert into department values ('Comp.Sci.', 'Taylor', '100000');
insert into department values ('Elec.Eng.', 'Taylor', 85000);
insert into department values ('Finance', 'Painter', '120000');
insert into department values ('History', 'Painter', '50000');
insert into department values ('Music', 'Packard', '80000');
insert into department values ('Physics', 'Watson', '70000');

insert into instructor values ('10101', 'Srinivasan', 'Comp.Sci.', '65000');
insert into instructor values ('12121', 'Wu', 'Finance', '90000');
insert into instructor values ('15151', 'Mozart', 'Music', '40000');
insert into instructor values ('22222', 'Einstein', 'Physics', '95000');
insert into instructor values ('32343', 'El Said', 'History', '60000');
insert into instructor values ('33456', 'Gold', 'Physics', '87000');
insert into instructor values ('45565', 'Katz', 'Comp.Sci.', '75000');
insert into instructor values ('58583', 'Califieri', 'History', '62000');
insert into instructor values ('76543', 'Singh', 'Finance', '80000');
insert into instructor values ('76766', 'Crick', 'Biology', '72000');
insert into instructor values ('83821', 'Brandt', 'Comp.Sci.', '92000');
insert into instructor values ('98345', 'Kim', 'Elec.Eng.', '80000');

数字类型的变量可以通过数字和字符串两种方式插入,而字符串类型的变量只能插入字符串。

删除元组: delete from r;
删除表: drop table r;
增加属性: alter table r add A D;
删除属性: alter table r drop A;

有关修改的操作会在本章末的 数据库的修改 一节详细讲解。

SQL查询的基本结构

SQL 查询的基本结构由三个子句构成:select, from, where
大部分语句十分简单,只要将语句自己实现下就可以明白。

单关系查询

select budget from department; <=> select all budget from department;
select distinct budget from department;
select budget +(-,*,/) 1.1 from department;
select * from department;

select building 
from department 
where dept_name = 'Comp.Sci.' and budget <(<=,>,>=,=,<>) 8;

多关系查询

select name, instructor.dept_name, building
from instructor, department
where instructor.dept_name = department.dept_name;

在这里因为 name 和 building 只分别存在于 instructor 和 department,所以不用加前缀。但是 dept_name 在两个表中均存在,所以需要加一个前缀表示选中的是哪个表中的 dept_name 。

一个典型的 SQL 查询具有如下格式:

select A1,A2, ... ,An
from r1,r2, ... ,rn
where P;

自然连接

自然连接(natural join)运算作用于两个关系,并产生一个关系作为结果。自然连接只考虑那些在两个关系模式中都出现的属性上取值相同的元组对。

自然连接后列出属性的顺序:先是两个关系模式中公共的属性(公共的属性只出现一次),然后是只出现第一个关系模式中的属性,最后是出现在第二个关系模式中的属性。

select * 
from instructor natural join department;

可以和

select *
from department, instructor
where department.dept_name = instructor.dept_name;

还有

select *
from department, instructor;

对比一下。

附加的基本运算

更名运算

使用 as 语句进行更名运算,可以作用在 select中,也可以作用在from中。
更名的情景有三个:

属性更名:

  • from 子句的两个关系中可能存在同名属性,这种情况下,结果会出现重复的属性名
  • 如果我们在 select 中使用算数表达式,那么结果属性就没有名字
  • 还有就是为了改变结果中的属性名

例如:

select name as instr_name, building  
from instructor, department
where instructor.dept_name = department.dept_name;

表更名:

  • 单纯为了将长名变短名
  • 为适应于需要比较同一关系中的元组的情况

例如:

select distinct T.name
from instructor as T, instructor as S
where T.salary > S.salary and S.dept_name = 'Biology';

参考资料

  • 《数据库系统概念》 机械工业出版社

持续更新。。。

你可能感兴趣的:(数据库)