《數據庫系統概論(第五版)》學習資料
一、第一章
1.數據:描述事物的符號記錄
2.數據庫:長期儲存在計算機內、有組織、可共享的大量數據集合。
(數據庫中的數據按一定的數據模型組織、描述和儲存,具有較小的冗餘度、較高的數據獨立性和易擴展性,並可供各客戶共享)
3.數據庫管理系統(DBMS)主要功能:數據的定義功能,數據的組織、存儲和管理,數據操縱功能,數據的事務管理和運行管理,數據庫的建立功能和維護功能,其他功能。
4.數據庫系統(DBS):數據庫、數據庫管理系統、應用程序、數據庫管理員。
5.數據管理技術的技術產生和發展:人工管理階段、文件系統階段、數據庫系統階段。
6.數據庫系統階段優點:數據結構化,數據的共享性高、冗餘度低且易擴展,數據獨立性高,數據由數據庫管理系統統一管理和控制。
7.2類模型圖 第一類:概念模型 第二類:邏輯模型和物理模型
8.概念模型:實體、屬性、碼、實體型、實體集、聯繫。
9.概念模型的一種表示方法:實體-聯繫方法(E-R模型)。
10.常用的邏輯模型:層次模型、網狀模型、關係模型。
11.關係模型的概念:
(1)關係模型的數據以規範化的二維表表示
(2)術語:關係(表)、元組、屬性、碼、分量、域、關係模式。
12.數據庫系統模式概念:
(1)型:指對某一類數據結構和屬性的說明
(2)值:是型的一個具體賦值。
(3)模式:是數據庫中全體數據的邏輯結構和特徵描述,
(4)實例:模式的一個具體值爲一個實例。
(模式是相對穩定的,實例是相對變動的)
13.外模式:也稱子模式,它是數據庫用戶的數據視圖
14內模式:也稱存儲模式,一個數據庫只有一個內模式。是數據物理的結構與存儲方式描述。
15.數據庫系統的組成:硬件平臺及數據庫、軟件、人員(數據庫管理人員、系統分析員和數據庫設計人員、應用程序員、用戶( 偶然用戶簡單用戶、複雜用戶)).
二、 第二章
1.關係模型術語:
(1)域:是一組具有相同數據類型的值的組合。
(2)笛卡兒積:一組域D1,D2,…,Dn,D1xD2x…xDn={(d1,d2,…,dn)|di∈Di,i=1, 2,…,n}
(3)關係:D1xD2x…xDn的有限子集叫做在域D1,D2,…,Dn上的關係,表示R(D1,D2,…,Dn)
2.關係:候選碼、主碼、主屬性、非主屬性、空值。
3.關係的6條性質:
(1)列是同質的,即每一列中的分量是同一數據類型,來自同一個域。
(2)不同的列可以是同一域,稱其中的一列爲一個屬性,不同的屬性給予不同的屬性名。
(3)列的順序無所謂
(4)任意兩個候選碼的值不可以選同一個值。
(5)行的順序無所謂。
(6)分量必須是原始值,不可以是數組矩陣。
4.關係模式:對關係的描述, 屬於型的範疇, 包關係名,各屬性名,域,碼等。
5.關係數據庫:存儲實體和聯繫。
6.關係的基本操作:查詢(選擇、投影、除、並、差、笛卡兒積、交連)、插入、修改、刪除
7.關係數據語言:關係代數語言、關係演算語言,具有雙重特點的語言(SQL)
8.關係的完整性:
(1)實體完整性
(2)參照完整性:若屬性F是關係R1的外碼,它與關係R2的主碼K相對應,則對於R1中的每個元組在F上的值必須:或者取空值\或者取R2中主碼K的某個值.
(3)用戶定義完整性:針對某一具體函數庫的約束條 件,它反映某一具體函數應用所涉及的數據必須滿足的語義要求。例如某個屬性必須取唯一值、某個非主屬性不能取空值。
9、10都是關係代數語言。
9.二目運算:
(1)並:設關係R與關係S有相同的屬性, 它們的併爲:R U S = {t | t ∈ R V t ∈ S}
(2)差:設關係R與關係S有相同的屬性, 它們的差爲:R – S = {t | t ∈ R ∧ t ∈ S}
(3) 交:設關係R與關係S有相同的屬性, 它們的交爲:R ∩ S = {t | t ∈ R ∧ t ∈ S}
(4) 笛卡爾積:設關係R是m度的, 關係S是n度的, 它們的笛卡爾積爲(m+n度):R X S ={trts | tr
∈ R ∧ ts ∈ S}
10.專門運算關係:
(1)選擇(單目運算):σSdept= ‘IS’(S) 查找S表中信息系(IS)全體學生,其中Sdept爲屬性-所在系。
(2)投影(單目運算):∏Sname,Sdept(S) 查找S表中學生姓名和所在系兩個屬性。
(3)連接(二目運算):是從兩個關係的笛卡兒積中選取屬性間滿足一定條件的元組。P54(非等值連接、等值連接、自然連接)
(4)除法運算(二目運算):關係R和S相除應滿足S的屬性應爲R的屬性的真子集, 即R(X,Y) ÷S(Y) 。
11.基本運算:並, 差, 笛卡爾積, 選擇, 投影
非基本運算:交、連接、除法。
三. 第三章
1.SQL的特點:
(1)綜合統一:集數據的定義、操縱、控制於一體。
(2)高度過程化。
(3)面向集合的操作方式
(4)一同語法結構提供多種使用方式
(5)語言簡潔、易學易用
2.
3.修改基本表:
alter table <表名>
[add <新列表> <數據類型><完整性約束>] //加入一列到已存在的表中
[drop column <列名>]//刪除已存在表中的某一列
[modify<列名><數據類型>];//修改已存在表中的某一列
[change <原列名><新列名><數據類型>] //修改列名
a) 修改表S的屬性Sname 的類型爲8個字符串
alter table S modify Sname char(8);
b) 重命名S的屬性sname爲Sname
alter table S change sname Sname varchar(8) not null;
c) 刪除表S的屬性sdept
alter table S drop column sdept;
d) 添加表S的屬性sdept
alter table S add sdept char(2) not null;
4.刪除基本表:drop table<表名>
5.數據查詢:
select[all|distinct] <目標列> from<表名>
[where<條件表達式>]
[group by<列名1>[having<條件表達式>]]
[order by <列名2>[asc|desc]];
① 查詢全體學生的學號與姓名
select sno,sname from S;
② 查詢全體學生的姓名、學號、所在系
select sname,sno,sdept from S;
③ 查詢計算機系(CS)、數學系(MA)、信息系(IS)學生的姓名和性別.
select sname,sage from S where Sdept IN(‘CS’,’MA’,’IS’ );
(‘in’相當於多個’or’)
④查詢不是計算機系(CS)、數學系(MA) 、信息系(IS) 學生的姓 名和性別。
select sname,sage from S where Sdept not IN(‘CS’,’MA’,’IS’ );
⑤查詢年齡在20~23歲之間的學生姓名、系別和年齡
select sname,sno,sdept from S where sage between 20 and 23;
⑥查詢所有課程名爲’數據’開頭且四個漢字的課程信息.
select cname from C where cname like’數據%’;
(not like所有不是以’數據’開頭的課程名;% 任意長度字符串。
_ 任意單個字符串;\ 換碼字符 \_緊跟在\後的_不再爲任意單個字符串,僅爲’_’字符)。
⑦查詢所有沒有先修課的課程號和課程名。
select cname,cno from C where cpno is null;
(‘is’不可以用’=’代替,null不等於任何值。’is not null’有先修課)。
⑧查詢選修了3號課程的學生學號及其成績, 結果按分數的降 序排列。
select sno,grade from SC where cno=’3’ order by grade desc;
6.聚集函數:count,sum,avg,max,min.
(1)查詢學生的總人數.
select count(*) from S;
(2)查詢選修了課程的學生人數.
select count(distinct sno) from S; (‘distinct’重複的只記一次)。
(3)計算3號課程的學生平均成績。
select avg(grade) from SC where cno=’3’;
(4)求有學生選修的各個課程號及相應的選課人數大於10.
select cno,count(sno) from SC group by cno having count(*)>10;
(‘group by cno’所有有相同cno值的元組爲一組;’having count(*)>10 ‘每組中的元組大於10)。
(5) 查詢有掛科的學生學號和平均成績,並按平均成績降序排列.
select sno,avg(grade) from SC
group by sno
having min(grade<60)
order by avg(grade) desc;
(6)查詢無掛科的女學生學號,及修讀課程門數,並按照修讀課程門數升序排序
select sno,count(cno)
from SC
where grade>60 and sno IN
(select sno
from S
where ssex='女')
order by count(cno);
7.連接。
(1) 查詢每一門課的間接先修課.
select c1.cno,c2.cpno
from course c1,course c2
where c1.cpno=c2.cno;
(2) 查詢所有學生及其選修課程的情況
select S.*,SC.cno,SC.grade
from S,SC
where S.sno=SC.sno;
8.>any 大於子查詢結果中的某個值 ;>all 大於子查詢結果中的所有值
9.數據刷新
(1)在表S中插入你的信息
insert into S values ('17670109','黃現彤','女',20,'CS'); //char類型都需要用引號
(2) 將system.s中‘cs’系的且年齡小於24的學生插入到你的表s中
insert into S s1
select *
from system.S s2
where s2.sdept='CS' and s2.sage<24;
(3)將男學生的年齡增加一歲
update S set sage=sage+1 where ssex='男';
(4)刪除學生’201215126‘
delete from S where sno='17670109';
(5) 由你的表s建立視圖S_SEX,統計男女學生的人數,最大,最小年齡.(視圖沒有存進系統,只把定義存進了系統,類似於桌面的快捷鍵)
create view S_AEX(sex,count,max,min)
as select sex,count(sno),max(sage),min(sage)
from S
group by ssex;
10.drop table是DLL語句,DLL自動commit;
delete from是DML語句,還沒存入盤中。
四、第四章
1.數據庫不安全因素:非授權用戶對數據庫的惡意存取和破壞、數據庫中重要或敏感的數據被泄露、安全環境的脆弱性。
2.數據庫的安全性控制,防止數據泄露、更改或破壞,方法有:用戶身份鑑別、靜態口令鑑別、動態口令鑑別、生物特徵鑑別、智能卡鑑別。
3.存儲控制:定義用戶權限、合法權限檢查。
4. 授權(GRANT)與收回(REVOKE):針對系統權限和對象權限。授予某用戶對某個對象以某種權限, 對象可以是表、視圖、存儲過程等 權限可以SELECT,INSERT,DELETE ,UPDATE等 DBA擁有所有權限,對象的創建者擁有此對象的所有權限。
5.授予:
grant <權限> [,<權限> ]…
on <對象名>
to <用戶>[,<用戶>]…
[WITH GRANT OPTION];
收回:
revoke <權限> [,<權限> ]
on <對象名>
from <用戶>[,<用戶>]…;
6.(1) 把查詢S表的權限授給你的同伴.
grant select
on S
to s17670102 ;
(2) 把插入S表和修改S中’所在系別’的權限授給你的同伴
grant insert,update (Sdept)
on S
to s17670102 ;
7.數據庫角色是被命名爲的一組與數據庫操作相關的權限,角色是權限的集合。
8.數據庫角色的創建:
① 角色的創建
② 將一個角色授予其他用戶或角色
③ 給角色授權
④ 角色權限收回
五、第五章
1.數據庫的完整是指數據的正確性和相容性。
2.DBMS必須能夠:
(1)提供完整性的機制,定義完整性時可以給完整性取個名字
(2)完整性檢查
(3)違約處理
3.參照完整性:參照表中插入元組、修改外碼值可能破壞參照完整性。被參照表中刪除元組、修改主碼值可能破壞參照完整性。
4. (1)增加表SC對S、C的外鍵約束
alter table sc
add (foreign key(sno) refrences s(sno),
foreign key(cno) refrences c(cno));
(2)將system.c中的值插入你的C
insert into c
select *
from system.s;
(3)增加表C中cpno對cno的外鍵約束
alter table C
add constraint C1 foreign key(cpno) references c(cno);
(4)在表SC中插入system.sc的相應記錄
insert
into sc
select *
from system.sc sc2
where sc2.sno in
(
select sno
from s
);
(5)在表S中增加完整性約束:性別只允許取男或女,男學生的年 齡在17~28之間,女學生的年齡在16- 30之間
alter table s
add constraint sexage check( (ssex='男' and sage between 17 and 28) or
(ssex='女' and sage between 16 and 30) );
(6)在表S中將你的年齡改爲16
update s
set sage=16
where sno='17670109';
六、第六章
1.第一範式(1NF):關係作爲一張二維表,每個分量必需是不可分數 據項。
2.第一範式存在的問題:數據冗餘、更新異常、插入異常、刪除異常
3.第二範式(2NF):如果關係模式R屬於1NF,且每一個非主屬性都完全依賴於主碼,則稱關係R是屬於第二範式的,記作R屬於2NF。
4.第二範式存在的問題:數據冗餘、更新異常、插入異常、刪除異常
5. 第三範式(3NF): 如果關係模式R屬於2NF,並且R中的非主屬性不傳遞依賴與R的主碼,則稱關係R是屬於第三範式的.(非主屬性必須直接依賴於主碼,不能存在通過其他非主屬性傳遞依賴於主碼)
6. (1)若一個關係其非主屬性之間存在函數依賴, 則一定不是第三範式
(2)若一個關係只有一個或兩個屬性, 則一定是第三範式.
7. 導出屬性:關係中有些屬性是由其他屬性通過公式計算而得, 這樣的屬性。(導出屬性不可分解出來, 即使關係僅爲第二範式)
8. 模式分解既要”保持函數依賴性”,又要具有“無損連接性”。
保持函數依賴性:是指分解後的關係的函數依賴和分解前的函數依賴一樣,沒有丟失。
無損連接性:是指分解後的關係自然連接後等於分解前的。
9. (1)1NF ► 2NF 將部分函數依賴於主碼的非主屬性和相應的決定 屬性分解出來,決定屬性作爲分解的公共屬性
(2)2NF ► 3NF 將傳遞函數依賴的中間屬性作爲公共屬性
10. 從E-R圖向關係模型的轉換
(1) 一個實體集轉換爲一個關係模式,實體的屬性就是關係的屬性,實體的碼就是關係的碼。
(2)對於實體集間的聯繫有:
①1:1聯繫
不生成一個關係, 且把聯繫兩端的實體集合併爲一個關係.
②1:N聯繫
不生成一個關係, 把1端的實體集關係碼複製到N端的實 體集關係中作爲外碼, 聯繫的屬性也是N端的關係屬性
③ M:N聯繫
生成一個關係, 聯繫兩端實體集的碼是此關係的屬性,並 分別作爲外碼, 聯繫的屬性也是此關係的屬性
④ 3個及以上實體集間的聯繫
生成一個關係,與聯繫相關的實體集的碼是此關係的屬性聯繫的屬性也是此關係的屬性
(3)有相同碼的關係模式可合併。
七、 第七章
1.數據庫設計概述:
(1)技術、管理、數據相結合
(2)結構設計和行爲設計相結合
2.數據庫設計的基本步驟:
(1)需求分析
(2)概念結構設計
(3)邏輯結構設計
(4)物理結構設計
(5)數據庫實施
(6)數據庫運行和維護
八、第八章
1.數據庫編程概述:標準的SQL是非過程化的查詢語言。SQL編程語言是指過程化的SQL,有嵌入式SQL、PL/SQL、ODBC、JDBC。
2.PL/SQL的結構:塊結構以’/’結束
定義: declare 執行:begin exception end;
3.變量和常量的定義:
變量名 數據類型 [[NOT NULL]:=初值];
常量名 constant 數據類型:=常量值;
4.賦值語句: 變量名:=<表達式>;
5.條件語句
if <條件>
then <語句序列1>
[else <語句序列2>]
end if;
/
6.循環語句
(1)for-loop循環
for 循環變量 in [reverse] 下界..上界
loop
<循環體>
end loop;
/
(2)while-loop循環體
while <條件>
loop
<循環體>
end loop;
/
(3)loop循環
Loop
<循環體>
end loop; //用exit 結束循環
/
7.存儲過程包括過程和函數。
8.過程:
(1)過程的建立
create [or replace] procedure 過程名[參數表] as
<PL/SQL塊> (此PL/SQL塊中不寫保留字declare)
(2)過程的調用執行
call 過程名 [(參數表)];
(3)過程的修改
create or replace procedure 過程名..
(4)過程的刪除
drop procedure 過程名;
9.函數:
(1)函數的建立
create function 函數名 [(參數表)] as
<PL/SQL塊>
//此PL/SQL塊不寫保留字declare
此PL/SQL塊中有return語句
(2)函數的調用
函數名 [(參數表)];
10.存儲過程中的優點
(1)存儲過程是事先編譯好的,執行時效率高
(2)模塊化設計有利於系統開發維護
(3)存儲過程中有利於數據庫安全性
(4)存儲過程中降低了客戶端和服務端的通信量
(5)方便實施企業規則
11.(1)創建過程ccb(N int),在表cb中插入從50開始的正偶數及相應的平方、立方,(若正偶數爲10的倍數,則相應平方取負數),直到其立方數最接近且小於N,i中存放行號。
create or replace procedure ccb (N int) as
K INT;
J INT:=50;
S INT;
C INT;
BEGIN
SELECT MAX(i) into K FROM cb ;
K:=K+1;
S:=J*J;
C:=S*J;
WHILE C<N LOOP
IF (J MOD 10)=0 THEN
S:=S*-1;
END IF;
insert into cb values(K,J,S,C);
J:=J+2;
S:=J*J;
C:=S*J;
K:=K+1;
END LOOP;
END;
(2) 以參數爲300000調用此過程。
call ccb(300000);
(3)授權你的同伴可運行此過程。
grant execute on ccb to s17670102;
(4)以參數爲600000調用你同伴的過程。
call s17670102.ccb(600000);