一、數據模型
-
兩大數據模型
1. 概念模型:按用戶的觀點來對數據來對數據和信息建模,主要用於數據庫設計。
2. 邏輯模型:主要包括層次模型、網狀模型、關系模型,它是按照計算機系統的觀點對數據建模,主要用於DBMS的實現。
-
數據模型的組成要素:數據結構、數據操作、完整性約束
1. 數據結構:數據庫組成對象以及對象之間聯系的描述。
2. 數據操作:對數據庫中各種對象的實例允許執行的操作的集合。
3. 完整性約束:數據模型要滿足的約束條件。包括實體完整性、參照完整性、用戶定義完整性。
二、關系數據庫標准語言SQL——SQL概述
-
SQL的組成
1. 數據定義(Data Definition):用來定義數據庫結構,包括定義表、視圖和索引。
2. 數據操作(Data Manipulation):包括數據查詢和數據更新兩大操作。數據更新包括插入、刪除和修改操作。
3. 數據控制(Data Control):包括對數據的安全性控制、完整性規則的描述以及對事務的定義、並發控制和恢復。
-
SQL的特點
1. 綜合統一:SQL中的DDL、DML、DCL語言風格統一,可以獨立完成數據庫生命周期中的全部活動。
2. 高度非過程化:SQL進行數據操作,只要提出做什么,不需要指明怎么做。操作過程由系統自動幫助你完成。
3. 面向集合的操作方式
4. 以同一種語法結構提供多種使用方式:既是獨立的語言,又是嵌入式語言。
5. 語言簡潔、易學易用。
三、關系數據庫標准語言SQL——數據定義

-
模式的定義與刪除
1.
1. //如果語句里面沒有模式名,則默認模式名為用戶名
2. create scheme <模式名> authorization <用戶名>
2.
1. drop scheme <模式名> <cascade|restrict>
2. //cascade:表示刪除模式時同時把該模式下的所有數據庫對象全部刪除
3. //restrict:表示如果該模式下已經定義了數據庫對象,則拒絕刪除該模式
-
基本表的定義、刪除、修改
1.
1. create table student(
2. sno varchar(50) primary key,//列級完整性約束,主碼
3. sname varchar(50) unique,//取唯一值
4. ssex int,
5. sage smallint,
6. sdept char(20),
7. //primary key(sno),表級完整性約束
8. foreign key sdept references school(sdept)//外碼
9. );
2. 數據類型:

3. 模式與表:定義基本表時定義其模式
1. //第一種方法,顯示的定義
2. create table S-T student(....)
3. //第二種方法,在創建模式語句的同時創建表
4. 修改基本表
1. alter table <表名>
2. [add <新列名> <數據類型> [完整性約束]] //增加新列,並指定數據類型和完整性
3. [drop <完整性約束名>] //刪除某列的完整性
4. [column <列名> <數據類型>]; //修改列的數據類型
5. 刪除基本表
1. drop table <表名>; //一旦刪除基本表,則表中的所有數據都被刪除
-
索引的建立和刪除:建立索引是加快查詢速度的有效手段
1.
1. create [unique][cluster] index <索引名>
2. on <表名> (<列名> [<次序>].....)
2. 索引可以建立在表的一列或多列上,每個列名的次序指定索引值的排序次序,包括ASC和DESC,缺省為ASC
3. unique表明此索引的每一個索引值只對應唯一的數據記錄;cluster表示要建立的索引是聚簇索引,即表中記錄的物理順序與索引值的順序一致。
4. 刪除索引
1. drop index <索引名>
5. RDBMS中索引一般采用B+樹、HASH索引來實現。B+樹具有動態平衡的有點,HASH索引具有查找速度快的特點。
四、關系數據庫標准語言SQL——數據查詢
-
單表查詢
1. 目標表達式不僅可以是表中的屬性,也可以是算數表達式;目標表達式不僅可以是表達式,還可以是字符串常量、函數等。
1. //目標列表達式
2. select sno,2016-sage
3. from student;
5. //字符串常量
6. select 'number:',sno,'age:',sage
7. from student;
9. //更改查詢結果的列名10. select sno number,sage age
11. from student;
2. 消除重復的行:distinct
1. select distinct sname
2. from student;
3. 查詢滿足條件的元組:where

1. //比較大小
2. select sname,sage
3. from student
4. where sage<20;
5.
6. //確定集合
7. select sname
8. from student
9. where sdept in('CS' ,'MA');
10.
11. //字符串匹配,%表示任意長度的字符串,_表示任意單個字符
12. select sname
13. from student
14. where sname like '林_ _'; //漢字要占兩個字符,所以要兩個_
15.
16. //escape '\' 表示'\'為轉換字符,這樣緊跟在\之后的通配符就不具有通配符的含義,只是普通的字符
17. select cno
18. from course
19. where cname like 'db\_design' escape '\';
20.
21. //空值查詢
22. select sno,cno
23. from sc
24. where grade is null;
25.
26. //多重條件查詢使用and和or
4. order by子句:表示對查詢結果按照一個或多個屬性列的升序(ASC)或降序(DESC)排列,缺省值為升序。
1. select sno,grade
2. from sc
3. where cno='3'
4. order by grade desc;
5. 聚集函數:

1. select count(*)
2. from student
3. where sname like 'lin%';
6. group by子句:查詢結果按某一列或多列的值分組,值相等的為一組。對查詢結果分組目的是為了細化聚集函數的作用對象。如果未對查詢結果分組,聚集函數將作用於整個查詢結果。分組后聚集函數將作用於每一個組,即每一組都有一個函數值。Having語句是對分組后的組按一定的條件進行篩選,最終只輸出滿足指定條件的組。
1. //求student表中同名的人
2. select sname
3. from student
4. group by sname
5. having count(*)>1;
where子句與having短語的區別在於作用對象不同,where子句作用於基本表或視圖,having短語作用與組。
-
連接查詢
1. 等值於非等值連接查詢
1. //[<表名1>.]<列名1> <比較運算符> [<表名2>.]<列名2>
2. //比較運算符有:= > <等
3. //=時為等值連接,其他的運算符為非等值連接
4. select student.*,sno.*
5. from student,sc
6. where student.sno=sc.sno;
2. select與where子句的屬性名都加上表名前綴,是為了避免混淆。如果屬性名在參加連接的各表中是唯一的,則可以省略表名前綴。
-
自身連接
1. 連接操作不僅可以在兩個表之間進行,也可以是一個表與其自己進行連接。
2.
1. //同一個表進行連接,需要為表另取名
2. select first.cno,second.cpno
3. from course first,course second
4. where first.cno=second.cpno;
-
外連接:在連接謂詞的某一邊加符號*
1. 外連接就好像是為符號*所在邊的表增加一個“萬能”的行,這個行全部由空值組成。它可以和另一邊的表中所有不滿足連接條件的元組進行連接。
2. 連接符出現在右邊稱為右外連接,出現在左邊稱為左外連接。
1. select student.*
2. from student,sc
3. where student.sno=sc.sno(*);
-
復合條件連接
1. where子句中可以有多個連接條件,成為復合條件連接。
1. select student.sno,sname
2. from student,sc
3. where student.sno=sc.sno and
4. sc.cno='2' and
5. sc.grade>90;
2. 兩個表以上進行連接,可以成為多表連接。
1. select student.sno,sname,cname,grade
2. from student,sc,course
3. where student.sno=sc.sno and sc.cno=course.cno;
-
嵌套查詢:將一個查詢塊嵌套在另一個查詢塊的where子句或having短語的條件中的查詢成為嵌套查詢。
1. SQL語言允許多層嵌套查詢。子查詢select語句中不能使用order by子句,該子句只能對最終查詢結果排序
1. select sname
2. from student
3. where sno in
4. (select sno
5. from sc
6. where cno='2')
子查詢結果往往是一個集合,所以謂詞in是嵌套查詢中最經常使用的謂詞。
2. 帶有比較運算符的子查詢:可以使用> < =等比較運算符
1. select sname
2. from sc x
3. where grade >
4. (select avg(grade)
5. from sc y
6. where x.cno=y.cno)
3. 帶有any或all謂詞的子查詢

1. select sname,sage
2. from student
3. where sage<any (select sage
4. from student
5. where sdept='cs');
4. 帶有EXISTS謂詞的子查詢:不返回任何數據,只產生邏輯真“true”或邏輯假“false”。EXISTS引出的子查詢,其目標列表達式通常為*,因為其結果為真假值,給出列名沒有意義。
1. select sname
2. from student
3. where exists
4. (select *
5. from sc
6. where sno=student.sno and cno='1');
-
集合查詢:並(UNION)、交(INTERSECT)、差(EXCEPT)
1. //參加UNION操作的各結果表的列數必須相同,對應項的數據類型也必須相同
2. select *
3. from student
4. where sdept='cs'
5. union
6. select *
7. from student
8. where sage>19;
五、關系數據庫標准語言SQL——數據更新
-
插入數據
1.
1. insert
2. into <表名> [<屬性列1> [,<屬性列2>]...]
3. values(<常量1> [,<常量2>]...)
2.
1. insert
2. into student
3. values('lin',16,'cs'....);
4.
5. insert
6. into student(sname,sage,sno)
7. values('lin',16,'cs');
插入元組
3.
1. insert
2. into student
3. select *
4. from student
5. where sage>19;
插入集合
-
修改數據
1.
1. update <表名>
2. set <列名>=<表達式> [,<列名>=<表達式>]...
3. [where <條件>]
2.
1. update student
2. set sage=22
3. where sno='12346';
-
刪除數據
1.
1. delete
2. from <表名>
3. [where <條件>]
2.
1. //刪除某一個值
2. delete
3. from student
4. where sno='123456';
6. //刪除多個元組的值
7. delete
8. from student;
五、關系數據庫標准語言SQL——視圖
-
視圖概念:視圖是從一個或幾個基本表中導出的表,它是一個虛表。數據庫只存放視圖的定義,不存放視圖對應的數據,其數據依舊存在數據庫表中。所以數據庫表中的數據發生變化,從視圖中查詢的數據也將發生變化。
-
定義視圖
1.
1. create view <視圖名> [(<列名> [,<列名>]...)]
2. as <子查詢>
3. [with check option]
2. 子查詢可以是任意復雜的select語句,但通常不允許含有order by子句和distinct短語。
3. with check option表示對視圖進行update、insert、delete操作時要保證更新、插入、刪除的行滿足視圖定義中的謂詞條件。
4. 組成視圖的屬性列名或者全部指定或者全部省略,沒有第三種選擇。如果省略了各個屬性列名,則隱含該視圖由子查詢中select子句目標列中的諸字段組成。
5.
1. create view is_student
2. as
3. select sno,sname,sage
4. from student
5. where sdept='cs'
6. with check option;
6. 視圖可以建立在多個基本表上,也可以建立在一個或多個視圖上。。。。
-
刪除視圖
1. drop view <視圖名>
-
視圖的查詢和更新操作與數據表基本類似,但是還是有一些不同
六、數據庫安全性
-
數據庫安全性控制:用戶標識和鑒別、存取控制、操作系統安全保護、數據密碼存儲
-
數據庫存取控制方法——用戶權限由兩個要素組成:數據對象和操作類型
-
數據庫存取控制方法——授權與回收
1. 定義一個用戶的存取權限就是要定義這個用戶可以在哪些數據對象上進行哪些類型的操作。在數據庫系統中,定義存取權限成為授權。
2. GRANT授權
1. grant <> [,<>]...
2. on <對象類型> <對象名> [,<對象類型> <對象名>]...
3. to <用戶> [,<用戶>]...
4. [with grant option]
將對指定操作對象的指定操作權限授予指定的用戶,發出該grant語句的可以是DBA,也可以是已經擁有該權限的用戶。接收權限的用戶可以是一個或多個具體用戶,也可以是PUBLIC,即全體用戶。指定WITH GRANT OPTION子句,則獲得某種權限的用戶還可以把這種權限授權給其他用戶.
5. grant all privileges
6. on table student,sc
7. to user1
8. with grant option;
3. REVOKE回收
1. revoke <> [,<>]...
2. on <對象類型> <對象名> [,<對象類型> <對象名>]...
3. from <用戶> [,<用戶>]...
cascade會級聯:依次向下收回權限
4. revoke insert
5. on table student
6. from user1 cascade;
4. 創建數據庫模式的權限
1. create user <username>
2. [with] [dba|resource|connect]

審計
1. 審計功能吧用戶對數據庫的所有操作自動記錄下來放入審計日記中。DBA可以利用審計跟蹤的信息,重現導致數據庫出現現有狀況的一系列事件,中出非法存取數據的人、時間和內容等。
2. 審計通常是費時間和空間的,一般主要用於安全性要求較高的部門。
3. 審計一般可以分為用戶級審計和系統級審計。
4. AUDIT語句用來設置審計功能,NOAUDIT用來取消審計功能。
1. audit alter,update
2. on student;
3.
4. noaudit all
5. on student;
七、數據庫完整性
-
數據庫的完整性是指數據的正確性和相容性。包括:實體完整性、參照完整性、用戶定義完整性。
-
實體完整性
1. 一種定義為列級約束條件,另一種定義為表級約束條件。在create table中用primary key定義。
2. 完整性檢查和違約處理。。。。
-
參照完整性
1. 在create table中用foreign key短語定義哪些列為外碼列,用references短語指明這些外碼參照哪些表的主碼。
2. 對被參照表和參照表進行增刪改查操作時很有可能破壞參照完整性,必須進行檢查。

3. 違約處理:reject(拒絕執行)、cascade(級聯)、set-null(設置為空)

-
用戶定義完整性:針對某一具體應用的數據必須滿足的語義要求
1. 列值非空:NOT NULL短語
1. create table sc(
2. sno char(7) not null,
3. sname char(10) not null);
2. 列值唯一:UNIQUE短語
1. create table student
2. (sname varchar(50) unique,
3. sage int);
3. check:指定列值應該滿足的條件
1. create table student
2. (sage int check(sage>19),
3. ssex char(10) check(ssex in ('男','女')));
-
完整性約束命名子句:提供constraint,用來對完整性命名
1. constraint <完整性約束條件名> [PRIMARY KEY短語|FOREIGN KEY短語|CHECK短語]
八、數據庫恢復技術
-
事務的基本概念:事務時一系列的數據庫操作,是數據庫應用程序的基本邏輯單元。事務時用戶定義的一個數據庫操作序列,這些操作要么全做要么全部做,是一個不可分割的工作單位。
1.

1. begin transaction
2. ....
3. 數據庫操作
4. commoit
2. 事務具有以下特性:原子性、一致性、隔離性和持續性。
-
數據庫恢復的實現技術
1. 數據轉儲:定期將整個數據庫復制到磁帶或另一個磁盤上保存起來的過程。這些備用的數據文本成為后備副本或后援副本

2. 登記日志文件:用來記錄事務對數據庫的更新操作的文件。

九、並發控制
-
並發控制概述
1. 丟失修改:兩個事務T1和T2讀入同一數據並修改,T2提交的結果破壞了T1提交的結果,導致T1的修改被丟失。
2. 不可重復讀:事務T1讀取數據后,事務T2執行更新操作並寫回數據庫,使T1無法再現前一次讀取結果。
3. 讀“臟”數據:事務T1修改某一數據,並將其寫回磁盤,事務T2讀取同一數據后,T1由於某種原因被撤銷,T2這時讀到的數據就與數據庫中的數據不一致。

4. 並發控制的主要技術是封鎖。
-
封鎖
1. 排它鎖:又成為寫鎖(X鎖)。若事務T對數據對象A加上X鎖,則只允許T讀取和修改A,其他任何事務都不能再對A加任何類型的鎖,直到T釋放A上的鎖。這就保證了其他事務在T釋放A上的鎖之前不能再讀取和修改A。
2. 共享鎖:又稱為讀鎖(S鎖)。若事務T對數據對象A加上S鎖,則事務T可以讀A但不能修改A,其他事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。這就保證了其他事務可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改。
3. 常用XLOCK表示對A上加X鎖,SLOCK表示對A加S鎖,UNLOCK A表示釋放A上的封鎖。
-
封鎖協議
1. 一級封鎖協議:事務T在修改數據R之前必須先對其加X鎖,直到事務結束才釋放。其解決了丟失修改的問題。在一級封鎖協議中,如果僅僅是讀數據,不對數據進行修改,是不需要加鎖的,所以它不能保證可重復讀和不讀“臟”數據。(只有在修改數據是才加上X鎖,讀數據時加S鎖)
2. 二級封鎖協議:一級封鎖協議加上事務T在讀取數據R之前必須現對其加S鎖,讀完后即可釋放S鎖。其解決了丟失修改和讀臟數據。由於讀完數據后即可釋放S鎖,所以它不能保證可重復讀。
3. 三級封鎖協議:一級封鎖協議加上事務T在讀取數據R之前必須先對其加S鎖,直到事務結束才釋放。其解決了丟失修改、讀臟數據和不可重復讀。


-
並發調度的可串行性
1. 多個事務的並發執行是正確的,當且僅當其結果與按某一次序串行地執行它們時的結果相同,稱這種調度策略為可串行化的調度。
2. 可串行性是並發事務正確性的准則。按這個准則規定,一個給定的並發調度,當且僅當它是串行化的,才認為是正確調度。
-
封鎖的粒度:封鎖對象的大小稱為封鎖粒度。封鎖的粒度越大,數據庫所能封鎖的數據單元越少,並發度就越小,系統開銷越小。
十、數據庫范式
-
數據依賴:是一個關系內部屬性與屬性之間的一種約束關系,這種約束關系是通過屬性間值得相等與否體現出來的數據間相關聯系。數據依賴中最重要的是函數依賴和多值依賴。
-
函數依賴
1. 設R(U)是屬性集U上的關系模式。X,Y是U的子集。若對於R(U)的任意一個可能的關系實例r,r中不可能存在兩個元組在X上的屬性值相等,而在Y上的屬性值不能,則稱X函數確定Y或者Y函數依賴於X,記作X->Y。
2.

-
第一范式(1NF):如果一個關系模式R的所有屬性都是不可分的基本數據項,則R為第一范式。(也就是不能出現表中表的情況,不滿足第一范式則就不是關系數據庫)。
-
第二范式(2NF):關系模式R是第一范式,並且每一個非主屬性都完全函數依賴於R的碼,則R為第二范式。消除了非主屬性對候選碼的部分依賴。
-
第三范式(3NF):關系模式R的每一個非主屬性既不部分函數依賴於候選碼也不傳遞函數依賴於候選碼。顯然R也屬於第二范式。
-
BC范式(BCNF):R屬於第一范式,如果對於R的每個函數依賴X->Y,並且Y不包含於X,則X必含有候選碼,那么R屬於BCNF(即R中的每一個決定因素都包含候選碼)
1. BC范式既檢查非主屬性,又檢查主屬性。當只檢查非主屬性時,就成了第三范式。滿足BC范式的關系都必然滿足第三范式。
2. 符合3NF,並且,主屬性不依賴於主屬性。
3. 所有非主屬性都完全函數依賴於每個候選碼。
4. 所有主屬性都完全函數依賴於每個不包含它的候選碼。
5. 沒有任何屬性完全函數依賴於非碼的任何一組屬性。
-
第四范式(4NF):消除了多值依賴。
作者:龍貓小爺
鏈接:http://www.jianshu.com/p/7740abe01c26
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。