數(shù)據(jù)庫系統(tǒng)概念
第一部分 關(guān)系數(shù)據(jù)庫
第1章 引言
數(shù)據(jù)庫管理系統(tǒng)(DataBase-Management System DBMS)是有互相關(guān)聯(lián)的數(shù)據(jù)集合和一組用以訪問這些數(shù)據(jù)的程序組成政己。這個(gè)數(shù)據(jù)集合通常稱作數(shù)據(jù)庫。
很早以前是用文件的形式記錄數(shù)據(jù)赴背,帶來了很多問題
- 數(shù)據(jù)冗余不一致
- 數(shù)據(jù)訪問難
- 數(shù)據(jù)孤立
- 完整性問題
- 原子性問題
- 并發(fā)問題
- 安全問題
1.1 數(shù)據(jù)庫的三個(gè)層次
物理層(數(shù)據(jù)的存儲(chǔ))梢夯、邏輯層(數(shù)據(jù)的關(guān)系)寓落、視圖層(描述數(shù)據(jù)庫的某個(gè)部分)
1.3.3 數(shù)據(jù)模型
數(shù)據(jù)模型是一個(gè)描述數(shù)據(jù)秘蛔、數(shù)據(jù)聯(lián)系湃缎、數(shù)據(jù)語義和一致性約束的概念工具的集合。
- 關(guān)系模型
- 實(shí)體-聯(lián)系模型
- 基于對象的數(shù)據(jù)模型
- 半結(jié)構(gòu)化數(shù)據(jù)模型
1.4.1 數(shù)據(jù)操縱語言
數(shù)據(jù)操縱語言(Data-Manipulation Language,DML)訪問和操縱適當(dāng)模型組織起來的數(shù)據(jù)舵稠,有以下操作
- 檢索數(shù)據(jù)
- 插入數(shù)據(jù)
- 刪除數(shù)據(jù)
- 修改數(shù)據(jù)
1.4.2 數(shù)據(jù)定義語言
數(shù)據(jù)定義語言(Data-Definition Language,DDL)
- 域約束
數(shù)據(jù)類型(整數(shù)超升、字符型) - 參照完整性
可以了解成外鍵管理 - 斷言
這個(gè)就沒用到了,是說一個(gè)學(xué)期必須開設(shè)5門課程哺徊,表達(dá)成一個(gè)斷言 - 授權(quán)
讀廓俭、插入、更新唉工、刪除
1.6.2 數(shù)據(jù)庫設(shè)計(jì)
設(shè)計(jì)階段中的需求描述是制定數(shù)據(jù)庫的概念結(jié)構(gòu)的基礎(chǔ)
1.6.3 實(shí)體聯(lián)系模型
數(shù)據(jù)庫的總體邏輯結(jié)構(gòu)可以用實(shí)體-聯(lián)系圖(entity-relationship diagram E-R 圖),有幾種方法畫這樣的圖汹忠,最常用的是UML
1.6.4 規(guī)范化
設(shè)計(jì)關(guān)系數(shù)據(jù)庫所用到的另外一種方法被稱為規(guī)范化過程淋硝,他的目標(biāo)是生成一個(gè)關(guān)系模式集合,是我們存儲(chǔ)信息沒有不必要的冗余宽菜,同時(shí)又能很輕松的檢索數(shù)據(jù)谣膳,最常用的方法是使用函數(shù)依賴。
1.7 數(shù)據(jù)存儲(chǔ)和查詢
數(shù)據(jù)庫系統(tǒng)的功能部件大致分為存儲(chǔ)管理器和查詢處理部件
1.7.1 存儲(chǔ)管理器
- 權(quán)限及完整性管理器
完整性約束和用戶權(quán)限 - 事務(wù)管理器
故障铅乡,保持一致的狀態(tài)继谚,并發(fā)執(zhí)行不沖突 - 文件管理器
管理磁盤存儲(chǔ)空間的分配,所存儲(chǔ)信息的數(shù)據(jù)結(jié)構(gòu) - 緩沖區(qū)管理器
數(shù)據(jù)從磁盤取到內(nèi)存阵幸,決定哪些數(shù)據(jù)應(yīng)被緩沖存儲(chǔ)在內(nèi)存中 - 數(shù)據(jù)文件
存儲(chǔ)數(shù)據(jù)庫本身 - 數(shù)據(jù)字典
存儲(chǔ)數(shù)據(jù)庫結(jié)構(gòu)的元數(shù)據(jù)花履,尤其是數(shù)據(jù)庫模式 - 索引
對數(shù)據(jù)項(xiàng)的快速訪問
1.7.2 查詢處理器
DDL解釋器
-
DML編譯器
一個(gè)查詢會(huì)被翻譯成多種等價(jià)的執(zhí)行方案的一種,DML編譯器還能進(jìn)行查詢優(yōu)化挚赊,從幾種選擇中選出代價(jià)最小的一種
1.8 事務(wù)管理
- 原子性 atomicity
- 一致性 consistency
- 持久性 durability
第2章 關(guān)系模型介紹
2.1 關(guān)系數(shù)據(jù)結(jié)構(gòu)
關(guān)系數(shù)據(jù)結(jié)構(gòu)是由表集合成的诡壁。它其實(shí)是數(shù)學(xué)中的一種概念,叫做元祖荠割,表示一組值的序列妹卿。
我們要求關(guān)系r而言旺矾,所有的屬性都是原子的,就是域中的元素是不可再分的夺克,是否再分是由我們的定義來的區(qū)分的箕宙;比如phone_number,如果只看做是一個(gè)號碼而言铺纽,它是原子的柬帕,如果是一組電話或者是定義區(qū)號等,他是非原子的室囊。
空值是特殊的值雕崩,代表未知或者不存在,盡量避免空值的引入融撞。
2.7 總結(jié)
- 關(guān)系的模式是指它的邏輯設(shè)計(jì)盼铁,關(guān)系的實(shí)例是指它在特定時(shí)刻的內(nèi)容
- 關(guān)系的超碼是一個(gè)或者多個(gè)屬性的集合,這些屬性的取值可以唯一識(shí)別出關(guān)系的元祖尝偎,候選碼是一個(gè)最小的超碼饶火,關(guān)系的一個(gè)候選碼作為主碼
- 模式圖,是數(shù)據(jù)庫中模式的圖形化表示致扯,顯示了數(shù)據(jù)庫的關(guān)系肤寝,關(guān)系的屬性,主碼和候選碼
第3章 SQL
3.1 SQL查詢語言概覽
最早的版本是由IBM開發(fā)的抖僵,最初被叫做Sequel鲤看。
1986年美國國家標(biāo)準(zhǔn)化組織(ANSI)和國際標(biāo)準(zhǔn)化組織(ISO)發(fā)布了SQL標(biāo)準(zhǔn),SQL-86耍群,SQL-92义桂,SQL:2003,SQL:2006蹈垢,SQL:2008
SQL語言有以下幾個(gè)部分:
- DDL
- DML
- 完整性
完整性約束的命令 - 視圖定義
- 事務(wù)控制
- 嵌入式SQL和動(dòng)態(tài)SQL
定義語句如何嵌入到通用編程語言 - 授權(quán)
3.2.1 基本類型
- char
- varchar
- int
等價(jià)于integer - smallint
- numeric(p,d)
- real,double precision
- float(n)
char類型存放固定長度的字符串慷吊,例如屬性A的類型是char(10),我們存入的時(shí)候如果存入“avi”曹抬;那么它會(huì)在改字符后面追加7個(gè)空格達(dá)到10個(gè)字符的長度溉瓶,如果是屬性B的類型是varchar(10),它是不會(huì)加空格谤民;這樣就可能出現(xiàn)比較的時(shí)候不相同堰酿。所以說我們建議始終使用varchar類型而不是char類型。
3.5 集合運(yùn)算
union赖临、intersect和except對應(yīng)數(shù)據(jù)集合論中的并運(yùn)算胞锰、交運(yùn)算、差運(yùn)算
union和union all 前者會(huì)去重
結(jié)果中重復(fù)元祖等于C1和C2中出現(xiàn)重復(fù)元祖數(shù)的和-
intersect 和 intersect all 前者會(huì)去重
結(jié)果中重復(fù)元祖等于C1和C2中出現(xiàn)重復(fù)次數(shù)最少的一個(gè)
3.6 空值
- and
任何條件和unknown的結(jié)果是unknown - or
true or unknown的結(jié)果是true兢榨,false or unknown的結(jié)果是unknown - not
not unknown 的結(jié)果是unknown
3.7 聚集函數(shù)
avg 平均數(shù):在算平均數(shù)的時(shí)候切記不能去除重復(fù)元素
distinct:刪除重復(fù)元祖
group by:在group by子句中的所有屬性上取值相同的元祖將被分在一個(gè)組中嗅榕,一個(gè)很重要的事情是需要保證出現(xiàn)在select語句中但沒有被聚集的屬性只能是出現(xiàn)在group by 子句中的屬性顺饮。也就是說任何沒有出現(xiàn)在group by子句中的屬性如果出現(xiàn)在select子句中的話,它只能出現(xiàn)在聚集函數(shù)內(nèi)部凌那,否則這樣的查詢就是錯(cuò)誤的兼雄。
having:having在形成分組后才起作用
select avg(salary) from instructor
group by dept_name
having avg(salary) > 42000;
任何出現(xiàn)在having子句中,但沒有被聚集的屬性必須出現(xiàn)在group by中帽蝶,否則查詢就被當(dāng)成是錯(cuò)誤的
sum:SQL會(huì)忽略輸入的null值
3.8 嵌套子查詢
子查詢是嵌套在另一個(gè)查詢中的select-form-where表達(dá)式中赦肋。
子查詢嵌套在where子句中,通常用于對集合的成員資格励稳、集合的比較和集合的基數(shù)進(jìn)行檢查佃乘。
3.8.1 集合成員資格
使用連接詞in或者not in
3.8.2 集合的比較
如連接詞some和any同義(某一個(gè))、all(所有)
找出滿足下面條件的所有教師的姓名驹尼,他們的工資至少比Biology系某一個(gè)教師的工資要高
select name from instructor
where salary > some (select salary
from instructor
where dept_name = 'Biology')
3.8.3 空關(guān)系測試
exists結(jié)構(gòu)在作為參數(shù)的子查詢非空時(shí)返回true值
找出2009年秋季學(xué)期和2010年春季學(xué)期同事開課的所有課程
select course_id from section as S
where semeter = 'FALL' AND year = 2009
AND
exist (SELECT * FROM section as T WHERE semester = 'Spring' AND year = 2010 AND S.course_id = T.course_id)
上面的查詢還說明了SQL的一個(gè)特性趣避,來自外層查詢的一個(gè)相關(guān)名稱(S)可以用在where子句的子查詢中。使用了這種關(guān)聯(lián)的查詢稱為相關(guān)子查詢
第4章 中級SQL
4.2 視圖
安全考慮新翎、創(chuàng)建一個(gè)比邏輯模型更符合特定用戶直接的個(gè)人化關(guān)系集合程帕。
4.2.1 視圖定義
-
create view
create view v as <query expression>;
v表示視圖名稱<query expression>表示任何合法的查詢表達(dá)式create view faculty as select ID,name,dept_name from instuctor;
定義了視圖后,可以在任何的關(guān)系名中出現(xiàn)視圖
直覺上地啰,在任何給定時(shí)刻愁拭,視圖關(guān)系中的元祖集是該時(shí)刻視圖定義中的查詢表達(dá)式的計(jì)算結(jié)果。所以亏吝,當(dāng)我們定義一個(gè)視圖時(shí)岭埠,數(shù)據(jù)庫熊存儲(chǔ)視圖的定義本身,而不存儲(chǔ)定義該視圖的查詢表達(dá)式的執(zhí)行結(jié)果蔚鸥。
一個(gè)視圖可能被用到定義另一個(gè)視圖的表達(dá)式中
4.2.3 物化視圖
特定數(shù)據(jù)庫系統(tǒng)允許存儲(chǔ)視圖關(guān)系枫攀,但是他們保證:如果用于定義視圖的實(shí)際關(guān)系改變,視圖也跟著修改株茶。
4.2.4 視圖更新
除了一些有限的情況之外,一般不允許對視圖關(guān)系進(jìn)行修改图焰。
- 滿足下列條件我們?nèi)蝿?wù)SQL視圖是可更新的
- from子句中只有一個(gè)數(shù)據(jù)庫名稱
- select子句中值包含關(guān)系的屬性名启盛,不包含任何表達(dá)式、聚集或者distinct聲明
- 任何沒有出現(xiàn)在select子句中的屬性可以取控制
- 查詢不包含group by或having子句
4.3 事務(wù)
事務(wù)由查詢和更新語句的序列組成技羔。SQL標(biāo)準(zhǔn)規(guī)定當(dāng)一條SQL語句被執(zhí)行僵闯,就隱式地開始了一個(gè)事務(wù)。下列SQL語句之一會(huì)結(jié)束一個(gè)事務(wù)
- commit work
- rollback work
4.4 完整性約束
完整性約束保證授權(quán)用戶對數(shù)據(jù)庫所做的修改不會(huì)破壞數(shù)據(jù)的一致性藤滥。因此鳖粟,完整性約束防止的是對數(shù)據(jù)的意外破壞。
4.4.1 單個(gè)關(guān)系上的約束
- not null
- unique
- check
例如check(budget>0)子句保證budget上的取值是正數(shù)
4.4.5 參照完整性
例如外鍵的級聯(lián)刪除
4.4.6 事務(wù)中對完整性約束的違反
事務(wù)中有可能出現(xiàn)拙绊,例如兩條語句向图,第一條插入的時(shí)候違反了約束泳秀,第二條符合了約束。這樣的情況榄攀,有的數(shù)據(jù)庫提供了延遲檢查嗜傅,在事務(wù)提交的時(shí)候進(jìn)行檢查,initially deferred
4.5 SQL的數(shù)據(jù)類型與模式
4.5.1 日期和時(shí)間類型
- date
年月日 - time
時(shí)分秒 - timestamp
date和time的組合
-
獲取日期時(shí)間的函數(shù)
current_date/current_time/current_timestamp
4.5.4 大對象類型
- clob和blob
lob代表 Large OBject
4.5.5 用戶定義的類型
-
為了域的比較或者統(tǒng)一設(shè)置一些域的類型檩赢,使用create type來定義吕嘀,可以使用drop type 和 alter type來刪除或修改
create type Dollars as numeric(12,2); create table department( dept_name varchar(20), budget Dollars );
4.6 授權(quán)
對數(shù)據(jù)庫的授權(quán)包括增、刪贞瞒、改偶房、查
select、delete军浆、update棕洋、insert、all privilegers
grant<權(quán)限列表>
on<關(guān)系名或視圖名>
to<用戶/角色列表>
grant select on department to Amit,satashi
角色:create role instructor;然后可以grant select on takes to instructor
還有其他的授權(quán)略瘾敢。拍冠。。
第5章 高級SQL
5.1 使用程序設(shè)計(jì)語言訪問數(shù)據(jù)庫
- 動(dòng)態(tài)SQL
- 嵌入式SQL
5.2 函數(shù)和過程
寫成存儲(chǔ)過程的優(yōu)點(diǎn)
它允許多個(gè)應(yīng)用訪問這些過程
允許當(dāng)業(yè)務(wù)規(guī)則發(fā)生變化時(shí)進(jìn)行單個(gè)點(diǎn)的改變簇抵。SQL允許定義函數(shù)庆杜、過程和方法
-
官方定義語法
CREATE [DEFINER = user] PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body CREATE [DEFINER = user] FUNCTION sp_name ([func_parameter[,...]]) RETURNS type [characteristic ...] routine_body proc_parameter: [ IN | OUT | INOUT ] param_name type func_parameter: param_name type type: Any valid MySQL data type characteristic: COMMENT 'string' | LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } routine_body: Valid SQL routine statement
5.3 觸發(fā)器
要設(shè)置觸發(fā)器,必須要滿足兩個(gè)條件
- 指明什么條件下執(zhí)行觸發(fā)器碟摆。
- 指明觸發(fā)器執(zhí)行時(shí)的動(dòng)作晃财。
使用場景:
- 實(shí)現(xiàn)未被SQL約束機(jī)制指定的某些完整性約束
- 當(dāng)滿足特定條件時(shí)對用戶發(fā)警報(bào)或自動(dòng)開始執(zhí)行某些任務(wù)
5.5 開窗和排名
在給定的區(qū)間內(nèi)進(jìn)行排名或者聚合操作,成為開窗
https://jingyan.baidu.com/article/d8072ac48d2730ec94cefd43.html
5.6 OLAP系統(tǒng)
聯(lián)機(jī)分析處理系統(tǒng)是一個(gè)交互式系統(tǒng)典蜕,它允許分析人員查看多維數(shù)據(jù)的不同類的匯總數(shù)據(jù)断盛。聯(lián)機(jī)一詞表示分析人員必須能夠提出新的匯總數(shù)據(jù)請求,幾秒鐘之內(nèi)得到響應(yīng)愉舔。
從某一個(gè)角度為固定去查看其他的統(tǒng)計(jì)維度稱為切片