書上的例子以及練習題都是用 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';
參考資料
- 《數據庫系統概念》 機械工業出版社