《資料庫系統概念》學習筆記
書上的例子以及練習題都是用 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
(A<sub>1</sub> D<sub>1</sub>,
A<sub>2</sub> D<sub>2</sub>,
...,
A<sub>n</sub> D<sub>n</sub>,
<完整性約束<sub>1</sub>>,
...,
<完整性約束<sub>k</sub>>);
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';
參考資料
- 《資料庫系統概念》 機械工業出版社
持續更新。。。