数据库系统原理复习提纲
數(shù)據(jù)庫系統(tǒng)原理復習提綱
參考文獻:A First Course in Database Systems | 3rd Edition
Authors:Jennifer Widom,Jeffrey D Ullman
視頻教程:https://www.bilibili.com/video/BV13J411J7Vu
中國人民大學信息學院-數(shù)據(jù)庫系統(tǒng)概論完整版(基礎(chǔ)篇+高級篇+新技術(shù)篇)
期末復習用,時間有限,難免有疏漏,還望各位批評指正,主要是寫一些對書里內(nèi)容的理解。——??Sylvan Ding ??
文章目錄
- 數(shù)據(jù)庫系統(tǒng)原理復習提綱
- 關(guān)系數(shù)據(jù)模型
- 關(guān)系模型的組成
- 定義關(guān)系模式(表創(chuàng)建)
- 數(shù)據(jù)類型
- 約束條件
- 修改/刪除關(guān)系模式(表修改/刪除)
- 代數(shù)查詢語言
- 關(guān)系表達式
- 關(guān)系表達式樹
- 查詢優(yōu)化
- 關(guān)系數(shù)據(jù)庫設(shè)計理論
- 求屬性集合的閉包
- 求某關(guān)系的所有候選碼/所有非平凡函數(shù)依賴
- 求FD的最小基本集
- 投影依賴的計算
- BCNF
- 定義
- 分解算法
- 3NF
- 定義
- 分解算法
- 高級數(shù)據(jù)庫模型
- ER模型建立
- ER模型轉(zhuǎn)關(guān)系模式
- ER模型設(shè)計原則
- ODL模型
- 代數(shù)和邏輯查詢語言
- 包上的關(guān)系操作
- 擴展操作符
- 數(shù)據(jù)庫語言
- SQL語法
- 事務
- 保證事務正確執(zhí)行的ACID性質(zhì)
- 事務的隔離級別
- 約束與觸發(fā)器
- 斷言
- check約束和斷言的對比
- 觸發(fā)器
- 視圖與索引
- 視圖更新
- 索引
- 計算最佳索引
- 服務器環(huán)境下的SQL
- 嵌入宿主語言的SQL
- 存儲過程
- 關(guān)系數(shù)據(jù)庫安全機制
- 授權(quán)和銷權(quán)
- 授權(quán)圖
關(guān)系數(shù)據(jù)模型
關(guān)系模型的組成
關(guān)系數(shù)據(jù)結(jié)構(gòu)
關(guān)系模型中的數(shù)據(jù)在邏輯上是一張二維表,由行和列組成(二維表、行列)
關(guān)系操作
插入、刪除、更新、查詢(增刪改查)
關(guān)系完整性約束
實體完整性約束:屬性A是關(guān)系R的主屬性,則A不能取空值(主屬性不能為空)
參照完整性約束:F是R的外碼,和S中的主鍵K相對應,F必須為空或等于K中某個值(下文必須在上文出現(xiàn))
用戶定義的完整性:對某一應用所涉及的數(shù)據(jù)必須滿足語意要求(根據(jù)實際自定義的約束)
定義關(guān)系模式(表創(chuàng)建)
數(shù)據(jù)類型
| char(n) | 定長n個字符,不足位補空格,效率最優(yōu) |
| varchar(n) | 變長,最多n個字符,實際存儲長度+1(存字符長度),空間最優(yōu) |
| text | 變長,非unicode,存儲量很大 |
| nchar(n) | 定長unicode |
| nvarchar(n) | 變長unicode |
| ntext | 變長unicode |
| binary/varbinary | 定長/變長 二進制 |
| image | 變長二進制,用于保存圖像 |
| bigint/int/smallint/tinyint | 整型 |
| bit | 模擬BOOLEAN |
| decimal(n,d) | n位有效位,d位小數(shù)位 |
| real/float | 浮點 |
| datetime | “YYYY-MM-DD HH:MM:SS” |
約束條件
create table <tb_name>(<attr_1> char(1) primary key, -- 主鍵約束<attr_2> int references tb_2(att_name) -- 外鍵約束on update cascade -- 級聯(lián)更新on delete set null, -- 置空值原則(默認“缺省原則”,拒絕更新)<attr_3> datetime unique not null default date '1900-12-12', -- 唯一、非空、默認值約束<attr_4> real [constraint c_name] check(attr_4<>10), -- 基于屬性的check約束,[約束命名],不等于用<>-- 也可以在末尾聲明約束constraint c_name primary key(attr_1),foreign key(attr_2) references tb_2(att_name),unique(attr_3),check(attr_1 in ('F','M')) ); -- 刪除約束 alter table <tb_name> drop constraint <c_name>; -- 添加約束,<type_of_constraint>=[primary key|foreign key|unique...] alter table <tb_name> add constraint <c_name> <type_of_constraint>(<attr>)...;修改/刪除關(guān)系模式(表修改/刪除)
-- 表刪除 drop table <t_name> -- 添加/刪除列 alter table <t_name> [add|drop] <column_name>; -- 添加/刪除約束 alter table <t_name> [add|drop] constraint <c_name>; -- 修改某列類型 alter table <t_name> alter column <col_name> <type>;代數(shù)查詢語言
關(guān)系表達式
投影:πA1,A2,?\pi _{A_1,A_2,\cdots}πA1?,A2?,??
選擇:σC\sigma _CσC?
自然連接:公共屬性相同的行保留,去掉重復列
θ\thetaθ 連接:不去重復列(比如用 R.A, S.A 表示),根據(jù)條件保留行
重命名:ρs(A1,A2,?)(R)\rho _s (A_1,A_2,\cdots) (R)ρs?(A1?,A2?,?)(R) 將R重命名為S,其屬性重命名為A1, A2…,也可省略S或A1, A2…
賦值:R(a1,a2) := <表達式>
關(guān)系表達式樹
表達式->表達式樹:表達式由外及里,表達式樹自上到下
表達式樹->表達式:表達式樹自下到上,表達式由里及外
查詢優(yōu)化
順序:選擇、投影、連接
注意:先畫連接關(guān)系(簡單理解為找輸入-輸出-連接),確定連接個數(shù),是對直接連接再選擇和投影的優(yōu)化。在表達式中,可以用交、并、差運算,若題目中出現(xiàn)“沒有”字樣,則用差運算。
Students(Sno,Sname,Ssex,Sage,Sdept)
Courses(Cno, Cname, Cpno,Ccredit)
SC(Sno,Cno,Grade)
Q: 查詢選修了以2號課為先修課的課程的學生的名字?
輸入條件:2號課 Courses.Cpno=‘2’
輸出:學生的名字 Students.Sname
連接:Courses.Cno -> SC.Cno, SC.Sno -> Students.Sno
在連接前,先做選擇和投影即可。
關(guān)系數(shù)據(jù)庫設(shè)計理論
求屬性集合的閉包
求某關(guān)系的所有候選碼/所有非平凡函數(shù)依賴
求FD的最小基本集
FD右邊分解為單一屬性
去除能由其他FD推出的FD(整體最小化)
去除FD左邊多余的屬性(局部最小化)
兩種方法判定是否多余:(計算閉包是不用像2那樣除去FD)
求左邊屬性的閉包,閉包是否包含右邊所有屬性,若包含則左邊其余屬性多余
去除左邊某個屬性,觀察新FD集和原FD集是否依然等價
(去除左邊那個屬性后的新FD集是否能推出原FD集),若等價則該屬性多余
重復2-3,直到不能再化簡為止
投影依賴的計算
BCNF
定義
當且僅當所有非平凡FD的左邊均包含任意一個候選碼,或者說所有非平凡FD都是超碼。
滿足BCNF,則一定滿足NF-1、2、3,即不存在非主屬性對主屬性的部分依賴、傳遞依賴,主屬性間不存在部分依賴、傳遞依賴。
注意:任何二元關(guān)系都滿足BCNF。
分解算法
假定輸入的FD集已經(jīng)為最簡,否則需要最小化FD集。
根據(jù)定義找BCNF違例
先確定所有候選碼,再找違例
對違例進行分解
如違例 X->Y,X 中不包含候選碼,那么求 X+,由X+組成一個分組,另一個分組由X和不在X+的其他屬性組成,也就是說X要在兩個分組中均存在,以此作為分解后二者連接的依據(jù)。求X+并組成一個分組也就是希望這個分組盡量滿足BCNF,分解到最后一定能滿足BCNF
最小化兩分組的FD集,求投影FD集,遞歸進行1-2分解,直到所有分組滿足BCNF
R(ABCD), {AB-C,C-D,D-A}
A+={A},B+={B},C+={C,D,A},D+={D,A}
{AB}+={ABCD},{AC}+={A,C,D},{AD}+={A,D}
{BC}+={B,C,D,A},{BD}+={B,D,A,C},{CD}+={C,D,A}
{ABC}+=-,{ABD}+=-,{ACD}+={C,D,A},{BCD}+=-
{ABCD}不必考慮,肯定是平凡依賴
注意:{ABC}+、{ABD}+、{BCD}+可由{AB}+={ABCD}…等直接得出,無需再計算
而且,{ABC}+、{ABD}+、{BCD}+是超碼,不算入候選碼中,所以結(jié)果用-表示
A+={A},B+={B},{AD}+={A,D},{ACD}+={C,D,A}是平凡依賴,不考慮
候選碼:AB,BC,BD
除去上述超碼、平凡依賴、候選碼后,剩余的:
C+={C,D,A},D+={D,A}
{AC}+={A,C,D},{CD}+={C,D,A}
此時,BCNF違例為
C-D,C-A,D-A,AC-D,CD-A
選擇一個違例進行分解,應當經(jīng)可能向右邊添加屬性,以減少工作量
選擇C-DA進行分解,{C}+={ACD}
則分解為R1{ACD},R2{BC}
計算R1投影的函數(shù)依賴
A+={A},C+={CDA},D+={DA}
{AC}+=-,{AD}+={AD},{CD}+=-
候選碼:C
BCNF違例:D-A
{D}+={DA}
分解為R11{AD},R12{CD}
又知,二元關(guān)系肯定滿足BCNF,所以分解結(jié)果{BC},{AD},{CD}
3NF
定義
BCNF放寬要求,要么FD左邊是超碼,要么FD右邊全是主屬性。
分解算法
若沒有一個分組包括原關(guān)系的候選鍵,則添加一個分組,分組為任一候選鍵,一次確保無損連接性
注意:該分解算法具有無損連接和依賴保持性質(zhì)。
R(ABCDE), {AB-C,C-B,A-D}
最小化基本集:
{A}+={AD},{B}+={B},所以AB不多余,也沒有FD是多余的,所以已經(jīng)最小化
那么,{ABC},{BC},{AD},其中{BC}是{ABC}的子集,所以刪除
計算候選鍵:
AB+=ABCD,AC+=ABCD, 顯然,ABE和ACE是候選鍵
添加候選鍵,則分解結(jié)果為 {ABC}{AD},{ABE}或{ACE}
高級數(shù)據(jù)庫模型
ER模型建立
注意:一對多聯(lián)系,一方那段連線要畫箭頭。
多路聯(lián)系:箭頭指向的那個實體集,由其他實體集函數(shù)決定
多路聯(lián)系轉(zhuǎn)二元聯(lián)系:“聯(lián)系中心轉(zhuǎn)實體集,再添加多個聯(lián)系”
isa聯(lián)系:父類的主鍵一定在子類中出現(xiàn)
參照完整性約束:A–)B,說明A參照B,A一定要在B文中出現(xiàn),而且是一對一或者多對一(一方帶箭頭)
弱實體集:依賴一個實體集而存在,本質(zhì)上就是參照完整性約束,也就是說A的主鍵一定在B的主鍵中出現(xiàn)過,然后再為弱實體集設(shè)置一個主鍵,即弱實體集的主鍵由對應“強”實體集的主鍵和弱實體集的主鍵共同構(gòu)成(對比外鍵的概念即可)
注意:isa聯(lián)系和弱實體集的區(qū)別是,弱實體集本質(zhì)上是參照完整性約束,需要增加屬于弱實體集的主鍵部分,而isa聯(lián)系則不能改變父類的主鍵,子類都要繼承父類主鍵,可以添加其他屬性,但屬性不能成為子類鍵的一部分。
ER模型轉(zhuǎn)關(guān)系模式
聯(lián)系轉(zhuǎn)關(guān)系
聯(lián)系的屬性是和該聯(lián)系直接相連的實體的鍵。
多對一聯(lián)系,聯(lián)系的鍵為多方實體集的鍵;
多對多聯(lián)系,聯(lián)系的鍵為聯(lián)系的所有屬性;
一對一聯(lián)系,聯(lián)系的鍵為任意一方實體集的鍵。
(和“函數(shù)決定”理論相關(guān))
關(guān)系組合
上述聯(lián)系轉(zhuǎn)關(guān)系不一定是最優(yōu)的,比如“多對一”、“一對一”關(guān)系都可以合并
實體集轉(zhuǎn)化為另一個實體集的屬性,要求改實體集是全碼,否則會冗余
處理弱實體集
支持聯(lián)系無需轉(zhuǎn)化為關(guān)系,因為已經(jīng)“關(guān)系組合”到弱實體集的關(guān)系屬性中
子類結(jié)構(gòu)處理
對比:空值法占用空間最多,ER法有信息重復,面向?qū)ο蠓ㄕ伎臻g最少,且無重復。
ER模型設(shè)計原則
忠實性:設(shè)計要反映現(xiàn)實情況
Stars和Movies之間定義聯(lián)系Star-in,應該是多對多聯(lián)系;
不能把屬性“氣缸數(shù)”與stars聯(lián)系,卻可以把它作為汽車的屬性。
避免冗余:一件事在模型中只出現(xiàn)一次
在電影和電影公司之間用了聯(lián)系Owns。又把電影公司的名稱studioName選作電影實體集的一個屬性。
兩次表示“所屬的制片公司”這一同樣的事實
簡單性考慮:模型元素越少越好
選擇正確聯(lián)系:舍棄冗余、無關(guān)的聯(lián)系
選擇正確元素種類:用屬性還是用實體集?用實體集還是用聯(lián)系?屬性<–>實體<–>聯(lián)系
屬性代替實體集E的條件:
記憶:裝b剪連元(一個裝b的人剪斷了連在一起的元宵)= (裝)忠實性(b)避免冗余(剪)簡單性考慮(連)聯(lián)系(元)元素種類
ODL模型
class Movie {attribute string title;attribute integer year;attribute enum Genres{drama,comedy...} genre; // enum聲明枚舉型屬性genre,Genres為枚舉名稱// relationship聲明名為stars的聯(lián)系// Set<Star>為一對多聯(lián)系,表示一部電影有多個影星// inverse Star::starredIn 說明stars聯(lián)系為Star類中starredIn聯(lián)系的反向聯(lián)系relationship Set<Star> starsinverse Star::starredIn; relation Studio ownedByinverse Studio::owns; };class Star {attribute string name;attribute Struct Addr{string street, string city} addr; // Struct聲明結(jié)構(gòu)型屬性addrrelationship Set<Movie> inverse Movie::stars; };class Studio {attribute string name;attribute Star::Addr address; // 引用Star域的Addr結(jié)構(gòu)relationship Set<Movie> ownsinverse Movie::ownedBy; };注意:
類中元素有兩種:attribute和relationship,其后接類型和元素名
[attribute|relationship] <type> <ele_name>;
比如 relationship Set<Movie> owns inverse Movie::ownedBy 表示Studio中,有一組Movie,和Movie的ownedBy這個Studio類互為反向關(guān)系。
class CMM (key(k1,k2)) extends M1:M2 {relationship Array<...> rs_name;// CMM繼承了M1和M2的所有元素,并添加了自己的屬性 re_name// 用 key(k1,k2) 聲明了CMM的鍵(K1,K2) }代數(shù)和邏輯查詢語言
包上的關(guān)系操作
注意:包可以有重復
擴展操作符
消重:δ\deltaδ
聚集:MIN、MAX、AVG、COUNT、SUM
分組聚集:γA1,A2,agg(A3)→agg3,agg(A4)→agg4(R)\gamma _{A1,A2,agg(A3)\to agg3,agg(A4)\to agg4} (R)γA1,A2,agg(A3)→agg3,agg(A4)→agg4?(R) ,表示將R的A1和A2作為分組屬性,在A3和A4屬性上做agg聚合,聚合結(jié)果投影到agg3和agg4這兩列上,x→yx\to yx→y 表示將x重命名為y
投影擴展:πA?B→C(R)\pi _{A-B \to C}(R)πA?B→C?(R) 將R上A-B的結(jié)果重命名為C
排序:τB,C\tau _{B,C}τB,C? ,從小到大排序,按B,C屬性先后
外連:懸浮元組指的是不能和另一張表配對(配對指的是符合條件,比如自然連接需要符合名相同的列值相等的條件,theta連接需要符合特定條件)的本表元組。解題方法:先正常內(nèi)連(笛卡爾積+篩選),最后再加入各表的懸浮元組。左連和右連表示只保留左/右懸浮元組。!注意:如果是自然連接,要去除重復列,如果是theta連接,則不去除重復列,相同列名加前綴保留!
數(shù)據(jù)庫語言
SQL語法
字符串匹配通配符:%任意字符串(n>=0),_單個字母,[ ] 字符選擇,[^] 字符選擇的否定,兩個’‘表示一個’
排序:ORDER BY A1,A2 [DESC],默認升序,DESC降序
From:FROM (table1) new_name 在table名后為table命新名
交、并、差:INTERSECT、UNION、EXCEPT. 例如 (SELECT ...) INTERSECT [ALL] (SELECT ...), 注意:三者默認消重,若不希望消重,則應加[ALL]
比較運算符:用 ANY/ALL 對WHERE選擇的結(jié)果進行聚合
theta連接:SELECT...FROM ...JOIN...ON... ON 后為連接條件
自然連接:NATURE [FULL/LEFT/RIGHT] [OUTER] JOIN [ON]...
消重:SELECT DISTINCT ...
COUNT查不重復:SELECT COUNT(DISTINCT ...) FROM ...
查詢順序:select > from > where > group by > having > order by
插入查詢值:insert into <table_name> (select...)
修改:update ...set ...=..., ...=... where ...
字符串拼接:‘A’||‘B’
事務
保證事務正確執(zhí)行的ACID性質(zhì)
-
A(Atomicity)原子性
事務不可分割,事務中的操作要么都發(fā)生,要么都不發(fā)生(不可分)
-
C(Consistency)一致性
事務前后數(shù)據(jù)的完整性必須一致
-
I(Isolation)隔離性
并發(fā)事務間相互隔離,不相互干擾
-
D(Duration)持久性
一旦事務被提交,對數(shù)據(jù)的改變是永久性的
事務的隔離級別
| 讀未提交 read uncommitted | ? | ? | ? |
| 讀提交 read committed | ? | ? | |
| 可重復讀 repeatable read | ? | ||
| 可串行化 serializable |
約束與觸發(fā)器
斷言
本質(zhì)上,斷言就是對數(shù)據(jù)庫的全局的check約束。任何引起斷言為假的數(shù)據(jù)庫更新都將被阻止,且斷言的條件<condition>中不能有任何屬性,可以用自查詢和EXISTS做判斷。斷言的條件可能暫時為假(比如在事件的執(zhí)行過程中),在事件結(jié)束時再檢查斷言條件。
create assertion <ass_name> check (<condition>); -- 創(chuàng)建斷言 drop assertion <ass_name>; -- 刪除斷言check約束和斷言的對比
基于屬性的check約束:在某屬性上更新時檢查,對子查詢沒有約束效力;
基于表的check約束:在某表的任何一個屬性更新時檢查,對子查詢沒有約束效力;
斷言:對引起斷言條件變化的任何可能的更新檢查,對子查詢有約束效力,是基于數(shù)據(jù)庫的約束。
觸發(fā)器
create trigger <tg_name> -- 創(chuàng)建觸發(fā)器 [after|before|instead of] [options] on <tb_name> -- options是增刪改查,其中update可以加of,表示對某屬性的更新 referencing -- 聲明新舊元組/表old [row|table] as <old_name> -- 刪除操縱new [row|table] as <new_name> -- 插入操作-- 二者均存在:更新操作 for each [row|statement] -- 定義行/語句級觸發(fā)器 -- 行級觸發(fā)器每行觸發(fā)一次,而語句級觸發(fā)器每條語句出發(fā)一次 when(<condition>) -- 觸發(fā)條件(可以沒有),比如可以是 old.val<new.val begin -- (執(zhí)行語句,多條則用begin和end包括) ...; -- 比如 update <tb_name> -- set <col_name>=<new_name>.<col_name> -- where <col_name>=<old_name>.<col_name>; end;視圖與索引
視圖創(chuàng)建:create view <view_name>(newA1,newA2,...) as ... ,newA1、newA2給屬性重命名
視圖刪除:drop view...
視圖更新
只能更新 行列子集視圖:由單表導出的,含有其某些行列的視圖。必須要含有所有主鍵,因為主鍵不能為空。where子句不能查詢自己。可以在視圖上定義 instead of 觸發(fā)器從而解決一些更新異常。
索引
create index <index_name> on <tb_name>(<att1>,<att2>...) -- 創(chuàng)建索引 drop index <index_name> -- 刪除索引計算最佳索引
考慮上述員工表Staff上的索引,假定:Staff(sid,pay_rank,service_year)
員工編號sid是主鍵;(給定一個sid值,只可能查出1條元組,只需調(diào)入1個磁盤頁)
每個索引需占用2個磁盤頁
存儲關(guān)系Staff的磁盤頁為100,如果要檢查整個關(guān)系,則代價為100;
關(guān)系按照薪酬級別pay_rank聚合,這樣只需一次磁盤訪問操作就可以找到給定薪酬級別的員工;
每個service_year平均有5名員工,且平均分散在5個磁盤頁上;
僅需一次磁盤訪問就可讀取用于容納新元組的磁盤頁。在該關(guān)系上有如下形式的查詢
Q1: SELECT * FROM Staff WHERE sid = s;
Q2: SELECT * FROM Staff WHERE pay_rank=p;
Q3: SELECT * FROM Staff WHERE service_year=y;
I: 插入新元組到表staff中。
計算上面4種操作在無索引、sid索引、pay_rank索引、service_year索引和全索引5種情況下的平均操作代價,填入表1中。
無索引的情況下,任何Q查詢都需要訪問所有100個磁盤頁,遍歷所有數(shù)據(jù)頁。
有索引時,先讀入索引,消耗一次訪存(本題是兩次,因為每個索引需占用2個磁盤頁),再根據(jù)索引直接讀對應的磁盤頁(一次),索引Q1和Q2在有相應索引時是3=2+1。
而Q3,每個service_year平均有5名員工,且平均分散在5個磁盤頁上,所以要讀入5個磁盤頁,7=2+5。
無索引插入,讀一頁,寫回一頁,兩次訪存。有索引插入,讀+寫回索引2次,每個索引2頁,4次,加上數(shù)據(jù)讀和寫回2次,共6次。全索引插入,讀+寫回索引2次,每個索引2頁,3個索引,12次,14=12+2.
| Q1 | 100 | 3 | 100 | 100 | 3 |
| Q2 | 100 | 100 | 3 | 100 | 3 |
| Q3 | 100 | 100 | 100 | 7 | 7 |
| I | 2 | 6 | 6 | 6 | 14 |
服務器環(huán)境下的SQL
嵌入宿主語言的SQL
// **游標更新** // 查看MovieExec的每個元組,決定刪除還是將其凈資產(chǎn)翻倍 #define NO_MORE_TUPLE !(strcmp(SQLSTATE,"02000")) // 宏定義,游標取完的標識void changeWorth(){// 共享變量聲明EXEC SQL BEGIN DECLARE SECTION;int certNo,worth; char SQLSTATE[6]; // SQLSTATE 返回SQL狀態(tài),5個字節(jié)EXEC SQL END DECLARE SECTION;EXEC SQL DECLARE execCursor CURSOR FOR <query>; // 聲明游標:declare <cursor_name> cursor for ...查詢語句,也可以直接是一個表名EXEC SQL OPEN execCursor; // 開啟游標 open <cursor_name>// 進入循環(huán)while(1){// 取數(shù)據(jù) fetch from <cursor_name> into [:share_variables]...;EXEC SQL FETCH FROM execCursor INTO :certNo, :worth;// SQL語句中使用共享變量要加:if(NO_MORE_TUPLE) break; // 跳出條件,fetch查完了if(worth<10000)EXEC SQL DELETE FROM MovieExec WHERE CURRENT OF CURSOR; // 使用游標,where只能用CURRENT OF CURSORelseEXEC SQL UPDATE MovieExec SET netWorth=2*netWorth WHERE CURRENT OF CURSOR;}// 關(guān)游標EXEC SQL CLOSE execCursor; }存儲過程
計算某電影公司制作的影片長度的平均值和方差
-- **方差=\sum x_i^2/n-\bar{x}^2 -- loop循環(huán)結(jié)構(gòu),需要寫退出條件 delcare NOT_FOUND condition for sqlstate '02000' create procedure MeanVar( -- 存儲過程創(chuàng)建in s char(15),out mean real,out variance real-- 聲明參數(shù),輸入/輸出,[in|out|inout] <param_name> <type>-- SQL中,變量名在前,類型在后 ) -- 局部變量聲明 declare NOT_FOUND condition for sqlstate '02000'; -- 循環(huán)退出條件聲明 declare MV cursor for select lenth from movies where studioName=s; -- 游標聲明 declare MC integer; declare newlenth integer; -- 注意:在存儲過程聲明中創(chuàng)建的輸出參數(shù)不需要重復聲明 -- 程序體 begin-- 存儲過程中賦值操作用setset mean=0.0;set variance=0.0;set MC=0;set newlenth=0;-- 開游標open MV;movieloop:loop-- loop循環(huán),<loop_name>:loop ~~~ end loop;-- 取數(shù)據(jù)fetch from MV into newlenth;-- 判退出if NOT_FOUND then leave movieloop end if;-- 數(shù)據(jù)處理set MC=MC+1;set mean=mean+newlenth;set variance=variance+newlenth*newlenth;end loop;-- 關(guān)閉游標close MV;-- 輸出set mean = mean/MC;set variance = variance/MC - mean*mean; end; -- for 循環(huán)結(jié)構(gòu),無需寫退出條件 -- for <loop name> as <cursor name> cursor for <query>; -- do <statement list> -- end for; -- 1. 創(chuàng)建存儲過程 create procedure (-- 2. 填寫參數(shù):輸入輸出in s char(15),out mean real,out variance real ) -- 3. 局部變量聲明,因為是for循環(huán),所以不用聲明退出條件變量 declare MC int;-- 開始語句,記得加begin和end begin-- 4. 變量賦初值(包括輸出變量)set MC = 0;set mean = 0.0;set variance = 0.0;-- 5. 創(chuàng)建for循環(huán),在for循環(huán)中創(chuàng)建游標,注意for循環(huán)的尾部有個 ;for movieLoop as MV cursor for select lenth from movies where studioName=s;-- 6. 定義數(shù)據(jù)處理do-- 注意:for循環(huán)不用取數(shù)據(jù)了,可直接使用上述select的屬性set mean = mean + lenth;set variance = variance + lenth*lenth;set MC = MC + 1;end for;set mean = mean/MC;set variance = variance/MC + mean*mean; end;記憶(一般模式):
-- 1. 創(chuàng)建存儲過程 create procedure(-- 2. 聲明輸入輸出參數(shù) ) -- 3. declare 聲明局部變量 declare ...; -- 4. 如果是loop,那么要聲明退出條件變量 declare ... condition for sqlstate '02000';-- 5. 寫操作體 begin -- 6. 初始化變量和參數(shù) set ... = ...; -- 7. 開游標(loop循環(huán)) -- 8. 寫loop循環(huán)<loop_name>:loop-- 8.1 取數(shù)據(jù)fetch from <cursor_name> into ...;-- 8.2 判退出if NOT_FOUND then leave <loop_name> end if;-- 8.3 數(shù)據(jù)操作...;end loop;-- 8.4 關(guān)游標 -- 9. 寫for循環(huán)for <loop_name> as <cursor_name> cursor for <query>;-- 9.1 寫循環(huán)體do...;end for; -- 10. 后續(xù)操作 end;關(guān)系數(shù)據(jù)庫安全機制
授權(quán)和銷權(quán)
<權(quán)限>:ALL PRIVILEGES 表示所有權(quán)限
<數(shù)據(jù)庫元素>:除了表和視圖以外,其余數(shù)據(jù)庫元素應當加上 <類型>,即<類型><元素名稱>
-- 授權(quán) grant <權(quán)限> on <數(shù)據(jù)庫元素> to <用戶1>,<用戶2>... [with grant option]; -- 銷權(quán) revoke <權(quán)限> on <數(shù)據(jù)庫元素> from <用戶1>,<用戶2>... [cascade];習題10.1.1解答 Chegg
In SQL there are nine types of privileges, those are:
- SELECT
- INSERT
- DELETE
- UPDATE
- REFERENCES
The statement Select-From-Where always requires the SELECT privileges on every table on which it queried or accessed.
On other hand REFERENCES privileges on a relation , which it refers to that relation in an integrity constraint.
Not only reference to relation but also it will consider some other form as referential integrity constraint or assertions or tuple based checks etc.
授權(quán)圖
注意事項:
——??Sylvan Ding ??
總結(jié)
以上是生活随笔為你收集整理的数据库系统原理复习提纲的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JSP执行流程
- 下一篇: Pensando Distributed