數據庫系統概論書本基礎知識


                                                                                                         數據庫系統概論復習重點

                                                                                                               第一章 緒論

1. 實體:客觀存在並且相互區別的事物,例如:一個學生,學生的一次選課

2. 屬性:實體所具有的某一特性,例如學生的成績

3. 碼:唯一標識實體的屬性集,例如學號是學生實體的碼

4. 實體型:用實體名及其屬性集合來抽象和刻畫同類實體,例如學生(學號,姓名,性別.......等)

5. 概念模型的表示方法:E-R

6. 信息世界抽象出概念模型,機器世界根據概念模型得到數據模型

7. 數據模型:由數據結構,數據操作,數據完整性約束條件組成

8. 關系模型的數據結構:

關系:即我們說的一張表(不允許表內部還有表)

元組:表的一行

屬性:表的一列

碼:唯一確定一個元組,如學號

分量:元組中的一個屬性值

關系模式:例如:學生(學號,姓名,性別,班級)

 

                                                                                                  第二章 關系數據庫

.傳統的集合運算(二目運算)(以關系R和關系S為例,二者都有n個屬性,並且屬性取自用一個域,下同)

1.並:結果由屬於R或者屬於S的元組組成,但是要去除重復的元組

2.差:結果由屬於R但是不屬於S的所有元組組成

3.交:由既屬於R又屬於S的元組組成

4.笛卡兒積:域上的集合運算

總結:傳統的集合運算是二目運算,包括並,差,交,笛卡兒積四種

 

二.專門的關系運算

1. 選擇:從關系中選取使特定邏輯表達式為真的元組

2. 投影:關系R上的投影是從R中選若干屬性列組成新的關系

3. 連接:從需要連接的關系的笛卡兒積中選滿足條件的元組,常用的有等值連接和自然連接

4. 除:R除以S等於T

要求:T包含所有在R但是不在S中的屬性和值,且TS的笛卡兒積必須在R

 

             

 

                                                                    第三章 關系數據庫標准語言SQL

一.查詢:

1..單表查詢:查詢課程平均成績大於所有同學課程平均成績的同學的學號

select sno

from SC

group by

having avg (grade)>= all (select avg(grade)

                          from SC

  group by sno)

--在使用group by 分組的時候,where 是針對符合條件的元組的,而having是針對符合條件的分組的該例也使用了嵌套查詢

 

2. 連接查詢:查詢選修二號課程的同學的學號和姓名

select Student.sno,sname

from Student,SC

where Student.sno=SC.sno and con='2'

--找到課程號為2的元組,且這些元組的學號等於Student表里面的學號,然后投影這些元組的sno,sname屬性

3. 嵌套查詢:查詢選修二號課程的同學的學號和姓名

select sno,sname

from Student

where son in (select sno

                  from SC

  where con='2')

--先在SC表里面找到課程號為2的同學的學號,然后將找到的學號傳遞給Student表,然后根據傳遞的學號在Student表中尋找該學號的學生的學號和姓名

4. exists嵌套查詢:查詢選修二號課程的同學的學號和姓名

select sno,sname

from Student

where exists (select *

              from SC

  where sno=Student.sno and con='2')

--先在內部循環查詢課程號為2的同學是不是存在,若存在則在exists處返回True,就返回該學生元組的所有信息,然后打印該元組的sno和sname屬性,若不存在則在exists處返回false,后面就不會返回元組信息

5. 雙重exists嵌套查詢:查詢選修了所有課程的同學

select sname

from Student

where not exists (select * 

                  from Course

  where not exists (select *

                    from SC

where SC.sno=Student.sno and SC.cno=Course.cno))

--對於這個雙重exists嵌套循環個人的理解是這樣的:先在最內層循環尋找Course表中有的課程看SC表里面有沒有同學全部選了,not exists的意思是里面沒有找到就寫進去,因為有兩個exists,所以雙重否定表肯定,意思就是寫進去

三.視圖:從一個或幾個基本表導出的表,是虛表,視圖中的數據仍然存放在基本表中,透過視圖可以查看自己感興趣的數據

視圖是一個虛表,也可以通過這個表進行查詢,插入,刪除和修改

1.行列子集視圖(一個表中截取某些行和列)

create view bt_s(sno,sname)

as 

select sno,sname

from Student

where age>=18;

2.分組視圖(含有group by語句的視圖)

create view s_g(sno,gavg)--括號內部是視圖列名

as 

select Student.sno,avg(grade)

from Student,SC

group by Student.sno;

                       

                                                                                      第四章 數據庫安全性

一.用戶的創建和權限操作

1.用戶的創建

create user u1 for login a

2.用戶權限的操作

具體參考附帶文件

(本章重點在用戶的創建及對權限操作的部分)

                                                                                       第五章 數據庫的完整性

1.斷言:為數據庫的完整性約束服務,任何使斷言不為真值的操作都會被拒絕執行

例:數據庫這門課程最多被60個同學選修

create assertion ASSE_SC_DB_NUM

check (60>=(select count(*)

            from Course,SC

where SC.cno=Course.cno and Course.cname='數據庫');   

2.觸發器:用戶定義在表上的一類由事件驅動的特殊過程(具體意思請理解觸發器三個字)

例:在Student表中如果插入的學生的age小於20,那么把該學生的age改為20

create trigger tri_age on Student

after insert

as

declare @age int ,@no char (12)

select @age=age,@no=sno from Student

begin

   if 

   @age<20 update Student set age=20 where sno=@no

   end;

 

                                                                                              第六章 關系數據理論

1.X->Y:X確定Y,Y依賴於X

2.函數依賴:平凡函數依賴,非平凡函數依賴,完全函數依賴,部分函數依賴

例:在關系(sno,cno,Grade)中

非平凡函數依賴:(sno,con)->Grade

平凡函數依賴:(sno,cno)->sno,(sno,cno)->cno////沒有包含Geade

例:X->Y,X’X的真子集

完全函數依賴:X’不確定Y

部分函數依賴:X’確定Y

3主,非屬性的區別:

主屬性:包含任意一個碼

非主屬性:不包含任意一個碼

4.范式

范式之間的關系是個同心圓,最外面是第一范式,依次往內部是二,三,BC,四范式

第一范式:屬性不可再拆分

 

第二范式:非主屬性對碼是完全依賴

例:關系S-L-C(sno,sdept,sloc,cno,Grade),函數依賴有:(sno,cno)->Grade,sno->sdept,(sno,cno,)->sdept,snp->sloc,(sno,cno)->sloc,sdept->sloc,其中碼是(sno,cno)

分析:sdept,sloc是非主屬性,碼中的cno確定不了這兩個非主屬性,即非主屬性對碼是部分函數依賴,所以S-L-C不是第二范式

現在我們來分析一下S-L-C,它包含有兩類的非主屬性,Grade與(sloc,sdept),Grade對碼是完全依賴,因為sno和cno確定Geade,而(sloc,sdept)對碼是部分函數依賴,所以我們分解一下:

SC(sno,cno,Grade)與SL(sno,sdept,sloc)

現在SC與SL都是屬於第二范式

 

第三范式:不存在非主屬性對碼有傳遞函數依賴

例子:接着上的例子來

SL中,sno可以確定sdept,而sdept可以確定sloc,存在傳遞函數依賴,所以SL不是第三范式

SC中 要求sno和cno一起才能確定Grade,所以不存在傳遞函數依賴,所以SC是第三范式

 

BC范式:要求每一個決定因素包含碼

例:在關系Y(C,B,D)中,C->B,C->D,碼是C

分析:決定因素是:C->B,C->D,都包含了C,所以是每一個決定因素都包含了碼,所以Y是BC范式

 

第四范式:不允許非平凡且非函數依賴的多值依賴

解析一下:就是允許非平凡且函數依賴的多值依賴(個人理解)

例子:WSC(W,S,C),W表示倉庫,S表示保管員,C表示貨物,W->->S,S->->C

分析;W->->S和S->->C都是非平凡的多值依賴,且碼是(W,S,C),全碼,不存在函數依賴,所以存在飛平凡且非函數依賴的多值依賴,所以WSC不是第四范式,現在我們來把WSC分解一下:WS(W,S)和WC(W,C),現在(W,S)中W->->S是平凡多值依賴,不存在函數依賴,所以不存在非平凡且非函數依賴的多值依賴,所以是第四范式,WC同理可得是第四范式

數據依賴的公理系統:

1.公理系統:

自反律:若Y屬於X,X屬於U,則X->Y

增廣律:若X->Y,那么XZ->YZ

傳遞律:若X->Y,Y->Z,那么X->Z

2.推理規則:

合並規則:若X->Y,X->Z,那么X->YZ

偽傳遞規則:X->Y,WY->Z,那么XW->Z

分解規則:若X->Y,Z屬於Y,那么X->Z

模式分解:

1.是否保持了函數依賴:通過分析分解之后的函數依賴,看能不能通過公理系統和推理規則推導出原來的函數依賴,如果能,則證明保持了函數依賴,否則就是沒有保持

2.是否保持了無損連接的特性:

例:已知R(U,F),U={A,B,C,D,E},F={AB->C,C->D,D->E},R的一個分解為R1(A,B,C),R2(C,D),R3(D,E),證明這個分解的連接具有無損連接的特性

解答:

我們先來構造初始表

A B C D E
a1 a2 a3 b14 b15
b21 b22 a3 a4 b25
b31 b32 b33 a4 a5

構造規律:行數為函數依賴的個數,所以3行,每行代表一個函數依賴,我們以AB->C為例,這個函數依賴中有A,B,C所以第一行的這三列填a,其余填b,后面兩行類似

現在開始修改表:還是以AB->C為例,這個函數依賴的右邊是AB,所以我們尋找A,B列,如果有相同的分量則C列全部修改為a

修改后的表:

A B C D E
a1 a2 a3 a4 a5
b21 b22 a3 a4 a5
b31 b32 b33 a4 a5

如果修改之后某行全為a,那么該分解具有無損連接的特性

所以該分解具有無損連接的特性,證明完畢

                                                                                    第十一章 並發控制

1.封鎖

排他鎖(X鎖):若事物T對對象A加上X鎖,則只允許T讀取和修改A,在T釋放A上的X鎖之前,其他事物不能對A加任何鎖,目的是保證在事物T釋放A上的X鎖之前其他事物不能讀取和修改A

共享鎖(S鎖):若事物T對對象A加S鎖,則只允許T讀取A而不能修改A,在T釋放A上的S鎖之前,其他事物只能對A加S鎖,目的是保證在事物T釋放對象A上的S鎖之前其他事物只能讀取而不能修改A

2.活鎖,死鎖

活鎖:某一個事物一直處於等待狀態,避免活鎖要采取先來先服務的策略

死鎖:某兩個事物互相等待,永遠進行下去,導致這倆個事物永遠不能結束

3.可串行化調度:某個調度與串行化調度的結果一樣,那么這個調度就叫做可串行化調度(正確調度)

4.怎么判斷一個調度是不是可串行化調度?

沖突可串行化是可串行話調度的充分條件

沖突:不同事物對同一個數據的讀寫和寫寫操作

 ------------------------------------------------------------------------------------------------------------------------------

下面是關於SQL語句的相關代碼(參考文件):

實驗一
   表的建立樣例
(1create  table  Student(
S#  char(12) primary  key,
Sname  char(8)  unique,
Age  int,
Sex  char(2),
);
//創建了一個Student表,有3個列,一個主碼約束,注意書寫格式和字符
(2create table course(
c# char primary key,
Cname char(20)NOT NULL,
Teacher char(8),
);
//建立了一個course表,3個列,一個列為非空
(3create table SC(
S# char(12),
C# char(4),
Grage int,
primary key(S#,C#),若在一個表里面要建立多個主碼約束,就這么用
);
//建立了一個SC表,3個列,
   表的修改樣例
(1)增加表的屬性
alter table Student add s_sdept char
//在Student表里面增加s_sdept屬性 char后面沒有數字默認一個字符
(2)在SC表里面建立兩個外碼約束,S#是外碼,被參照表是Student(S#),c#是外碼,被參照表是course(c#):
      分析;
      SC表里面S#和C#都是主碼,現在要建立外碼約束,是外碼約束必定有參照表
      代碼:
      alter table SC add constraint fkS# foreign key (S#) references Student(S#)//名稱為fkS#的外碼約束鍵
alter table SC add constraint fkC# foreign key (C#) references course(C#)//名稱為fkC#的外碼約束鍵

     建立索引
     在student表上建立屬性S#的唯一索引:create unique index Stus# on Student(S#)//建立名稱為 'Stus#'的唯一索引
     在course表上建立C#的唯一索引:create unique index c1ouc# on Course(C#)/建立名稱為‘couc#’的唯一索引
                                                           實驗二
create table Student(
S# char(12) primary key,
Sname char(8) unique,
Age int,
Sex char(2),
);
create table Course(
C# char(12) primary key,
Cname char(20) NOT NULL,
Teacher char(8),
);
create table SC(
S# char(12),
C# char(12),
Grage int ,
primary key(S#,C#),
);
alter table Student add S_sdept char(12)
alter table SC add constraint fkS# foreign key (S#) references Student(S#)
alter table SC add constraint fkC# foreign key (C#) references Course (C#)
create unique index StuS# on Student(S#)
create unique index CouC# on Course (C#)

1.在Student表中增加兩條學號相同的記錄,驗證實體完整性是否起作用
insert into Student values ('201510101001','張天',20,'','c');
可以加入
insert into Student values ('201510101001','高磊',20,'','c');
不能插入,因為學號相同,S#是主碼約束
insert into Student values ('201510101000','張天',20,'','c');
同樣不能插入,Sname是唯一約束
答案:實體完整性起作用

2.在SC表中插入一條記錄,驗證參照完整性是否起作用
insert into SC values ('201510101002','1001','78')
不能執行,因為在其余的兩個表里面,沒有要插入的數據,不符合參照完整性
insert into Course values ('1001','數據結構','塗珊')
insert into SC values ('201510101001','1001','78')
現在可以執行了,因為在Course和Student表里面有要插入的數據,符合參照完整性
答:參照完整性起作用

3.在Student表中增加”學生入學”列,其數據類型是日期型
alter table Student add S_entrance datetime

4.將Sex的數據類型由字符型修改成整型
alter table Student drop column sex
alter table Student add Sex char(2)
alter table Student alter column Sex int
答:因為之前Sex列里面已經放進去了東西,如果直接把char類型轉換成int類型的話會報錯誤,所以先把Sex列刪除,然后再建立Sex列,然后再轉換

5.增加Course表中的Cname的UNIQUE約束
alter table Course add constraint UQ_Cname unique (Cname)

6.定義SC表中的Grade字段采用的是百分制
alter table SC drop column Grage
alter table SC add Grade int
alter table SC add constraint ck_Grade check(Grade<=100 and Grade>=0)
因為開始輸入的時候把Grade寫成了Grage,所以先刪除了,再創建了一個新的列,Grade里面答數據也被刪除了,需要的話要重新輸入,再執行百分制語句
check約束,對值進行范圍限制

7.刪除Course表中的UNIQUE約束、SC表中的CHECK約束
alter table Course drop constraint UQ_Cname
alter table SC drop constraint ck_Grade

8.試着刪除Course表中的PRIMARY  KEY約束,會出現什么情況
alter table Course drop constraint  primary key (C#)
不知道怎么刪除,雖然知道C#有pk約束,但是不知道約束名..

select * from Student
select * from Course
select *from SC
附加:
delete from SC where S#='01090122'
刪除學號為01090122的這一行,實用
..........................................................................................

1.檢索LIU老師所授的課程號和課程名
select C#,Cname
from Course
where Teacher='LIU'

2.檢索年齡大於歲的男學生的學號和姓名
select S#,Sname
from Student
where Age>23 and Sex=''

3.檢索學號為S3學生所學課程的課程名與任課教師名
select Cname,Teacher
from Course,SC
where Course.C#=SC.C# and SC.S#='S3'

4.檢索至少選修LIU(李東)老師所授課程中一門課程的女學生姓名
select Sname
from Student
where exists (
select distinct S#
from SC
where C# in (
select distinct  C#
from SC
where C# in ( select C#
              from Course
              where Teacher='李東')
intersect 

select distinct C#
from SC
group by C#
having count(S#)>=1
)
) and Sex=''


5.檢索WANG同學不學的課程的課程號
select C#
from SC
where S# not in (select S#
             from Student
             where student.Sname='WANG')

6.檢索至少選修兩門課程的學生學號
select S#
from SC 
group by S#
having count(C#)>=2

7.檢索全部學生都選修的課程的課程號與課程名
select C#,Cname
from Course
where C# in (select C#
             from SC
             group by SC.C#
             having count(SC.S#)>=(select count(*) from Student))
..........................................................................................
                實驗三
--1.統計有學生選修的課程門數
select count(distinct C#)
from SC

--2.求選修C4課程的女學生的平均年齡
select avg(Age) as stu_avg
from SC,Student
where SC.C#='2' and Student.S#=SC.S# and Student.Sex=''

select avg(Age) as Stu_avg
from Student
where S# in (select S#
             from SC
             where C#='2') and Sex=''

3--.求LIU(李東)老師所授課程的女學生的平均年齡
select avg(Age) as Stu_avg
from Student
where S# in (
            select S# 
            from SC
            where C# in (
                        select C#
                        from Course
                        where Teacher='李東'))and Sex=''

select avg(Age) as Stu_avg
from Student
where S# in (
            select S# 
            from SC
            where C# in (
                        select C#
                        from Course
                        where Teacher='LIU'))and Sex=''


--4.統計每門課程的學生選修人數(超過10人的課程才統計)。要求顯示課程號和人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列
select distinct Course.C#,count(*)
from SC,Course
where SC.C#=Course.C#
group by Course.C#
order by 2 desc ,C# asc

--5.檢索學號比WANG(李勇)同學大,而年齡比他小的學生姓名
select B.Sname
from Student A,Student B
where A.Sname='李勇' and A.S#<B.S# and A.Age>B.Age

select B.Sname
from Student A,Student B
where A.Sname='WANG' and A.S#<B.S# and A.Age>B.Age

--6.在表SC中檢索成績為空值(80)的學生學號和課程號
select S#,C#
from SC
where Grage=null

select S#,C#
from SC
where Grage=80
--7.檢索姓名以L(李勇)打頭的所有學生的姓名和年齡
select Sname,Age
from Student
where Sname like 'L%'

select Sname,Age
from Student
where Sname like '李%'

--8.求年齡大於女同學平均年齡的男學生姓名和年齡
select Sname,Age
from Student
where Sex='' and Age>(
select avg(Age)
from Student
where Sex='')

--二.視圖



create view S_Grade(S#,C_num,AVG_Grage)
as select S#,count(C#),avg(Grage)
from SC
group by S#

實驗四

--1.
select *
from S_Grade
--允許,打印這個視圖
--對應操作:
select distinct S#,count(C#) as C_num,avg(Grage) as AVGGrage
from SC
group by S#



--2.
select S#,C_num
from S_Grade
where AVG_Grage>80
--允許,打印視圖中AVG_Grage>80的行的S#和C_num
--對應操作:
select S#,count(C#) as C_num
from SC
group by S#
having avg(Grage)>80

--3.
select S#,AVG_Grage
from S_Grade
where C_num>(select C_num
             from S_Grade
             where S#='201215122')
--允許,打印比學號為201215122的同學的課程數目多的同學的學號和平均成績
--對應操作:
select S#,avg(Grage) as AVG_Grage
from SC
group by S#
having count(C#)>(
select count(C#)
from SC
group by S#
having S#='201215122')


--4
update S_Grade
set C_num=C_num+2
where S#='201215122'
--不允許,因為SC表中的屬性有的要參照Student表和Course表

--5
delete
from S_Grade
where C_num>2
--不允許,因為視圖'S_Grade'來自於SC表,而SC表的增刪改查都要參照其余兩個表

                        實驗五

--1.建立用戶U1、U2、U3、U4、U5、U6、U7,用戶類型全部選擇為CONNECT。
--創建用戶,但是前提是要先創建a,b,c的登錄名
create user u1 for login a
create user u2 for login b
create user u3 for login c

--2.在SYSTEM(即DBA)中與7個CONNECT用戶之間進行授權。完成教材4.2.4小節【例4.1】~【例4.7】的授權語句。
--在完成授權之后,驗證用戶是否擁有相應的權限。例如:
 --  用戶U7向SC表中插入一條數據記錄:(201215130,6,88);顯示插入1條記錄,即用戶U7擁有對SC表的插入數據權限。
 --答:
 --4.1 把對Student表查詢的權限給u1
grant select 
on Student 
to u1

--4.2 把對Student表和Course表的所有權限給u2,u3
grant ALL PRIVILEGES  on Student to u2,u3
grant ALL PRIVILEGES on Course to u2,u3

--4.3把對SC表的查詢權限給所有用戶
grant select  on SC to public

--4.4 把對Student表的學號更新和查詢權限給u1
grant update(S#),select on Student to u1

--4.5 把對SC表的插入權限給u2,並且u2可以傳播此權限
grant insert on SC to u2 with grant option

--4.6把對SC表的插入權限給u3,並且u3可以傳播此權限
grant insert  on SC  to u3 with grant option

--4.7把對SC表的插入權限給u1
grant insert  on SC  to u1

--總結:
--u1的權限:對Student表的查詢和學號更新,對SC表的查詢和插入
--u2的權限:Student表的所有權限,Course表的所有權限,SC表的查詢權限和插入
--u3的權限:Student表的所有權限,Course表的所有權限,SC表的查詢權限和插入
-- 驗證:
u3 insert into SC (S#,C#,Grage) values ('201215130','6',88)--無法插入,因為SC表的學號和課程號是參照Student表和Course表的
--正確方法:
u2 insert into Student values ('201215130','d佬',40,'')
u2 insert into SC (S#,C#,Grage) values ('201215130','6',88)

--3.完成教材4.2.4小節【例4.8】~【例4.10】的權限回收語句。在權限被回收之后,查看該用戶是否真正喪失了對數據的相應權限。例如:
   -- 用戶U3查詢表SC。用戶U3重新登錄數據庫。執行命令:select  *  from  sc;執行失敗。表明用戶U3不再擁有此權限。
revoke update(S#) on Student from u1--收回u1對Student表的學號更新權限

revoke select on SC from public--從所有用戶收回對SC表的查詢權限

revoke insert on SC from u2 cascade--把u2對SC表的插入權限收回,並且把從u2這里獲得該權限的用戶的權限也刪除,級聯刪除
--總結:
--u1的權限:對Student表的查詢,對SC表插入
--u2的權限:Student表的所有權限,Course表的所有權限
--u3的權限:Student表的所有權限,Course表的所有權限

u3 select *
from SC
                          實驗6

--1.往關系C中插一個課程元組(‘C8’,‘VC++’,‘BAO’)
insert into Course values ('C8','VC++','BAO')

--2.在SC中刪除尚無成績的選課元組
delete 
from SC
where Grage=null

--3.把選修LIU(李東)老師課程的女同學選課元組全部刪去

delete 
from SC
where S# in (
            select S#
            from Student
            where Sex='' and S# in(
                                    select S#
                                    from SC
                                    where C# in(
                                                select C#
                                                from Course
                                                where Teacher='李東')))

--查看是否刪除成功
select *
from SC

--4.把MATHS(高數)課不及格(小於88)的成績全改為88分
update SC
set Grage=88
where Grage<88 and S# in (
                         select S#
                         from SC
                         where C# in (
                                     select C#
                                     from Course
                                     where Cname='高數'))

--5.把低於所有課程總平均成績的女同學成績提高5%
update SC
set Grage = Grage * 1.05
where (
(S# in(
select S#
from Student
where Sex=''))
 and
SC.Grage<(
select AVG(Grage)
from SC)
)
--思路很重要

--6.在表SC中修改C4課程的成績,若成績小於等於70分時提高5%,若成績大於70分時提高4%(用兩個UPDATE語句實現)
update SC
set Grage = Grage *1.05
where Grage<=70

update SC
set Grage = Grage *1.04
where Grage>70

--7.在表SC中,當某個成績低於全部課程的平均成績時,提高5%。
update SC
set Grage = Grage *1.05
where SC.Grage<(select AVG(Grage)
                from SC)

--總結:1.牢記更新的語法
       -- update 表名
        --set 修改表達式
        --where 條件

      --2.記得這個操作select AVG(Grage)
                    --from SC
                    --求所有課程的總平均成績

--二、根據學生課程數據庫編寫一個存儲過程,完成下述功能:統計任意一門課程的成績分布情況,即按照各分數段統計人數(分數段自定);
--儲存過程塊
create  procedure sss @Cname varchar(20)
as declare
@cours varchar(20);
begin
select 
count(*)
from SC
where Grage between 0 and 59 and C# in (
                                    select C#
                                    from Course
                                    where  Cname=@Cname);
select 
count(*)
from SC
where Grage between 60 and 80 and C# in (
                                    select C#
                                    from Course
                                    where  Cname=@Cname);
select
count(*)
from SC
where Grage between 81 and 100 and C# in (
                                    select C#
                                    from Course
                                    where  Cname=@Cname);
end;

--調用儲存過程塊
execute sss '高數'
                                    實驗七
第6章  關系數據理論
一、設關系模式R(ABCD),F是R上成立的FD集,F={A→B,C→B},則相對於F,試寫出關系模式R的關鍵碼。並說明理由。
關系模式R的關鍵碼為ACD,因為只有ACD才能推導出R(ABCD)
二、設關系模式R(ABCD),F是R上成立的FD集,F={A→B,B→C}。
1、試寫出屬性集BD的閉包(BD)+。
BCD,因為BD的子集B可以推導出C
2、試寫出所有左部是B的函數依賴(即形為“B→?”)。
B→空集,B→C,B→B,B→BC
三、設關系模式R(ABC),F是R上成立的FD集,F={ B→C,C→A},那么分解ρ={AB,AC}相對於F,是否為無損分解和保持FD?
    都沒有,只能推導出A→B,A→C,不能推導出B→C
四、設有關系模式R(運動員編號、比賽項目、成績、比賽類別、比賽主管),如果規定:每個運動員每參加一個一個比賽項目,只有一個成績;每個比賽項目只屬於一個比賽類別;每個比賽類別只有一個比賽主管。試回答下列問題:
1、根據上述規定,寫出模式R的基本FD和關鍵碼;
運動員編號→比賽項目,(運動員編號,比賽項目)→比賽成績,比賽項目→比賽類別,比賽類別→比賽主管
關鍵碼:運動員編號,比賽項目
2、說明R不是2NF的理由,並把R分解成2NF模式集;
非主屬性對碼不是完全依賴,因為比賽項目→(比賽類別,比賽主管),非主屬性對比賽項目,部分函數依賴
分解:
R1:(運動員編號,比賽項目)→比賽成績
R2:比賽項目→(比賽類別,比賽主管)
3、進而分解成3NF模式集。
第三范式要求不存在傳遞函數依賴,所以:
R1:(運動員編號,比賽項目)→比賽成績
R2:比賽項目→比賽類別
R3:比賽類別→比賽主管
五、設關系模式R(ABCD),在R上有四個相應的FD集及分解:
1、F={B→C,D→A},ρ={BC,AD}
2、F={AB→C,C→A,C→D},ρ={ACD,BC}試對上述兩種種情況分別回答些列問題:
①確定R的關鍵碼
1.BD
2.AB和BC
②是否無損分解?
1.沒有保持
畫圖可得:
A       B       C         D
  b11      a2      a3         b14
  a1       b22     b23        a4           
2.保持了
A       B       C         D
a1     b12     a3        a4
b21       a2     a3      b24

A       B       C         D
a1     b12      a3        a4
a1       a2     a3      a4

存在一行有a1,a2,a3,a4
③是否保持FD集?
1.保持了
2.沒有保持,丟失了AB→C
④確定ρ中每個模式的范式級別。
1.BCNF
2.BCNF
因為每一個決定因素都包含了碼

 

 

 

 

以上是個人對數據庫系統概論的部分知識的了解,若有不正確的地方,歡迎兄弟們拍磚指正!!!

參考書籍:數據庫系統概論 王珊 薩師煊著 第5版

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM