國開數(shù)據(jù)庫應用技術期末復習題及參考答案_第1頁
國開數(shù)據(jù)庫應用技術期末復習題及參考答案_第2頁
國開數(shù)據(jù)庫應用技術期末復習題及參考答案_第3頁
國開數(shù)據(jù)庫應用技術期末復習題及參考答案_第4頁
國開數(shù)據(jù)庫應用技術期末復習題及參考答案_第5頁
已閱讀5頁,還剩181頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1.1數(shù)據(jù)庫技術的發(fā)展數(shù)據(jù)管理的發(fā)展經(jīng)歷了文件管理和數(shù)據(jù)庫管理兩個階段。1.1.1用文件管理數(shù)據(jù)設實現(xiàn)“學生基本信息管理”的應用系統(tǒng)為A1,實現(xiàn)“學生選課信息管理”的應用系統(tǒng)為A2。由于學生選課管理中要用到F1文件中的一些數(shù)據(jù),為減少冗余,假設這個系統(tǒng)使用F1文件中的一些數(shù)據(jù)。如圖1-1所示為基于文件管理的應用系統(tǒng)結構。圖1-1基于文件管理的應用系統(tǒng)結構假設F1、F2和F3文件分別包含如下信息:F1文件:學號、姓名、性別、出生日期、聯(lián)系電話、所在系、專業(yè)、班號。F2文件:課程號、課程名、開課學期、學分、課程性質(zhì)。F3文件:學號、姓名、所在系、專業(yè)、課程號、課程名、修課類型、修課學期、考試成績。我們將文件中所包含的每一個子項稱為文件結構中的一個“字段”或“列”,將每一行數(shù)據(jù)稱為一個“記錄”?!皩W生選課信息管理”的處理過程大致為:若有學生選課,則先查F1文件,判斷有無此學生;若此學生在F1文件中,則再訪問F2文件,判斷其所選的課程是否存在;若一切均符合規(guī)則,就將學生選課信息寫入F3文件中。文件管理數(shù)據(jù)有如下缺點。1.編寫應用程序不方便2.數(shù)據(jù)冗余不可避免3.應用程序依賴性4.不支持對文件的并發(fā)訪問5.數(shù)據(jù)間聯(lián)系弱6.難以按不同用戶的要求表示數(shù)據(jù)7.無安全控制功能1.1.2用數(shù)據(jù)庫管理數(shù)據(jù)如將數(shù)據(jù)庫管理與文件管理在數(shù)據(jù)的局限性方面進行比較,數(shù)據(jù)庫管理具有以下優(yōu)點。1.相互關聯(lián)的數(shù)據(jù)集合2.較少的數(shù)據(jù)冗余3.程序與數(shù)據(jù)相互獨立4.保證數(shù)據(jù)的安全可靠5.最大限度地保證數(shù)據(jù)的正確性6.數(shù)據(jù)可以共享并能保證數(shù)據(jù)的一致性1.2數(shù)據(jù)與數(shù)據(jù)模型數(shù)據(jù)是我們要處理的信息,數(shù)據(jù)模型是數(shù)據(jù)的組織方式。1.2.1數(shù)據(jù)描述事物的符號記錄稱為數(shù)據(jù),而將一行數(shù)據(jù)稱為一條記錄。數(shù)據(jù)是信息存在的一種形式,只有通過解釋或處理才能成為有用的信息。從現(xiàn)實系統(tǒng)的使用角度來說,數(shù)據(jù)的特征可分為靜態(tài)特征和動態(tài)特征:1.數(shù)據(jù)的靜態(tài)特征包括數(shù)據(jù)的基本結構、數(shù)據(jù)間的聯(lián)系和對數(shù)據(jù)取值范圍的約束。2.數(shù)據(jù)的動態(tài)特征是指對數(shù)據(jù)可以進行的操作以及操作規(guī)則,對數(shù)據(jù)庫數(shù)據(jù)的操作主要有查詢數(shù)據(jù)和更改數(shù)據(jù),更改數(shù)據(jù)一般又包括對數(shù)據(jù)的插入、刪除和更新。數(shù)據(jù)的動態(tài)特征(數(shù)據(jù)操作)與數(shù)據(jù)的靜態(tài)特征(數(shù)據(jù)結構、完整性約束)統(tǒng)稱為數(shù)據(jù)模型三要素。1.2.2數(shù)據(jù)模型模型是對事物、對象、過程等客觀系統(tǒng)中感興趣的內(nèi)容的模擬和抽象表達,是理解系統(tǒng)的思維工具。數(shù)據(jù)模型(datamodel)也是一種模型,它是對現(xiàn)實世界數(shù)據(jù)特征的抽象。通俗地講,數(shù)據(jù)模型就是對現(xiàn)實世界數(shù)據(jù)的模擬。數(shù)據(jù)模型一般應滿足三個要求:1.數(shù)據(jù)模型要能夠比較真實地模擬現(xiàn)實世界。2.數(shù)據(jù)模型要容易被人們理解。3.數(shù)據(jù)模型要能夠很方便地在計算機上實現(xiàn)。數(shù)據(jù)模型實際上是模型化數(shù)據(jù)和信息的工具。根據(jù)模型應用目的的不同,可以將模型分為兩大類,它們分別屬于兩個不同的層次。1.概念層數(shù)據(jù)模型,也稱為概念數(shù)據(jù)模型或概念模型。2.組織層數(shù)據(jù)模型,也稱為組織模型,它從數(shù)據(jù)的組織方式來描述數(shù)據(jù)。1.3概念層數(shù)據(jù)模型概念層數(shù)據(jù)模型實際上是現(xiàn)實世界到機器世界的一個中間層次。1.3.1基本概念概念層數(shù)據(jù)模型是指在抽象現(xiàn)實系統(tǒng)中有應用價值的元素及其關聯(lián)關系,反映現(xiàn)實系統(tǒng)中有應用價值的信息結構,并且不依賴于數(shù)據(jù)的組織層結構。常用的概念層數(shù)據(jù)模型有實體—聯(lián)系(entity-relationship,E-R)模型、語義對象模型。1.3.2實體—聯(lián)系模型E-R方法使用的工具稱為E-R圖,它所描述的現(xiàn)實世界的信息結構稱為企業(yè)模式(enterpriseschema),也把這種描述結果稱為E-R模型。1.實體實體是具有公共性質(zhì)且可以相互區(qū)分的現(xiàn)實世界對象的集合。實體是具體的,如職工、學生、教師、課程。2.屬性每個實體都具有一定的特征或性質(zhì),屬性就是描述實體或者聯(lián)系的性質(zhì)或特征的數(shù)據(jù)項,一個實體中的所有實例都具有相同的性質(zhì),在E-R模型中,這些性質(zhì)或特征就是屬性。3.聯(lián)系實體內(nèi)部的聯(lián)系通常是指一個實體內(nèi)屬性之間的聯(lián)系,實體之間的聯(lián)系通常是指屬于不同實體的屬性之間的聯(lián)系。兩個實體之間的聯(lián)系通常分為以下三類:(1)一對一聯(lián)系(1:1)。(2)一對多聯(lián)系(1:n)。(3)多對多聯(lián)系(m:n)。圖1-5不同類型的聯(lián)系實際上,一對一聯(lián)系是一對多聯(lián)系的特例,而一對多聯(lián)系又是多對多聯(lián)系的特例。E-R模型不僅能描述兩個實體之間的聯(lián)系,而且還能描述兩個以上實體之間的聯(lián)系。1.4組織層數(shù)據(jù)模型組織層數(shù)據(jù)模型是從數(shù)據(jù)組織形式的角度來描述信息,目前,在數(shù)據(jù)庫技術的發(fā)展過程中用到的組織層數(shù)據(jù)模型主要有:層次模型(hierarchicalmodel)、網(wǎng)狀模型(networkmodel)、關系模型(relationalmodel)、面向對象模型(objectorientedmodel)和對象關系模型(objectrelationalmodel)。1.4.1層次模型層次模型用樹形結構表示實體和實體之間的聯(lián)系?,F(xiàn)實世界中許多實體之間的聯(lián)系本身就呈現(xiàn)出一種自然的層次關系,如行政機構、家族關系等。構成層次模型的樹由節(jié)點和連線組成,節(jié)點表示實體,節(jié)點中的項表示實體的屬性,連線表示相連的兩個實體間的聯(lián)系,這種是一對多的聯(lián)系。1.4.2網(wǎng)狀模型在現(xiàn)實世界中事物之間更多的是非層次的聯(lián)系,用層次模型表達現(xiàn)實世界中存在的聯(lián)系有很多限制。如果去掉層次模型中的兩點限制,即允許一個以上的節(jié)點無父節(jié)點,并且每個節(jié)點可以有多個父節(jié)點,便構成了網(wǎng)狀模型。用圖形結構表示實體和實體之間聯(lián)系的數(shù)據(jù)模型稱為網(wǎng)狀模型。1.4.3關系模型關系模型是目前最重要的一種數(shù)據(jù)模型,關系數(shù)據(jù)庫就是采用關系模型作為數(shù)據(jù)的組織方式。關系模型源于數(shù)學,它把數(shù)據(jù)看作二維表中的元素,而這個二維表在關系數(shù)據(jù)庫中就稱為關系。用關系(表格數(shù)據(jù))表示實體和實體之間的聯(lián)系的模型就稱為關系模型。如表1-1和表1-2所示分別為“學生”關系模型的數(shù)據(jù)結構和“選課”關系模型的數(shù)據(jù)結構,其中“學生”和“選課”間的聯(lián)系是通過“學號”列實現(xiàn)的。1.5數(shù)據(jù)庫的三級模式結構1.5.1三級模式結構數(shù)據(jù)庫系統(tǒng)內(nèi)部的結構劃分為外模式、模式和內(nèi)模式三個抽象結構,同時在三個模式之間提供二級映像功能。這些結構的劃分反映了看待數(shù)據(jù)庫的三個角度。圖1-11說明了這三種模式以及模式之間的映像關系。圖1-11數(shù)據(jù)庫系統(tǒng)的三級模式結構廣義地講:●外模式:是最接近用戶的,也就是用戶所看到的數(shù)據(jù)視圖。●模式:是介于內(nèi)模式和外模式之間的中間層次?!駜?nèi)模式:是最接近物理存儲的,也就是數(shù)據(jù)的物理存儲方式。1.5.2模式映像與數(shù)據(jù)獨立性1.外模式/模式映像模式描述的是數(shù)據(jù)的全局邏輯結構,外模式描述的是數(shù)據(jù)的局部邏輯結構。2.模式/內(nèi)模式映像模式/內(nèi)模式映像定義了數(shù)據(jù)庫的邏輯結構與物理存儲之間的對應關系,該映像關系通常被保存在數(shù)據(jù)庫的系統(tǒng)表(由數(shù)據(jù)庫管理系統(tǒng)自動創(chuàng)建和維護,用于存放維護系統(tǒng)正常運行的信息)中。1.5.3數(shù)據(jù)庫三級模式的關系在數(shù)據(jù)庫的三級模式結構中,模式(邏輯模式)是數(shù)據(jù)庫的中心與關鍵,它獨立于數(shù)據(jù)庫的其他模式。設計數(shù)據(jù)庫時也是首先設計數(shù)據(jù)庫的邏輯模式。數(shù)據(jù)庫的內(nèi)模式依賴于數(shù)據(jù)庫的全局邏輯結構,但獨立于數(shù)據(jù)庫的用戶視圖,也就是外模式,也獨立于具體的存儲結構。內(nèi)模式將全局邏輯結構中所定義的數(shù)據(jù)結構及其聯(lián)系按照一定的物理存儲策略進行組織,以達到較好的時間與空間效率。數(shù)據(jù)庫的外模式面向具體的應用程序,它定義在邏輯模式之上,并獨立于存儲模式和存儲設備。當應用需求發(fā)生較大變化,相應的外模式不能滿足用戶要求時,就需要調(diào)整外模式定義,以滿足新的要求。1.6數(shù)據(jù)庫系統(tǒng)1.6.1數(shù)據(jù)庫系統(tǒng)的組成從狹義上講,數(shù)據(jù)庫系統(tǒng)主要指數(shù)據(jù)庫和數(shù)據(jù)庫管理系統(tǒng)。從廣義上講,數(shù)據(jù)庫系統(tǒng)由數(shù)據(jù)庫、數(shù)據(jù)庫管理系統(tǒng)(及其開發(fā)工具)、應用程序和用戶組成。其中,用戶可分為數(shù)據(jù)庫管理員、開發(fā)人員和最終用戶三類。數(shù)據(jù)庫系統(tǒng)結構如圖1-12所示。圖1-12數(shù)據(jù)庫系統(tǒng)結構1.6.2數(shù)據(jù)庫管理系統(tǒng)功能數(shù)據(jù)庫管理系統(tǒng)是對數(shù)據(jù)庫進行管理的系統(tǒng)軟件,其主要作用是使數(shù)據(jù)庫成為方便用戶使用的資源,易于為各類用戶共享,并提供數(shù)據(jù)的安全性、完整性和可靠性保證。數(shù)據(jù)庫的所有操作,數(shù)據(jù)的組織、存儲和訪問都必須借助DBMS提供的工具或接口完成。DBMS的功能概括起來如圖1-13所示。圖1-13DBMS的功能(1)數(shù)據(jù)定義功能。(2)數(shù)據(jù)操作功能。(3)數(shù)據(jù)庫運行管理和控制功能(4)數(shù)據(jù)庫的建立和維護功能。2.1關系模型數(shù)據(jù)模型由數(shù)據(jù)結構、數(shù)據(jù)操作和數(shù)據(jù)完整性約束三部分組成,這三部分也稱為關系數(shù)據(jù)模型三要素。下面就從這三個方面介紹關系數(shù)據(jù)模型。2.1.1數(shù)據(jù)結構關系模型源于數(shù)學,它使用二維表來組織數(shù)據(jù),而這個二維表在關系數(shù)據(jù)庫中就稱為關系。關系數(shù)據(jù)庫可以說是表或者關系的集合。表2-1和表2-2分別為“學生”關系和“選課”關系示例。2.1.2數(shù)據(jù)操作關系模型給出了關系操作的能力。關系模型的操作包括:1.傳統(tǒng)的關系運算:并(union)、交(intersection)、差(difference)、笛卡兒乘積(Cartesianproduct);2.專門的關系運算:選擇(select)、投影(project)、連接(join)等;3.有關的數(shù)據(jù)操作:查詢(query)、插入(insert)、刪除(delete)和更改(update)。關系模型的數(shù)據(jù)操作主要包括4種:查詢、插入、刪除和更改。2.1.3數(shù)據(jù)完整性約束在數(shù)據(jù)庫中數(shù)據(jù)的完整性是指保證數(shù)據(jù)正確性的特征。數(shù)據(jù)完整性由一組完整性規(guī)則定義,在關系模型中一般將數(shù)據(jù)完整性分為三類,即實體完整性、參照完整性和用戶定義的完整性。2.2關系模型的基本術語關系模型源于數(shù)學,它有自己嚴格的定義和一些固有的術語。1.關系通俗地講,關系(relation)就是二維表,二維表的名字就是關系的名字,表2-1中的關系名就是“學生”。2.屬性二維表中的每一列稱為一個屬性(或字段),每個屬性(attribute)都有一個名字,稱為屬性名。二維表中對應某一列的值稱為屬性值;二維表中列的個數(shù)稱為關系的元數(shù)。如果一個二維表有n列,則稱其為n元關系。如表2-1所示的“學生”關系有學號、姓名、年齡、性別、所在系5個屬性,是一個五元關系。3.值域二維表中屬性的取值范圍稱為值域(domain)。例如,在表2-1中,“年齡”列的取值為大于0的整數(shù),“性別”列的取值為“男”和“女”兩個值,這些都是列的值域。4.元組二維表中的一行數(shù)據(jù)稱為一個元組(tuple),即記錄值,表2-1“學生”關系中的元組有:(202111101,李勇,21,男,計算機系)(202111102,劉晨,20,男,計算機系)(202111103,王敏,20,女,計算機系)(202121101,張立,20,男,信息管理系)(202121102,吳賓,19,女,信息管理系)5.分量元組中的每一個屬性值稱為元組的一個分量(component),n元關系的每個元組有n個分量。例如,對于元組(202111101,李勇,21,男,計算機系)有5個分量,對應“學號”屬性的分量是“202111101”、對應“姓名”屬性的分量是“李勇”、對應“年齡”屬性的分量是“21”、對應“性別”屬性的分量是“男”,對應“所在系”屬性的分量是“計算機系”。6.關系模式二維表的結構稱為關系模式(relationschema),或者說關系模式就是二維表的表框架或表頭結構。設有關系名為R,屬性分別為A1,A2,…,An,則關系模式可以表示為:R(A1,A2,…,An)每個Ai(i=1,…,n)還包括該屬性到值域的映像,即屬性的取值范圍。例如,如表2-1所示關系的關系模式為:學生(學號,姓名,年齡,性別,所在系)如果將關系模式理解為數(shù)據(jù)類型,則關系就是該數(shù)據(jù)類型的一個具體值。7.候選鍵如果一個屬性或屬性集的值能夠唯一標識一個關系的元組而又不包含多余的屬性,則稱該屬性或屬性集為候選鍵(candidatekey)。候選鍵又稱為候選關鍵字或候選碼。在一個關系上可以有多個候選鍵。例如,對于“學生”關系,假設增加了“身份證號”屬性,則“身份證號”也可以作為“學生”關系的候選鍵。8.主鍵主鍵(primarykey)也稱為主碼或主關鍵字,是表中的屬性或屬性組,用于確定唯一元組。主鍵可以由一個屬性組成,也可以由多個屬性共同組成。例如,表2-1的“學生”關系中,“學號”是主鍵,因為“學號”的一個取值可以確定唯一學生。而表2-2的“選課”關系中,主鍵就由“學號”和“課程號”共同組成。因為一個學生可以選修多門課程,而且一門課程也可以有多個學生選修,因此,只有將“學號”和“課程號”組合起來才能共同確定一行記錄。我們稱由多個屬性共同組成的主鍵為復合主鍵。當某個關系的主鍵是由多個屬性共同組成時,需要用括號將這些屬性括起來,表示共同作為主鍵。如表2-2所示的“選課”關系的主鍵是(學號,課程號)。主鍵實際是從候選鍵中指定的,當一個關系中僅有一個候選鍵時,則主鍵同候選鍵;當一個關系中有多個候選鍵時,可以指定某個候選鍵作為主鍵。9.主屬性和非主屬性包含在任一候選鍵中的屬性稱為主屬性(primaryattribute)。不包含在任一候選鍵中的屬性稱為非主屬性(nonprimaryattribute)。關系中的術語很多可以與現(xiàn)實生活中的表格所使用的術語相對應,如表2-3所示。2.3完整性約束關系模型中的數(shù)據(jù)完整性規(guī)則是對關系的某種約束條件,它的完整性約束主要包括三大類:實體完整性、參照完整性和用戶定義的完整性。2.3.1實體完整性實體完整性是保證關系中的每個元組都是可識別的和唯一的。實體完整性是指關系數(shù)據(jù)庫中所有的表都必須有主鍵,而且表中不允許存在如下記錄:1.無主鍵值的記錄。2.主鍵值相同的記錄。2.3.2參照完整性參照完整性也稱為引用完整性。參照完整性就是用于描述實體之間的聯(lián)系的。參照完整性用于描述多個實體或關系之間的關聯(lián)關系?!巴怄I”定義:設F是關系R的一個或一組屬性,如果F與關系S的主鍵K相對應,則稱F是關系R的外鍵(foreignKey),并稱關系R為參照關系(referencingrelation),關系S為被參照關系(referencedrelation)或目的關系(targetrelation)。關系R和關系S不一定是不同的關系。外鍵并不要求與被參照的主鍵同名。但在實際應用中,為了便于識別,當外鍵與被參照的主鍵屬于不同的關系時,通常是給它們?nèi)∠嗤拿?。參照完整性?guī)則就是定義外鍵與被參照的主鍵之間的引用規(guī)則。對于外鍵,一般應符合如下要求:1.或者值為空。2.或者等于其所參照的關系中的某個元組的主鍵值。主鍵要求必須是非空且不重復的,但外鍵無此要求。外鍵可以有重復值。2.3.3用戶定義的完整性用戶定義的完整性也稱為域完整性或語義完整性。用戶定義的完整性就是針對某一具體應用領域定義的數(shù)據(jù)約束條件。用戶定義的完整性主要就是指明關系中屬性的取值范圍,也就是屬性的域,這樣可以限制關系中屬性的取值類型及取值范圍,防止屬性的值與應用語義矛盾。2.4關系代數(shù)關系代數(shù)是一種純理論語言,它定義了一些操作,運用這些操作可以從一個或多個關系中得到另一個關系,而不改變源關系。因此,關系代數(shù)的操作數(shù)和操作結果都是關系,而且一個操作的輸出可以是另一個操作的輸入。關系代數(shù)同算術運算一樣,可以出現(xiàn)一個套一個的表達式。這種性質(zhì)稱為閉包(closure)。關系在關系代數(shù)下是封閉的,正如數(shù)字在算術操作下是封閉的一樣。關系代數(shù)的運算對象是關系,運算結果也是關系。與一般的運算一樣,運算對象、運算符和運算結果是關系代數(shù)的三大要素。關系代數(shù)的運算可分為以下兩大類:1.傳統(tǒng)的集合運算。這類運算完全把關系看成是元組的集合。傳統(tǒng)的集合運算包括集合的笛卡兒積、并、交和差運算。2.專門的關系運算。這類運算除把關系看作元組的集合外,還通過運算表達了查詢的要求。專門的關系運算主要包括選擇、投影和連接。關系代數(shù)中的運算符可分為4類:傳統(tǒng)的集合運算符、專門的關系運算符、比較運算符和邏輯運算符。表2-7列出了主要的關系運算符,其中比較運算符和邏輯運算符是配合專門的關系運算符來構造表達式的。2.4.1傳統(tǒng)的集合運算傳統(tǒng)的集合運算是二目運算,設關系R和S均是n元關系,且相應的屬性值取自同一個值域,則可以定義三種運算:并運算(∪)、交運算(∩)和差運算(-)。笛卡兒積并不要求參與運算的兩個關系的對應屬性取自相同的域。以圖2-4(a)和2-4(b)所示的兩個關系為例,說明這三種傳統(tǒng)的集合運算。圖2-4描述顧客信息的兩個關系1.并運算設關系R與關系S均是n目關系,關系R與關系S的并記為R∪S={t

|

t∈R

t∈S

}其結果仍是n目關系,由屬于R或屬于S的元組組成,但不包含重復的元組。其示意圖如圖2-5(a)所示。圖2-5并、交、差運算示意圖圖2-6(a)顯示了圖2-4(a)和圖2-4(b)兩個關系的并運算結果。圖2-6集合的并、交、差運算示意圖2.交運算設關系R與關系S均是n目關系,則關系R與關系S的交記為R∩S={t

|

t∈R

t∈S

}其結果仍是n目關系,由屬于R并且也屬于S的元組組成,其示意圖如圖2-5(b)所示。圖2-6(b)顯示了圖2-4(a)和2-4(b)兩個關系的交運算結果。3.差運算設關系R與關系S均是n目關系,則關系R與關系S的差記為R-S={t

|

t∈R

t?S

}其結果仍是n目關系,由屬于R并且不屬于S的元組組成,其示意圖如圖2-5(c)所示。圖2-6(c)顯示了圖2-4(a)和2-4(b)兩個關系的差運算結果。4.笛卡兒積笛卡兒積不要求參加運算的兩個關系具有相同的目。m目的關系R和n目的關系S的笛卡兒積是一個(m+n)目的元組的集合。元組的前m列是關系R的一個元組,后n列是關系S的一個元組。若R有K1個元組,S有K2個元組,則關系R和關系S的笛卡兒積有K1×K2個元組,記作R×S={tr^ts

|

tr∈R

ts∈S

}tr^ts表示由兩個元組tr和ts前后有序連接而成的一個元組。任取元組tr和ts,當且僅當tr屬于R且ts屬于S時,tr和ts的有序連接即為R×S的一個元組。實際操作時,可從R的第一個元組開始,依次與S的每一個元組組合,然后,對R的下一個元組進行同樣的操作,直至R的最后一個元組也進行同樣的操作為止,即可得到R×S的全部元組。如圖2-7所示為兩個關系的笛卡兒積操作示意圖。圖2-7兩個關系的笛卡兒積操作示意圖2.4.2專門的關系運算專門的關系運算包括選擇、投影、連接、除等運算,其中選擇和投影為一元操作,連接和除為二元操作。我們這里只介紹選擇、投影和連接運算。下面我們以表2-8~表2-10的三個關系為例,介紹選擇、投影和連接運算的含義。表2-8~表2-10所示的三個關系的屬性含義如下:Student:Sno(學號),Sname(姓名),Ssex(性別),Sage(年齡),Sdept(所在系)。Course:Cno(課程號),Cname(課程名),Credit(學分),Semester(開課學期),Pcno(直接先修課)。SC:Sno(學號),Cno(課程號),Grade(成績)。1.選擇選擇(selection)運算是從指定的關系中選擇滿足給定條件(用邏輯表達式表達)的元組而組成一個新的關系。選擇運算示意圖如圖2-8所示。圖2-8選擇運算示意圖選擇運算表示為σF(R)={r

|

r∈R

F(r)=‘真’}其中,σ是選擇運算符,R是關系名,r是元組,F(xiàn)是邏輯表達式,取邏輯“真”值或“假”值。例1.對照表2-8所示的Student關系,查詢計算機系學生信息。關系代數(shù)表達式為σSdept=‘計算機系’

(Student)結果如表2-11所示。2.投影投影(projection)運算是從關系R中選擇若干屬性,并用這些屬性組成一個新的關系。如圖2-9顯示了投影運算示意圖。圖2-9投影運算示意圖投影運算表示為∏A(R)={

r.A

|

r∈R

}其中,∏是投影運算符,R是關系名,A是被投影的屬性或屬性組。r.A表示r元組中相應于屬性(集)A的分量,也可以表示為r[A]。投影運算一般由兩個步驟完成:(1)選擇指定的屬性,形成一個可能含有重復數(shù)據(jù)行的新關系;(2)刪除重復行,形成結果關系。例2.對表2-8所示的Student關系,在Sname和Sdept兩個列上進行投影運算,可以表示為∏sname,sdept(Student)結果如表2-12所示。3.連接連接(join)運算用來連接相互之間有聯(lián)系的兩個關系,從而產(chǎn)生一個新的關系。這個過程由連接屬性(字段)來實現(xiàn)。一般情況下連接屬性是出現(xiàn)在不同關系中的語義相同的屬性。常用的連接運算有:θ連接、等值連接(θ連接的特例)、自然連接和外連接,其中最重要也是最常用的是等值連接和自然連接。θ連接運算一般表示為其中A和B分別是關系R和S上語義相同的屬性或屬性組,θ是比較運算符。連接運算從R和S的笛卡兒積R×S中選擇(R關系)在A屬性組上的值與(S關系)在B屬性組上值滿足比較運算符θ的元組。當θ為“=”時的連接為等值連接,它是從關系R與關系S的笛卡兒積中選取A、B屬性組值相等的那些元組,即自然連接是一種特殊的等值連接,它要求兩個關系中進行比較的分量必須是相同的屬性或屬性組,并且在連接結果中去掉重復的屬性列,使公共屬性列只保留一個。即若關系R和S具有相同的屬性組A,則自然連接可記作:一般的連接運算是從行的角度進行運算,但自然連接還需要去掉重復的列,所以是同時從行和列的角度進行運算。自然連接與等值連接的差別為:(1)自然連接要求相等的分量必須有相同的屬性名,等值連接則不要求;(2)自然連接要求把結果中重復的屬性去掉,等值連接卻不這樣做。2.5關系規(guī)范化理論2.5.1函數(shù)依賴1.基本概念函數(shù)對我們來說已經(jīng)是非常熟悉的概念,對公式:Y

=

f

(

X

)自然也不會陌生,但是大家熟悉的是X和Y之間數(shù)量上的對應關系,也就是給定一個X值,都會有一個Y值和它對應,也可以說,X函數(shù)決定Y,或Y函數(shù)依賴于X。在數(shù)據(jù)庫中,函數(shù)依賴注重的是語義上的關系,例如:省=

f

(城市)只要給定一個具體的城市值,就會有唯一省值和它對應,如“武漢市”在“湖北省”,這里“城市”是自變量X,“省”是因變量或函數(shù)值Y。并且把X函數(shù)決定Y,或Y函數(shù)依賴于X表示為X→Y由以上說明可以寫出較直觀的函數(shù)依賴定義:設有關系模式R(A1,A2,…,An),X和Y為{A1,A2,…,An}的子集,如果對于R中的任意一個X值,都只有一個Y值與之對應,則稱X函數(shù)決定Y,或Y函數(shù)依賴于X。2.術語和符號下面給出我們用到的一些術語和符號。設有關系模式R(A1,A2,…,An),X和Y均為{A1,

A2,…,

An}的子集(1)如果X→Y,但Y不包含于X,則稱X→Y是非平凡的函數(shù)依賴。如不作特別說明,我們總是討論非平凡函數(shù)依賴。(2)如果X→Y,則稱X為決定因子。(3)如果X→Y,并且對于X的任意一個真子集X’都有X’Y,則稱Y完全函數(shù)依賴于X,記作XY;如果X’→Y成立,則稱Y部分函數(shù)依賴于X,記作XY。(4)如果X→Y、Y→Z,則稱Z傳遞函數(shù)依賴于X。3.討論函數(shù)依賴的必要性討論屬性之間的函數(shù)依賴有什么必要呢?讓我們通過例子看一下。設有描述學生選課及住宿情況的關系模式:S-L-C(Sno,Sdept,Sloc,Cno,Grade)其中,各屬性的含義分別為:學號、學生所在系、學生所住宿舍樓號、課程號和考試成績。假設一個系的學生都住在一個宿舍樓里。該關系模式的主鍵為(Sno,Cno)??匆幌逻@個關系模式存在什么問題?假設該表有如表2-17所示的數(shù)據(jù)。從這個表中我們可以看到如下問題:(1)數(shù)據(jù)冗余。(2)數(shù)據(jù)更新。(3)數(shù)據(jù)插入。(4)數(shù)據(jù)刪除。類似的各種問題我們統(tǒng)稱為操作異常。解決上述各種問題的方法就是進行模式分解,即把一個關系模式分解成兩個或多個關系模式,在分解的過程中消除那些“不良”的函數(shù)依賴,從而獲得好的關系模式。2.5.2關系規(guī)范化關系數(shù)據(jù)庫中的關系要滿足一定的要求,滿足不同程度要求的為不同的范式。滿足最低要求的為第一范式,簡稱1NF(FirstNormalForm)。在第一范式中進一步滿足一些要求的為第二范式,簡稱2NF,依此類推,還有3NF、BCNF、4NF和5NF。1.第一范式定義:不包含非原子項屬性的關系是第一范式的關系。2.第二范式定義:如果關系模式R∈1NF,并且R中的每個非主屬性都完全函數(shù)依賴于主鍵,則R∈2NF??梢杂媚J椒纸獾姆椒▽⒎?NF的關系模式分解為2NF的關系模式。消除部分函數(shù)依賴的分解步驟為:(1)對于組成主鍵的屬性集合的每一個子集,用它作為主鍵構成一個關系模式。(2)對每個關系模式,將依賴于此主鍵的屬性放置到此關系模式中。(3)去掉只由主鍵的子集構成的關系模式。3.第三范式定義:如果關系模式R∈2NF,并且所有非主屬性都不傳遞函數(shù)依賴于主鍵,則R∈3NF。消除傳遞函數(shù)依賴的分解步驟為:(1)對于不是候選鍵的每個決定因子,從表中刪去依賴于它的所有屬性。(2)新建一個關系模式,新關系模式包含在原關系模式中所有依賴于該決定因子的屬性。(3)將決定因子作為新關系模式的主鍵。由于3NF關系模式中不存在非主屬性對主鍵的部分函數(shù)依賴和傳遞函數(shù)依賴,因而消除了很大一部分數(shù)據(jù)冗余和更新異常,因此在通常的數(shù)據(jù)庫設計中,一般要求將關系模式分解到3NF即可。2.5.3關系模式的分解準則關系規(guī)范化的方法是進行模式分解,但分解后產(chǎn)生的關系模式應與原關系模式等價,即模式分解必須遵守一定的準則,不能表面上消除了操作異?,F(xiàn)象,卻留下了其他的問題。模式分解要滿足:●模式分解具有無損連接性。●模式分解能夠保持函數(shù)依賴。3.1SQLServer2019簡介3.1.1SQLServer2019主要服務SQLServer數(shù)據(jù)庫管理系統(tǒng)的各項功能是通過不同的服務來完成的,主要服務如下。1.數(shù)據(jù)庫引擎2.分析服務3.集成服務4.代理服務3.1.2實例實例:當在一臺計算機上安裝一次SQLServer時,就生成了一個實例。1.默認實例和命名實例命名實例只表示在安裝過程中為實例指定了一個名稱,可以用該名稱訪問該實例;默認實例則是用當前使用的計算機的網(wǎng)絡名作為SQLServer實例名。在客戶端訪問默認實例的方法是:在SQLServer客戶端工具中輸入“計算機名”或者是計算機的IP地址。訪問命名實例的方法是:在SQLServer客戶端工具中輸入“計算機名\命名實例名”。在一臺計算機上只能安裝一個默認實例,但可以有多個命名實例。當對SQLServer實例進行命名時,需注意以下幾點:(1)實例名中的第一個字符必須是字母,字母不區(qū)分大小寫,后續(xù)字符中不能有空格或其他特殊字符。字符長度不超過16個字符。(2)實例名不能與保留關鍵字重名。(3)如果將實例名指定為MSSQLServer,則將創(chuàng)建默認實例。2.多實例SQLServer的一個實例代表一個獨立的數(shù)據(jù)庫管理系統(tǒng),SQLServer2019支持在同一臺服務器上安裝多個實例,或者在同一個服務器上同時安裝有SQLServer2019和SQLServer的早期版本。在一臺服務器上安裝SQLServer的多個實例,使不同的用戶可以將自己的數(shù)據(jù)放置在不同的實例中,從而避免不同用戶數(shù)據(jù)之間的相互干擾。3.2安裝SQLServer2019安裝SQLServer2019要求最少6GB的可用硬盤空間,內(nèi)存至少1GB,操作系統(tǒng)必須是Windows10或更高版本,或者是WindowsServer2016或更高版本。3.3SQLServerManagementStudio工具SQLServerManagementStudio(SSMS)是一個集成環(huán)境,用于訪問和管理所有的SQLServer組件,它組合了大量的圖形工具和豐富的腳本編輯器,通過這個工具可以訪問和管理SQLServer。3.3.1連接到數(shù)據(jù)庫服務器執(zhí)行“開始”→“程序”→“MicrosoftSQLServerManagementStudio2018”命令,打開SQLServerManagementStudio工具,首先彈出的是“連接到服務器”對話框,如圖3-6所示。圖3-6“連接到服務器”對話框在“連接到服務器”對話框中,單擊“服務器名稱”的下拉列表框,然后在列表中選擇“瀏覽更多...”,SQLServer將在彈出的“查找服務器”對話框中列出在該服務器上安裝的所有SQLServer實例,如圖3-7所示。圖3-7“查找服務器”對話框從圖3-7可以看到我們安裝了兩個實例,選中要連接的服務器實例(這里選中命名實例SQL2019),然后單擊“確定”按鈕,回到“連接服務器”對話框,單擊“連接”按鈕,進入SSMS操作界面,如圖3-8所示。圖3-8連接成功后的SSMS操作界面單擊SSMS工具欄上的“新建查詢”圖標按鈕,可以打開“查詢編輯器”窗格,如圖3-9所示。在“查詢編輯器”窗格中,用戶可以編寫SQL代碼,并執(zhí)行這些代碼。如果單擊工具欄上“新建查詢”按鈕右邊的“數(shù)據(jù)庫引擎查詢”圖標按鈕,將打開如圖3-6所示的“連接到服務器”對話框,在該對話框中,用戶可以指定在“查詢編輯器”窗格中執(zhí)行操作的數(shù)據(jù)庫服務器及實例。3.3.2查詢編輯器用戶可以利用SSMS工具提供的圖形化操作窗口創(chuàng)建和維護數(shù)據(jù)庫及對象、編寫SQL代碼,并通過執(zhí)行SQL語句創(chuàng)建和管理對象?!安樵兙庉嬈鳌币赃x項卡窗格的形式存在于SSMS窗口右邊的文檔窗格中,可以通過如下方式之一打開查詢編輯器:1.單擊標準工具欄上的“新建查詢”圖標按鈕。2.單擊標準工具欄上的“數(shù)據(jù)庫引擎查詢”圖標按鈕。3.選擇“文件”菜單中“新建”命令下的“數(shù)據(jù)庫引擎查詢”命令。示例:在“查詢編輯器”窗格中輸入如下代碼:select*fromsys.sysdatabases單擊“”圖標按鈕,在“查詢編輯器”窗格的下邊會顯示代碼的執(zhí)行結果,默認的查詢結果顯示形式是表格。單擊工具欄上的“保存”按鈕或者選擇“文件”菜單下的“保存SQLQuery1.sql”(“SQLQuery1.sql”是用戶沒有給文件命名時系統(tǒng)自動給的文件名),會彈出“另存文件為”對話框,在此對話框中可以指定文件的存儲位置和文件名,單擊“保存”即可將所寫的SQL代碼保存下來。保存SQL代碼的文件是一個純文本文件,默認的文件擴展名為“.sql”。3.4SQLServer數(shù)據(jù)庫的組成SQLServer數(shù)據(jù)庫是由一組操作系統(tǒng)文件組成的,這些文件被分為兩類:數(shù)據(jù)文件和日志文件。數(shù)據(jù)文件用于存放數(shù)據(jù)庫中的數(shù)據(jù)信息,日志文件用于存放對數(shù)據(jù)庫的操作記錄。3.4.1數(shù)據(jù)庫文件1.數(shù)據(jù)文件數(shù)據(jù)文件分為:主要數(shù)據(jù)文件和次要數(shù)據(jù)文件。(1)主要數(shù)據(jù)文件:主要數(shù)據(jù)文件的推薦擴展名是“.mdf”,它包含數(shù)據(jù)庫的系統(tǒng)信息,也可存放用戶的數(shù)據(jù)。每個數(shù)據(jù)庫都有且僅有一個主要數(shù)據(jù)文件。為數(shù)據(jù)庫創(chuàng)建的第一個數(shù)據(jù)文件即是主要數(shù)據(jù)文件。(2)次要數(shù)據(jù)文件:次要數(shù)據(jù)文件的推薦擴展名是“.ndf”。一個數(shù)據(jù)庫可以不包含次要數(shù)據(jù)文件,也可以包含多個次要數(shù)據(jù)文件,而且這些次要數(shù)據(jù)文件既可以建立在同一個磁盤上,也可以分別建立在不同的磁盤上。2.日志文件日志文件的推薦擴展名為“.ldf”,用于存放恢復數(shù)據(jù)庫的所有日志信息。每個數(shù)據(jù)庫必須至少有一個日志文件,當然也可以有多個日志文件。說明:SQLServer不強制使用“.mdf”“.ndf”和“.ldf”文件擴展名,但建議使用這些擴展名以利于標識文件的用途。3.4.2數(shù)據(jù)庫文件的屬性1.邏輯文件名數(shù)據(jù)庫的每個數(shù)據(jù)文件和日志文件都有一個邏輯文件名,邏輯文件名是在SQLServer中使用的文件名。默認情況下,主要數(shù)據(jù)文件的邏輯文件名同數(shù)據(jù)庫名,日志文件的邏輯文件名為:“數(shù)據(jù)庫名”+“_log”。2.物理文件名及存儲位置物理文件名是數(shù)據(jù)庫文件存儲在磁盤上的名字,物理存儲位置也是文件在磁盤上的存儲位置。默認情況下,主要數(shù)據(jù)文件的物理文件名為“邏輯文件名.mdf”;日志文件的物理文件名為“邏輯文件名.ldf”。數(shù)據(jù)庫文件的默認存儲位置在SQLServer安裝位置下的“MicrosoftSQLServer\MSSQL15.SQL2019\MSSQL\DATA\”文件夾下。3.初始大小初始大小即創(chuàng)建數(shù)據(jù)庫時指定的數(shù)據(jù)文件和日志文件的大小。SQLServer2019中主要數(shù)據(jù)文件和日志文件默認的初始大小都是8MB。4.增長方式如果需要的話,可以指定文件是否自動增長。該選項的默認配置為自動增長,即當數(shù)據(jù)庫的空間用完后,系統(tǒng)自動擴大數(shù)據(jù)庫的空間,目的是防止由于數(shù)據(jù)庫空間用完而造成不能插入新數(shù)據(jù)或不能進行數(shù)據(jù)操作的錯誤。5.最大大小若允許文件自動增長,則文件的最大大小是指文件增長的最大空間限制。默認情況是無限制。建議用戶設定允許文件增長的最大空間大小,防止因文件無限增長而占滿整個磁盤空間。3.5創(chuàng)建數(shù)據(jù)庫使用SSMS工具,可以用圖形化的方法創(chuàng)建數(shù)據(jù)庫。創(chuàng)建成功后,在SSMS的“對象資源管理器”中,可以看到新建立的數(shù)據(jù)庫。如果沒有顯示出新創(chuàng)建的數(shù)據(jù)庫,可在“數(shù)據(jù)庫”節(jié)點上右擊,在彈出的菜單中選擇“刷新”命令。3.6維護數(shù)據(jù)庫空間創(chuàng)建完數(shù)據(jù)庫之后,用戶在使用過程中可以根據(jù)需要對數(shù)據(jù)庫的空間進行擴大或縮小的維護。3.6.1擴大數(shù)據(jù)庫空間擴大數(shù)據(jù)庫空間有兩種方法,一種是擴大數(shù)據(jù)庫中已有文件的空間大小,另一種是為數(shù)據(jù)庫添加新的文件。3.6.2收縮數(shù)據(jù)庫空間收縮數(shù)據(jù)庫分為兩種情況,一種是按比例收縮整個數(shù)據(jù)庫空間的大小,另一種是收縮某個數(shù)據(jù)文件或日志文件的大小。3.7刪除數(shù)據(jù)庫當不再需要某個數(shù)據(jù)庫時,應當把它從SQLServer中刪除。刪除一個數(shù)據(jù)庫,也就刪除了該數(shù)據(jù)庫的全部對象,包括數(shù)據(jù)文件和日志文件,從而釋放其將所占的磁盤空間。4.1SQL語言概述不同數(shù)據(jù)庫廠商的數(shù)據(jù)庫管理系統(tǒng)提供的SQL語言略有差別,本書主要以MicrosoftSQLServer使用的SQL語言(稱為Transact-SQL,簡稱T-SQL)為主介紹SQL語言的功能。4.1.1SQL語言特點SQL之所以能夠被用戶和業(yè)界所接受并成為國際標準,是因為它是一個綜合的、功能強大且又比較簡單易學的語言。SQL語言集數(shù)據(jù)定義、數(shù)據(jù)查詢、數(shù)據(jù)操作和數(shù)據(jù)控制功能于一身,主要包括如下特點。1.一體化2.非過程化3.語言簡潔4.提供多種方式使用4.1.2SQL語言功能概述SQL按其功能可分為四大部分:數(shù)據(jù)定義、數(shù)據(jù)控制、數(shù)據(jù)查詢和數(shù)據(jù)操作。如表4-1列出了實現(xiàn)這四部分功能的動詞。數(shù)據(jù)定義功能用于定義、刪除和修改數(shù)據(jù)庫中的對象;數(shù)據(jù)查詢功能用于實現(xiàn)查詢數(shù)據(jù)的功能,查詢數(shù)據(jù)是數(shù)據(jù)庫中使用最多的操作;數(shù)據(jù)操作功能用于增加、刪除和修改數(shù)據(jù);數(shù)據(jù)控制功能用于控制用戶對數(shù)據(jù)庫的操作權限。4.2SQLServer的主要數(shù)據(jù)類型SQLServer提供了多種數(shù)據(jù)類型,這些數(shù)據(jù)類型可分為數(shù)值類型、字符串類型、日期和時間類型、二進制類型等。下面介紹其中主要的數(shù)據(jù)類型。4.2.1數(shù)值類型數(shù)值類型分為準確數(shù)值類型和近似數(shù)值類型兩種。4.2.2字符串類型字符串類型用于存儲字符數(shù)據(jù),字符可以是各種字母、數(shù)字符號、漢字以及各種符號。目前字符的編碼方式有兩種:一種是普通字符編碼,另一種是統(tǒng)一字符編碼(unicode)。普通字符編碼是指不同國家或地區(qū)的編碼長度不一樣,例如,英文字母的編碼是1個字節(jié)(8位),中文漢字的編碼是2個字節(jié)(16位)。統(tǒng)一字符編碼是指對所有語言中的字符均采用雙字節(jié)(16位)編碼。在SQLServer中使用字符數(shù)據(jù)時,需要將字符數(shù)據(jù)用英文的單引號括起來,如'Me'。在計算機中,字符編碼以數(shù)字的形式展示并最終將數(shù)字轉化為二進制編碼。二進制編碼主要用于存儲圖形、圖像數(shù)據(jù)。二進制編碼的字符串數(shù)據(jù)一般用十六進制表示,若使用十六進制格式,可在字符前加“0x”前綴。4.2.3日期和時間類型如表4-7列出了SQLServer支持的主要日期和時間類型包括date類型,time[(n)],datetime,smalldatetime類型。4.3創(chuàng)建與維護關系表表是數(shù)據(jù)庫中非常重要的對象,用于存儲數(shù)據(jù)庫數(shù)據(jù)。創(chuàng)建表就是定義表所包含的列的結構,其中,包括列的名稱、數(shù)據(jù)類型、約束等。列的名稱是人們?yōu)榱兴〉拿?,一般為了便于記憶,最好取有意義的名字,如學號或Sno,而不要取無意義的名字,如a1;列的數(shù)據(jù)類型說明了列的可取值范圍;列的約束更進一步限制了列的取值范圍,這些約束包括:列取值是否允許為空、主鍵約束、外鍵約束、列取值范圍約束等。4.3.1創(chuàng)建關系表定義關系表使用SQL語言數(shù)據(jù)定義功能中的CREATETABLE語句實現(xiàn),其一般格式為:CREATETABLE[<架構名>.]<表名>({<列名><數(shù)據(jù)類型>[列級完整性約束定義[...n]]}[表級完整性約束定義][,...n])注意:默認時SQL語言不區(qū)分大小寫。其中:●<表名>是所要定義的基本表的名字,同樣,這個名字最好能表達表的應用語義,如“學生”或“Student”?!?lt;列名>是表中所包含的屬性列的名字,<數(shù)據(jù)類型>指明列的數(shù)據(jù)類型。在創(chuàng)建表的同時可以定義與表有關的完整性約束條件,大部分完整性約束既可以在“列級完整性約束定義”處定義,也可以在“表級完整性約束定義”處定義??啥x的完整性約束包括:●NOTNULL:限制列取值非空。●DEFAULT:指定列的默認值。●UNIQUE:定義列取值不能重復?!馛HECK:定義列的取值范圍?!馪RIMARYKEY:定義主鍵約束?!馞OREIGNKEY:定義外鍵約束。上述約束中,NOTNULL和DEFAULT約束只能在“列級完整性約束定義”處定義,多列之間的CHECK約束只能在“表級完整性約束定義”處定義,其他約束均可在“列級完整性約束定義”或“表級完整性約束定義”處定義。1.主鍵約束定義主鍵的語法格式為:PRIMARYKEY[(<列名>[,…n])]如果是在列級完整性約束處定義單列的主鍵,可省略方括號部分。2.外鍵約束外鍵既可以定義在列級完整性約束處,也可以定義在表級完整性約束處。定義外鍵的語法格式為:[FOREIGNKEY(列名[,…n])]REFERENCES<外表名>(<外表列名>[,…n])如果是在列級完整性約束處定義單列的外鍵,可省略方括號部分。3.唯一值約束UNIQUE約束用于限制列的取值不重復。這個約束通常用在事實上具有唯一性的屬性列上,如每個人的身份證號、銀行的銀行卡號均不能有重復值。在一個已有主鍵的表中使用UNIQUE約束定義非主鍵列取值不重復是很有用的,如學生(學號,姓名,身份證號),如果主鍵選“學號”,則“身份證號”列不是主鍵,但它的取值也不能重復,這種情況就需要使用UNIQUE約束限定。定義唯一值約束的語法格式為:UNIQUE[(<列名>[,…n])]如果在列級完整性約束處定義單列的唯一值約束,則可省略方括號中的內(nèi)容。4.默認值約束默認值約束用DEFAULT約束實現(xiàn),它用于提供列的默認值,即當在表中插入數(shù)據(jù)時,如果沒有為有DEFAULT約束的列提供值,則系統(tǒng)將自動使用DEFAULT約束定義的默認值。一個默認值約束只能為一個列提供默認值,且默認值約束必須是列級完整性約束。默認值約束的定義有兩種形式,一種是在定義表時指定默認值約束,另一種是在修改表結構時添加默認值約束。(1)在創(chuàng)建表時定義DEFAULT約束。DEFAULT常量表達式(2)為已創(chuàng)建好的表添加DEFAULT約束。DEFAULT常量表達式FOR列名5.列取值范圍約束限制列取值范圍用CHECK約束實現(xiàn),例如,考試成績的取值是0~100分,工資不能小于3000元(假設最低工資為3000元)等。需要注意的是,CHECK約束限制的列必須在同一個表中??梢酝ㄟ^任何基于邏輯運算符返回TRUE或FALSE的邏輯(布爾)表達式創(chuàng)建CHECK約束。定義CHECK約束的語法格式為:CHECK(邏輯表達式)可以將CHECK約束應用于單個列,還可以通過在表級創(chuàng)建CHECK約束,限定多個列之間的相互取值約束,如“畢業(yè)日期”晚于“入學日期”。例1.用SQL語句創(chuàng)建三張表:學生(Student)表、課程(Course)表和學生修課(SC)表,這三張表的結構和約束如表4-9~表4-11所示。說明:為了簡化,描述學生年齡信息時,選用了整型類型的年齡(整型類型)。在實際應用中一般選擇出生日期(日期類型)來描述學生年齡,因為學生的年齡是變化的數(shù)據(jù),而出生日期是不變的。這里選用整型類型的年齡,只是為了簡化一些操作。創(chuàng)建滿足約束條件的上述三張表的SQL語句如下:CREATE

TABLE

Student(Sno

CHAR(9)

PRIMARYKEY,Sname

NCHAR(5)

NOTNULL,SID

CHAR(18)

UNIQUE,Ssex

NCHAR(1)

DEFAULT'男',Sage

TINYINT

CHECK(Sage>=15ANDSage<=45),Sdept

NVARCHAR(20))CREATE

TABLE

Course(Cno

CHAR(6)

PRIMARYKEY,Cname

NVARCHAR(20)

NOTNULL,Credit

NUMERIC(3,1)

CHECK(Credit>0),Semester

TINYINT)CREATE

TABLE

SC(Sno

CHAR(9)

NOTNULL,Cno

CHAR(6)

NOTNULL,Grade

TINYINT

CHECK(Grade

BETWEEN

0

AND

100),PRIMARY

KEY(Sno,

Cno),FOREIGN

KEY(Sno)REFERENCES

Student(Sno),FOREIGN

KEY(Cno)REFERENCES

Course(Cno))4.3.2修改表結構在創(chuàng)建好表之后,如果表結構有變化,如增加新列、刪除列或修改列數(shù)據(jù)類型及約束等,則可以使用ALTERTABLE語句對表結構進行修改。不同DBMS的ALTERTABLE語句的格式略有不同,我們這里給出T-SQL支持的ALTERTABLE語句的部分格式。對其他的數(shù)據(jù)庫管理系統(tǒng),可參考它們的語言參考手冊。ALTERTABLE[<架構名>.]<表名>{ALTERCOLUMN<列名><新數(shù)據(jù)類型>--修改列定義|ADD

{<列名><數(shù)據(jù)類型>

[完整性約束定義]}[,...n]

--添加新列|ADD

[constraint<約束名>]

約束定義

--添加約束|DROP

COLUMN<列名>

[,...n]

--刪除列|DROP

[CONSTRAINT]<約束名>

[,...n]

--刪除約束}例2.為SC表添加“修課類別”列,此列的定義為:TypeNCHAR(1),允許空。ALTER

TABLE

SC

ADD

Type

NCHAR(1)例3.將新添加的Type列的數(shù)據(jù)類型改為NCHAR(2)。ALTER

TABLE

SC

ALTER

COLUMN

Type

NCHAR(2)例4.為Type列添加限定取值范圍為{必修,重修,選修}的約束。ALTER

TABLE

SCADD

CHECK(TypeIN('必修','重修','選修'))例5.刪除SC表的“Type”列。ALTER

TABLE

SC

DROP

COLUMN

Type例6.為T表添加主鍵約束,主鍵列為:C1。ALTER

TABLE

TADD

CONSTRAINT

PK_C1

PRIMARY

KEY(C1)例7.刪除T表的主鍵約束。ALTER

TABLE

TDROP

CONSTRAINT

PK_C14.3.3刪除表當不再需要某個表時,可以將其刪除。刪除表的語句格式為:DROP

TABLE

<表名>{[,<表名>]…}例8.刪除test表。DROP

TABLE

test注意:如果被刪除的表中有其他表對它的外鍵引用約束,則必須先刪除外鍵所在的表,然后刪除被引用鍵所在的表。5.1數(shù)據(jù)查詢功能本章所有查詢均在Student(學生)、Course(課程)和SC(選課)表上進行,這三張表的結構如表5-1~表5-3所示。對Student表,為了簡化操作,描述學生年齡的字段(sage)選用的是整型類型,而沒有選擇更符合實際情況、更易于維護的出生日期(日期類型)。假設這三張表中已有如表5-4~表5-6所示的數(shù)據(jù)。5.1.1查詢語句的基本結構查詢就是從數(shù)據(jù)庫中檢索滿足條件的數(shù)據(jù)??梢圆樵円粡埍碇械臄?shù)據(jù),也可以同時查詢多張表中的數(shù)據(jù)。查詢的結果是一個由0行(沒有滿足條件的數(shù)據(jù))或多行數(shù)據(jù)組成的記錄集合,而且在查詢過程中還可以對查詢的結果進行排序、匯總等。查詢語句的基本結構可描述為:SELECT<目標列名序列>--需要哪些列FROM<表名>--來自哪張(或哪些)表[WHERE<行選擇條件>]--根據(jù)什么條件[GROUPBY<分組依據(jù)列>][HAVING<組選擇條件>][ORDERBY<排序依據(jù)列>]其中SELECT子句表示要查看哪些列的內(nèi)容;FROM子句用于指定這些列都來自哪張(或哪些)表;WHERE子句用于指定選擇數(shù)據(jù)的條件;GROUPBY子句用于指定用于進行分組統(tǒng)計的列;HAVING子句用于指定對分組統(tǒng)計結果的篩選條件;ORDERBY子句用于指定查詢結果的排列順序。在這些子句中,SELECT子句和FROM子句是必須的,其他子句都是可選的。SELECT子句部分可對應的是關系代數(shù)表達式中的投影運算,WHERE子句對應的是關系代數(shù)表達式中的選擇運算。5.1.2單表查詢單表查詢,即數(shù)據(jù)只涉及一張表的查詢。所有的查詢結果按SQLServer2019數(shù)據(jù)庫管理系統(tǒng)的形式顯示。選擇表中若干列1.查詢指定的列在很多情況下,用戶可能只對表中的部分列感興趣,這時可通過在SELECT子句的<目標列名序列>中指定要查詢的列來實現(xiàn)。例1.查詢?nèi)w學生的學號和姓名。SELECTSno,SnameFROMStudent查詢結果如圖5-1所示。圖5-1例1的查詢結果例2.查詢?nèi)w學生的姓名、學號和所在系。SELECTSname,Sno,SdeptFROMStudent查詢結果如圖5-2所示。注意:目標列的選擇順序可以與表中定義的字段的順序不一致。圖5-2例2的查詢結果2.查詢?nèi)苛腥绻樵儽碇械娜苛?,可以使用兩種方法:一種是在<目標列名序列>中列出所有的列名;另一種是如果列的顯示順序與其在表中定義的順序相同,則可以在<目標列名序列>中寫星號“*”。例3.查詢?nèi)w學生的詳細記錄。SELECTSno,Sname,Ssex,Sage,SdeptFROMStudent等價于:SELECT*FROMStudent3.查詢經(jīng)過計算的列SELECT子句中的<目標列名序列>可以是表中存在的列,也可以是表達式、常量或者函數(shù)。例4.含表達式的列:查詢?nèi)w學生的姓名及出生年份。在Student表中只記錄了學生的年齡,而沒有記錄學生的出生年份,但用使用當前年份減去年齡,就可以得到出生年份。因此實現(xiàn)此功能的查詢語句為:SELECTSname,2021-SageFROMStudent查詢結果如圖5-3所示。圖5-3例4的查詢結果圖5-4例5的查詢結果例5.含字符串常量的列:查詢?nèi)w學生的姓名和出生年份,并在出生年份列前加入一個新列,此列的每行數(shù)據(jù)均為“出生年份”常量值。SELECTSname,'出生年份',2021-SageFROMStudent查詢結果如圖5-4所示。從圖5-3和5-4可以看到,經(jīng)過計算的表達式列、常量列的顯示結果都沒有列標題[圖中顯示為“(無列名)”],通過為列指定別名的方法可以改變查詢結果顯示的列標題,這對于含算術表達式、常量、函數(shù)名的目標列尤為有用。改變顯示的列標題的語法格式為:[列名|表達式][AS]列標題或列標題=[列名|表達式]例如,例4的代碼可寫成:SELECTSname姓名,2021-Sage年份FROMStudent選擇表中的若干元組1.消除取值相同的行從關系數(shù)據(jù)庫理論上說,關系表中不允許存在取值全都相同的數(shù)據(jù)行,但在進行了對列的選擇后,就有可能在查詢結果中出現(xiàn)取值完全相同的數(shù)據(jù)行。取值相同的行在結果中是沒有意義的,因此,可消除這些行。例6.查詢選修了課程的學生學號。如果寫成:SELECTSnoFROMSC則查詢結果的部分數(shù)據(jù)如圖5-5(a)所示。從這個結果可看到其中有許多重復的行(實際上一個學生選了多少門課,其學號就在結果中重復多少次)。SQL中的DISTINCT關鍵字可以去掉結果中的重復行。DISTINCT關鍵字寫在SELECT詞的后邊、目標列名序列的前。去掉上述查詢結果中重復行的語句為:SELECTDISTINCTSnoFROMSC其查詢結果如圖5-5(b)所示。圖5-5DISTINCT的作用2.查詢滿足條件的元組查詢滿足條件的元組是通過WHERE子句實現(xiàn)的。WHERE子句常用的查詢條件及謂詞如表5-7所示。(1)比較。比較的謂詞有:=(等于)、>(大于)、>=(大于或者等于)、<=(小于或者等于)、<(小于)、<>(不等于)、!=(不等于)。例7.查詢計算機系全體學生的姓名。SELECTSnameFROMStudentWHERESdept='計算機系'例8.查詢所有年齡在20歲以下的學生的姓名及年齡。SELECTSname,SageFROMStudentWHERESage<20例9.查詢考試成績有不及格的學生的學號。SELECTDISTINCTSnoFROMSCWHEREGrade<60注意:考試成績?yōu)镹ULL的記錄(即還未考試的課程)并不滿足“Grade<60”條件,因為NULL不能和確定的值進行比較運算。我們在后邊“涉及空值的查詢”部分再詳細討論。(2)確定范圍。BETWEEN…AND和NOTBETWEEN…AND是邏輯運算符,可以用來查找屬性值在(或不在)指定范圍內(nèi)的元組,其中BETWEEN后邊指定范圍的下限,AND后邊指定范圍的上限。BETWEEN…AND的格式為:列名|表達式[NOT]BETWEEN下限值AND上限值BETWEEN…AND中列名或表達式的類型要與下限值或上限值的類型相同。“BETWEEN下限值AND上限值”的含義是:如果列或表達式的值在下限值和上限值范圍內(nèi)(包括邊界值),則結果為True,表明此記錄符合查詢條件。“NOTBETWEEN下限值AND上限值”的含義正好相反:如果列或表達式的值在下限值和上限值范圍內(nèi)(不包括邊界值),則結果為False,表明此記錄不符合查詢條件。例10.查詢年齡在20~23歲的學生的姓名、所在系和年齡。SELECTSname,Sdept,SageFROMStudentWHERESageBETWEEN20AND23此句等價于:SELECTSname,Sdept,SageFROMStudentWHERESage>=20ANDSage<=23例11.查詢年齡不在20~23歲的學生姓名、所在系和年齡。SELECTSname,Sdept,SageFROMStudentWHERESageNOTBETWEEN20AND23此句等價于:SELECTSname,Sdept,SageFROMStudentWHERESage<20ORSage>23例12.對于日期類型的數(shù)據(jù)也可以使用基于范圍的查找。例如,假設有教師表(Teachers),其中包含教師號(Tid)、姓名(Tname)和出生日期(BirthDate)列,現(xiàn)要查詢1970年1月1日至1979年12月31日出生的教師的信息,則語句如下:SELECTTid,Tname,BirthDateFROMTeachersWHEREBirthDateBETWEEN'1970/1/1'and'1979/12/31'(3)確定集合??梢允褂肐N運算符來查找屬性值屬于指定集合的元組。IN的使用格式為:列名[NOT]IN(常量1,常量2,…,常量n)“IN”運算符的含義為:當列中的某個值與IN中的某個常量值相等時,則結果為True,表明此記錄為符合查詢條件的記錄?!癗OTIN”運算符的含義正好相反:當列中的某個值與某個常量值相等時,則結果為False,表明此記錄為不符合查詢條件的記錄。例13.查詢信息管理系、通信工程系和計算機系學生的姓名和性別。SELECTSname,SsexFROMStudentWHERESdeptIN('信息管理系','通信工程系','計算機系')此句等價于:SELECTSname,SsexFROMStudentWHERESdept='信息管理系'ORSdept='通信工程系'ORSdept='計算機系'例14.查詢不在第2、4、6學期開設的課程的課程名和開課學期。SELECTCname,SemesterFROMCourseWHERESemesterNOTIN(2,4,6)此句等價于:SELECTCname,SemesterFROMCourseWHERESemester!=2ANDSemester!=4ANDSemester!=6(4)字符串匹配。LIKE用于查找指定列中與匹配串匹配的元組。匹配串是一種特殊的字符串,其特殊之處在于它不僅可以包含普通字符,還可以包含通配符。通配符用于表示任意的字符或字符串。在實際應用中,如果需要從數(shù)據(jù)庫中檢索記錄,但又不能給出精確的字符查詢條件,就可以使用LIKE運算符和通配符來實現(xiàn)模糊查詢。在LIKE運算符前也可以使用NOT運算符,表示對結果取反。LIKE運算符的一般使用形式為:列名[NOT]LIKE<匹配串>匹配串中可包含如下4種通配符:●_:匹配任意一個字符?!?:匹配零個或多個字符?!馵]:匹配[]中的任意一個字符。如[acdg]表示匹配a、c、d、g中的任何一個。若要比較的字符是連續(xù)的,則可以用連字符“-”表達,例如,若要匹配b、c、d、e中的任何一個字符,可以表達為[b-e]?!馵^]:不匹配[]中的全部字符。如[^acdg]表示不匹配a、c、d、g。同樣,若要比較的字符是連續(xù)的,也可以用連字符“-”表達,例如,若不匹配b、c、d、e中的全部字符,則可以表達為[^b-e]。例15.查詢?nèi)啃铡巴酢钡膶W生的詳細信息。SELECT*FROMStudentWHERESnameLIKE'王%'例16.查詢姓“王”且名字是3個字的學生姓名。SELECT*FROMStudentWHERESnameLIKE'王__'例17.查詢姓“張”、姓“李”和姓“劉”的學生詳細信息。SELECT*FROMStudentWHERESnameLIKE'[張李劉]%'例18.查詢名字中第2個字為“小”或“大”的學生姓名和學號。SELECTSname,SnoFROMStudentWHERESnameLIKE'_[小大]%'例19.查詢所有不姓“劉”的學生姓名。SELECTSnameFROMStudentWHERESnameNOTLIKE'劉%'(5)涉及空值的查詢??罩担∟ULL)在數(shù)據(jù)庫中有特殊的含義,它表示不確定的值。例如,某些學生選課后還沒有考試,則這些學生就只有選課記錄,而沒有考試成績,因此考試成績就是空值。判斷某個值是否為NULL,不能使用普通的比較運算符(=、!=等),只能使用專門的判斷NULL的子句來完成。判斷列值是否為空的子句為:列名ISNOTNULL例20.查詢沒有考試成績的學生的學號和相應的課程號。SELECTSno,CnoFROMSCWHEREGradeISNULL例21.查詢所有有考試成績的學生的學號、課程號和成績。SELECTSno,Cno,GradeFROMSCWHEREGradeISNOTNULL(6)多重條件查詢。在WHERE子句中可以使用邏輯運算符AND和OR來組成多條件查詢。使用AND謂詞的語法格式為:布爾表達式1AND布爾表達式2AND…AND布爾表達式n用AND連接的條件表示只有當全部的布爾表達式均為True時,整個表達式的結果才為True。只要有一個布爾表達式的結果為False,則整個表達式結果即為False。使用OR謂詞的語法格式為:布爾表達式1OR布爾表達式2OR…OR布爾表達式n用OR連接的條件表示只要其中一個布爾表達式為True,則整個表達式的結果即為True,只有當全部布爾表達式的結果均為False時,整個表達式的結果才為False。例22.查詢計算機系年齡在20歲以下的學生的姓名和年齡。SELECTSname,SageFROMStudentWHERESdept='計算機系'ANDSage<20例23.查詢計算機系和信息管理系學生中年齡在18到20歲的學生的學號、姓名、所在系和年齡。SELECTSno,Sname,Sdept,SageFROMStudentWHERE(Sdept='計算機系'ORSdept='信息管理系')ANDSagebetween18and20注意:OR運算符的優(yōu)先級小于AND,要改變運算的順序可以通過添加括號的方式實現(xiàn)。例23的查詢也可以寫為:SELECTSno,Sname,Sdept,SageFROMStudentWHERESdeptin('計算機系','信息管理系')ANDSagebetween18and對查詢結果進行排序有時,我們希望查詢的結果能按一定的順序顯示出來,如按考試成績從高到低排列學生的考試情況。SQL語句具有按用戶指定的列進行排序的功能,而且查詢結果既可以按一列排序,也可以按多列進行排序,排序可以是從小到大(升序),也可以是從大到小(降序)。排序子句的格式為:ORDERBY<列名>[ASC|DESC][,…n]其中<列名>為排序的依據(jù)列,可以是列名或列的別名。ASC表示按列對結果集進行升序排序,DESC表示按列對結果集進行降序排序。如果沒有指定排序方式,則默認的排序方式為升序排序。如果在ORDERBY子句中指定了多個排序依據(jù)列,則這些列在該子句中出現(xiàn)的順序決定了對查詢結果集進行排序的方式。當指定多個排序依據(jù)列時,系統(tǒng)首先按排在第一位的列進行排序,如果排序后存在兩個或兩個以上列值相同的記錄,則將值相同的記錄再依據(jù)排在第二位的列進行排序,依此類推。例24.將全體學生按年齡升序排序。SELECT*FROMStudentORDERBYSageASC例25.查詢選了“C002”課程的學生學號及其成績,查詢結果按成績降序排列。SELECTSno,GradeFROMSCWHERECno='C002'ORDERBYGradeDESC例26.查詢?nèi)w學生信息,查詢結果按所在系的系名升序排列,同系的學生按年齡降序排列。SELECT*FROMStudentORDERBYSdept,SageDESC使用聚合函數(shù)匯總數(shù)據(jù)聚合函數(shù)也稱為集合函數(shù)或統(tǒng)計函數(shù),其作用是對一組值進行計算并返回一個單值。SQL提供的聚合函數(shù)主要有:●COUNT(*):統(tǒng)計數(shù)據(jù)的行數(shù)。●COUNT([DISTINCT]<列名>):統(tǒng)計列中除空值外的值的個數(shù),DISTINCT選項表示去掉列的重復值后再統(tǒng)計。●SUM(<列名>):計算列值總和(必須是數(shù)值型列)?!馎VG(<列名>):計算列值平均值(必須是數(shù)值型列)。●MAX(<列名>):求列值最大值?!馦IN(<列名>):求列值最小值。上述函數(shù)中除COUNT(*)外,其他函數(shù)在計算過程中均忽略NULL值。聚合函數(shù)的計算范圍既可以是滿足WHERE子句條件的記錄(如果對整個表進行計算),也可以滿足條件的組(如果進行了分組)。例27.統(tǒng)計學生總人數(shù)。SELECTCOUNT(*)FROMStudent例28.統(tǒng)計選修了課程的學生的人數(shù)。SELECTCOUNT(DISTINCTSno)FROMSC由于一個學生可選多門課程,為避免重復計算這樣的學生,加DISTINCT去掉重復值。例29.統(tǒng)計“202111101”學生的考試總成績。SELECTSUM(Grade)FROMSCWHERESno='202111101'例30.統(tǒng)計“C001”課程的考試平均成績。SELECTAVG(Grade)FROMSCWHERECno='C001'例31.查詢“C001”課程的考試最高分和最低分。SELECTMAX(Grade)最高分,MIN(Grade)最低分SELECTMAX(Grade)FROMSCWHERECno='C001'注意:聚合函數(shù)不能作為數(shù)據(jù)篩選條件出現(xiàn)在WHERE子句中。例如:查詢年齡最大學生的姓名,如下寫法是錯誤的:SELECTSnameFROMStudentWHERESage=MAX(Sage)怎樣寫出這個查詢的正確語句我們在子查詢部分介紹。對查詢結果進行分組計算在對表單進行查詢時,有時需要先對數(shù)據(jù)進行分組,再針對每組進行統(tǒng)計計算,而不是針對全表進行計算。例如,統(tǒng)計每個學生的平均成績、每個系的學生人數(shù),這時就需要用到分組子句:GROUPBY。GROUPBY子句可將統(tǒng)計控制在組一級。分組的目的是細化聚合函數(shù)的作用對象。在一個查詢語句中,可以使用多列進行分組。需要注意的是,如果使用了分組子句,則查詢列表中的每列必須是分組依據(jù)列(在GROUPBY子句中指定的列)或是聚合函數(shù)中的一種。使用GROUPBY子句時,如果在SELECT的查詢列表中包含聚合函數(shù),則針對每個組計算出一個匯總值,從而實現(xiàn)對查詢結果的分組統(tǒng)計。分組語句應寫在WHERE子句的后邊,它的一般形式為:GROUPBY<分組依據(jù)列>[,…n][HAVING組篩選條件]1.使用GROUPBY子句例32.統(tǒng)計每門課程的選課人數(shù),列出課程號和人數(shù)。SELECTCnoAS課程號,COUNT(Sno)AS選課人數(shù)FROMSCGROUPBYCno該語句首先按Cno的值對查詢結果進行分組,所有Cno值相同的元組歸為一組,然后對每組用COUNT函數(shù)進行計算,統(tǒng)計出每組的學生人數(shù)。該過程如圖5-16所示。例33.查詢每個學生的選課門數(shù)和平均成績。SELECTSno學號,COUNT(*)選課門數(shù),AVG(Grade)平均成績FROMSCGROUPBYSno注意:GROUPBY子句中的分組依據(jù)列必須是表中存在的列名,不能使用AS子句指派的列別名。例如,在例33中,不能將“GROUPBYSno”寫成:“GROUPBY學號”。例34.統(tǒng)計每個系的學生人數(shù)和平均年齡。SELECTSdept,COUNT(*)AS學生人數(shù),AVG(Sage)AS平均年齡FROMStudentGROUPBYSdept例35.帶WHERE子句的分組。統(tǒng)計每個系的女生人數(shù)。SELECTSdept,COUNT(*)女生人數(shù)FROMStudentWHERESsex='女'GROUPBYSdept例36.按多列分組。統(tǒng)計每個系的男生人數(shù)和女生人數(shù)以及男生的最大年齡和女生的最大年齡。結果按系名的升序排序。SELE

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論