數(shù)據(jù)庫原理及應(yīng)用-關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL_第1頁
數(shù)據(jù)庫原理及應(yīng)用-關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL_第2頁
數(shù)據(jù)庫原理及應(yīng)用-關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL_第3頁
數(shù)據(jù)庫原理及應(yīng)用-關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL_第4頁
數(shù)據(jù)庫原理及應(yīng)用-關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL_第5頁
已閱讀5頁,還剩146頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL目錄01SQL概述02數(shù)據(jù)庫的創(chuàng)建與管理03數(shù)據(jù)表及其操作04數(shù)據(jù)查詢05視圖06索引本章主要內(nèi)容

結(jié)構(gòu)化查詢語言(StructuredQueryLanguage,SQL)是關(guān)系數(shù)據(jù)庫管理的標(biāo)準(zhǔn)語言,具有數(shù)據(jù)定義、數(shù)據(jù)查詢、數(shù)據(jù)操縱和數(shù)據(jù)控制四個方面的功能。SQL結(jié)構(gòu)簡單,功能齊全,是目前廣泛應(yīng)用的關(guān)系數(shù)據(jù)庫查詢語言。本章主要介紹SQLServer2019數(shù)據(jù)庫管理系統(tǒng)各種工具的使用和SQL的使用。SQL概述013.1.1SQL的發(fā)展1970年,Codd發(fā)表了關(guān)系數(shù)據(jù)庫理論,從此奠定了關(guān)系數(shù)據(jù)庫的理論基礎(chǔ)。1974年,博伊斯(Boyce)和錢伯林(Chamberlin)在關(guān)系數(shù)據(jù)庫理論的基礎(chǔ)上,提出了結(jié)構(gòu)化英語查詢語言(StructureEnglishQueryLanguage,SEQUEL)。1975—1985年,IBM公司首先研制了關(guān)系數(shù)據(jù)庫原型SystemR,該系統(tǒng)實現(xiàn)了對SEQUEL的支持。進而,IBM公司推出了商業(yè)數(shù)據(jù)庫SQL/DS,極大地推動了SQL的發(fā)展。3.1.1SQL的發(fā)展1986年10月,美國國家標(biāo)準(zhǔn)協(xié)會(AmericanNationalStandardsInstitute,ANSI)首先推出了關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)SQL-86。1987年6月,國際標(biāo)準(zhǔn)化組織(InternationalOrganizationforStandardization,ISO)正式將SQL-86采納為國際標(biāo)準(zhǔn)。1992年11月,ISO公布了SQL的新標(biāo)準(zhǔn),即SQL-92,SQL得到極大推廣。1999年,ISO推出了SQL-99標(biāo)準(zhǔn),該標(biāo)準(zhǔn)對SQL進行進一步拓展,增加了對面向?qū)ο蠊δ艿闹С帧?/p>

盡管不同的數(shù)據(jù)庫產(chǎn)品廠商對SQL標(biāo)準(zhǔn)在支持度上有略微的差異,但大多數(shù)都遵循SQL-99標(biāo)準(zhǔn)。本章主要介紹SQL的基本概念和基本功能。3.1.2SQL的特點

SQL的結(jié)構(gòu)簡單、功能強大和簡單易學(xué)的優(yōu)點使得SQL能夠在眾多的數(shù)據(jù)庫查詢語言中脫穎而出,被工業(yè)界和用戶廣泛接受。功能全面:SQL是一種一體化的語言,它具有數(shù)據(jù)定義、數(shù)據(jù)查詢、數(shù)據(jù)操縱和數(shù)據(jù)控制等方面的功能,用戶通過SQL可以完成有關(guān)數(shù)據(jù)庫的全部工作。高度非過程化的語言:SQL是一種高度非過程化的語言,也就是說在使用SQL語句做想做的事情時,用戶只需要聲明想做什么,而無須具體指出做這件事情的詳細(xì)步驟。3.1.2SQL的特點不要求用戶指定對數(shù)據(jù)的存取方法:所有SQL語句都使用查詢優(yōu)化器,它可以加快數(shù)據(jù)存取的速度。這種特性使用戶更容易把精力集中于要得到的結(jié)果。查詢優(yōu)化器知道存在什么索引,以及在哪里使用索引合適,而用戶不需要知道表是否有索引、表有什么類型的索引等具體內(nèi)容。易學(xué)易用:SQL語句結(jié)構(gòu)簡單,功能強大,核心任務(wù)只需要9個動詞就可以完成。并且其語法也非常簡單,非常接近英語自然語言,容易學(xué)習(xí)和掌握。使用方式靈活:SQL既可以作為嵌入式語言,也可以直接以命令方式交互使用。SQL作為嵌入式語言使用時,SQL語句可以嵌入各種主流編程語言中,以供用戶靈活使用。SQL作為交互式語言使用時,用戶可以直接在數(shù)據(jù)庫管理系統(tǒng)客戶端輸入SQL命令,查看執(zhí)行結(jié)果。盡管SQL的使用方式不同,但SQL的語法結(jié)構(gòu)基本上是一致的。這種以統(tǒng)一的語法結(jié)構(gòu)提供兩種不同使用方式的做法,為用戶提供了極大的靈活性和方便性。3.1.3SQL的組成

SQL主要由數(shù)據(jù)定義語言(DataDefinitionLanguage,DDL)、數(shù)據(jù)操縱語言(DataManipulationLanguage,DML)、數(shù)據(jù)查詢語言(DataQueryLanguage,DQL)和數(shù)據(jù)控制語言(DataControlLanguage,DCL)等幾部分組成。DDL:在數(shù)據(jù)庫系統(tǒng)中,數(shù)據(jù)庫及數(shù)據(jù)庫中的表、視圖和索引等數(shù)據(jù)庫對象的建立、更改和刪除都通過DDL完成,DDL包括CREATE、ALTER、DROP等關(guān)鍵字。DML:DML是指用來添加、修改和刪除數(shù)據(jù)庫中數(shù)據(jù)的語句,包括INSERT、UPDATE和DELETE等關(guān)鍵字。3.1.3SQL的組成DQL:查詢操作是數(shù)據(jù)庫中最基本的操作,DQL用于檢索數(shù)據(jù)庫中滿足條件的數(shù)據(jù)。例如,使用SELECT關(guān)鍵字查詢表中的記錄。DCL:DCL用來授予或回收訪問數(shù)據(jù)庫的某種特權(quán),主要包括GRANT和REVOKE關(guān)鍵字。數(shù)據(jù)庫的創(chuàng)建與管理023.2.1數(shù)據(jù)庫的存儲結(jié)構(gòu)

數(shù)據(jù)庫的存儲結(jié)構(gòu)分為邏輯存儲結(jié)構(gòu)和物理存儲結(jié)構(gòu)兩種。從邏輯存儲結(jié)構(gòu)的角度來看,SQLServer數(shù)據(jù)庫將數(shù)據(jù)組織成若干個可視化的數(shù)據(jù)表、索引、視圖、函數(shù)和存儲過程等邏輯對象。從物理存儲結(jié)構(gòu)的角度來看,SQLServer數(shù)據(jù)庫將數(shù)據(jù)組織成各種數(shù)據(jù)庫文件,即數(shù)據(jù)文件和事務(wù)日志文件。數(shù)據(jù)庫的邏輯存儲結(jié)構(gòu):數(shù)據(jù)庫的邏輯存儲結(jié)構(gòu)主要應(yīng)用于面向用戶的數(shù)據(jù)組織和管理,如數(shù)據(jù)庫的數(shù)據(jù)表、視圖、數(shù)據(jù)類型、存儲過程和觸發(fā)器等。這些數(shù)據(jù)庫對象是用戶使用數(shù)據(jù)庫的基本單位。3.2.1數(shù)據(jù)庫的存儲結(jié)構(gòu)數(shù)據(jù)庫的物理存儲結(jié)構(gòu):數(shù)據(jù)庫的物理存儲結(jié)構(gòu)主要應(yīng)用于面向計算機的數(shù)據(jù)組織和管理,如數(shù)據(jù)文件、表和視圖的數(shù)據(jù)組織方式。每個SQLServer數(shù)據(jù)庫被組織成數(shù)據(jù)文件和事務(wù)日志文件兩種類型的操作系統(tǒng)文件。數(shù)據(jù)文件包含數(shù)據(jù)和對象,例如表、索引、存儲過程和視圖,又可分為主要數(shù)據(jù)文件和次要數(shù)據(jù)文件。事務(wù)日志文件包含恢復(fù)數(shù)據(jù)庫中的所有事務(wù)所需的信息。為了便于分配和管理,可以將數(shù)據(jù)文件集合起來,放到文件組中。(1)主要數(shù)據(jù)文件:主要數(shù)據(jù)文件(PrimaryDataFile)包含數(shù)據(jù)庫的啟動信息,并指向數(shù)據(jù)庫中的其他文件。用戶數(shù)據(jù)和對象可存儲在此文件中,也可以存儲在次要數(shù)據(jù)文件中。每個數(shù)據(jù)庫有且僅有一個主要數(shù)據(jù)文件。主要數(shù)據(jù)文件的默認(rèn)擴展名是.mdf。3.2.1數(shù)據(jù)庫的存儲結(jié)構(gòu)(2)次要數(shù)據(jù)文件:次要數(shù)據(jù)文件(SecondaryDataFile)是可選的,由用戶定義并存儲用戶數(shù)據(jù)。次要數(shù)據(jù)文件的默認(rèn)擴展名是.ndf。(3)事務(wù)日志文件:事務(wù)日志文件(TransactionLogFile)保存用于恢復(fù)數(shù)據(jù)庫的日志信息。當(dāng)數(shù)據(jù)庫被損壞的時候,管理員可以使用事務(wù)日志文件恢復(fù)數(shù)據(jù)庫。每個數(shù)據(jù)庫必須至少擁有一個事務(wù)日志文件。事務(wù)日志文件的默認(rèn)擴展名是.ldf。

一個數(shù)據(jù)庫應(yīng)包含一個主要數(shù)據(jù)文件和至少一個事務(wù)日志文件。主要數(shù)據(jù)文件包含數(shù)據(jù)庫中的所有數(shù)據(jù)。如果主要數(shù)據(jù)文件不能滿足數(shù)據(jù)庫中數(shù)據(jù)的存儲需求,就需要多個次要數(shù)據(jù)文件。默認(rèn)情況下,數(shù)據(jù)文件和事務(wù)日志文件被放在同一個驅(qū)動器上的同一個路徑下。但是,在生產(chǎn)環(huán)境中,這可能不是最佳的方法??紤]到數(shù)據(jù)安全問題,建議將數(shù)據(jù)文件和事務(wù)日志文件放在不同的磁盤上。3.2.1數(shù)據(jù)庫的存儲結(jié)構(gòu)

為了方便用戶對數(shù)據(jù)庫文件進行分配和管理,SQLServer2019將文件分成不同的文件組。文件組主要包含主要文件組、用戶定義文件組和默認(rèn)文件組3種類型。(1)主要文件組:每個數(shù)據(jù)庫都有一個主要文件組,主要文件組包含主要數(shù)據(jù)文件和未放入其他文件組的所有次要數(shù)據(jù)文件。所有系統(tǒng)表都被分配到主要文件組中。(2)用戶定義文件組:用戶定義文件組用于將數(shù)據(jù)文件集合起來,以便于進行管理、數(shù)據(jù)分配和放置。用戶定義文件組是通過在CREATEDATABASE或ALTERDATABASE語句中使用FILEGROUP關(guān)鍵字指定的任何文件組。事務(wù)日志文件不屬于任何文件組。3.2.1數(shù)據(jù)庫的存儲結(jié)構(gòu)(3)默認(rèn)文件組:如果在數(shù)據(jù)庫中創(chuàng)建對象時沒有指定對象所屬的文件組,對象將被分配給默認(rèn)文件組。不管何時,只能將一個文件組指定為默認(rèn)文件組。默認(rèn)文件組中的文件必須足夠大,能夠容納未分配給其他文件組的所有新對象。PRIMARY文件組是系統(tǒng)提供的默認(rèn)文件組,除非使用ALTERDATABASE語句進行更改,但系統(tǒng)對象和表仍然分配給PRIMARY文件組,而不是新的默認(rèn)文件組。3.2.2系統(tǒng)數(shù)據(jù)庫

SQLServer2019包含兩種類型的數(shù)據(jù)庫:用戶數(shù)據(jù)庫和系統(tǒng)數(shù)據(jù)庫。用戶數(shù)據(jù)庫是由用戶創(chuàng)建、存儲用戶數(shù)據(jù)和對象的數(shù)據(jù)庫,例如圖書館管理系統(tǒng)數(shù)據(jù)庫。系統(tǒng)數(shù)據(jù)庫存放SQLServe2019的系統(tǒng)級信息,例如系統(tǒng)配置、數(shù)據(jù)庫屬性、登錄賬號、數(shù)據(jù)庫文件、數(shù)據(jù)庫備份、警報和作業(yè)等。打開SQLServer2019的對象資源管理器,系統(tǒng)會自動創(chuàng)建4個系統(tǒng)數(shù)據(jù)庫,分別為master數(shù)據(jù)庫、model數(shù)據(jù)庫、tempdb數(shù)據(jù)庫、msdb數(shù)據(jù)庫,如圖所示。3.2.2系統(tǒng)數(shù)據(jù)庫master數(shù)據(jù)庫:master數(shù)據(jù)庫記錄了SQLServer中的所有系統(tǒng)級別信息,例如系統(tǒng)中所有的登錄賬戶、端點、系統(tǒng)配置信息、SQLServer的初始化信息及數(shù)據(jù)庫錯誤信息等。此外,master數(shù)據(jù)庫還記錄所有其他數(shù)據(jù)庫是否存在及這些數(shù)據(jù)庫文件的位置。master數(shù)據(jù)庫是SQLServer啟動的第一個入口,記錄了SQLServer的初始化信息。因此,master數(shù)據(jù)庫是所有系統(tǒng)數(shù)據(jù)庫的重中之重,如果master數(shù)據(jù)庫被破壞,則SQLServer將無法啟動。model數(shù)據(jù)庫:model數(shù)據(jù)庫是SQLServer創(chuàng)建用戶數(shù)據(jù)庫的模板。當(dāng)用戶創(chuàng)建一個數(shù)據(jù)庫時,model數(shù)據(jù)庫的內(nèi)容會自動復(fù)制到用戶數(shù)據(jù)庫中,因此SQLServer系統(tǒng)中必須有model數(shù)據(jù)庫。如果對model數(shù)據(jù)庫進行某些修改,例如修改數(shù)據(jù)文件的大小,新創(chuàng)建的用戶數(shù)據(jù)庫的內(nèi)容將以修改后的model數(shù)據(jù)庫為模板進行創(chuàng)建。3.2.2系統(tǒng)數(shù)據(jù)庫tempdb數(shù)據(jù)庫:tempdb數(shù)據(jù)庫是連接到SQLServer實例的所有用戶都可用的全局資源。所有與系統(tǒng)連接的用戶的臨時表和臨時數(shù)據(jù)庫對象,以及SQLServer產(chǎn)生的其他臨時性對象都存儲于該數(shù)據(jù)庫。tempdb數(shù)據(jù)庫是臨時的,每次啟動SQLServer時,都要重新創(chuàng)建tempdb數(shù)據(jù)庫,以便系統(tǒng)啟動時,該數(shù)據(jù)庫總是空的。tempdb數(shù)據(jù)庫在斷開連接時會自動刪除保存的臨時表和臨時數(shù)據(jù)庫對象,并且在系統(tǒng)關(guān)閉后沒有活動連接。msdb數(shù)據(jù)庫:msdb數(shù)據(jù)庫是SQLServer代理程序調(diào)度警報和作業(yè)以及記錄操作員時使用的數(shù)據(jù)庫。SQLServer代理程序能夠按照系統(tǒng)管理員的設(shè)定監(jiān)控用戶對數(shù)據(jù)的非法操作,并能及時向系統(tǒng)管理員發(fā)出警報。當(dāng)代理程序調(diào)度警報、作業(yè)和記錄操作時,系統(tǒng)要用到或?qū)崟r產(chǎn)生許多相關(guān)信息,這些信息一般存儲在msdb數(shù)據(jù)庫中。3.2.3創(chuàng)建用戶數(shù)據(jù)庫在SQLServer2019中,主要采用兩種方法創(chuàng)建用戶數(shù)據(jù)庫:一種方法是使用SQLServerManagementStudio的對象資源管理器,以圖形化的方式創(chuàng)建用戶數(shù)據(jù)庫,此方法簡單直觀;另一種方法是使用T-SQL語句創(chuàng)建用戶數(shù)據(jù)庫,此方法可以保存創(chuàng)建數(shù)據(jù)庫的腳本文件,可以在其他機器上使用此腳本文件創(chuàng)建相同的數(shù)據(jù)庫。3.2.3創(chuàng)建用戶數(shù)據(jù)庫(1)使用對象資源管理器創(chuàng)建用戶數(shù)據(jù)庫。

首先,在對象資源管理器窗口中,展開SQLServer服務(wù)器實例,用鼠標(biāo)右鍵單擊(簡稱右擊)“數(shù)據(jù)庫”選項,在彈出的快捷菜單中選擇“新建數(shù)據(jù)庫”命令,如圖所示。3.2.3創(chuàng)建用戶數(shù)據(jù)庫

然后,在“新建數(shù)據(jù)庫”窗口中的“常規(guī)”標(biāo)簽頁中,如圖所示,可以定義數(shù)據(jù)庫名稱、數(shù)據(jù)庫所有者、是否使用全文檢索、數(shù)據(jù)庫文件(數(shù)據(jù)文件和事務(wù)日志文件)的邏輯名稱、數(shù)據(jù)庫文件的初始大小和增長方式等。

單擊“新建數(shù)據(jù)庫”窗口中的“常規(guī)”標(biāo)簽頁上的“添加”按鈕,可以為數(shù)據(jù)庫添加次要數(shù)據(jù)文件和事務(wù)日志文件。3.2.3創(chuàng)建用戶數(shù)據(jù)庫

在“新建數(shù)據(jù)庫”窗口中的“選項”標(biāo)簽頁中可以選擇定義排序規(guī)則、恢復(fù)模式、游標(biāo)選項、兼容性級別等,如圖所示。

在“新建數(shù)據(jù)庫”窗口中的“文件組”標(biāo)簽頁中可以選擇添加數(shù)據(jù)庫的文件組。

設(shè)置完成后單擊“確定”按鈕,TeachSystem數(shù)據(jù)庫創(chuàng)建成功。3.2.3創(chuàng)建用戶數(shù)據(jù)庫(2)使用T-SQL創(chuàng)建用戶數(shù)據(jù)庫

使用CREATEDATABASE語句可以創(chuàng)建數(shù)據(jù)庫,在創(chuàng)建時指定數(shù)據(jù)庫名稱、數(shù)據(jù)庫文件的存放位置、大小、文件的最大容量和文件的增量等。語法格式如右圖所示。3.2.3創(chuàng)建用戶數(shù)據(jù)庫【例3.1】創(chuàng)建數(shù)據(jù)庫TeachSystem,該數(shù)據(jù)庫存放在D:\Data下,數(shù)據(jù)文件的邏輯名稱為TeachSystem,物理文件名為TeachSystem.mdf,初始大小為5MB,最大容量為100MB,增量為1MB;事務(wù)日志文件的名稱為TeachSystem_log,物理文件名為TeachSystem.ldf,初始大小為10MB,最大容量為2GB,增量為10%。CREATEDATABASETeachSystemONPRIMARY(NAME='TeachSystem',FILENAME='D:\Data\TeachSystem.mdf',SIZE=5MB,MAXSIZE=100MB,FILEGROWTH=1MB)LOGON(NAME='TeachSystem_log',FILENAME='D:\Data\TeachSystem_log.ldf',SIZE=10MB,MAXSIZE=2GB,FILEGROWTH=10%)3.2.4修改用戶數(shù)據(jù)庫

數(shù)據(jù)庫創(chuàng)建完成后,用戶在使用過程中可以根據(jù)需要對其原始定義的數(shù)據(jù)庫參數(shù)進行修改。其中,修改數(shù)據(jù)庫的方式有兩種,一種是利用對象資源管理器修改數(shù)據(jù)庫,另一種是利用T-SQL語句修改數(shù)據(jù)庫的屬性。(1)使用對象資源管理器修改用戶數(shù)據(jù)庫

啟動SQLServerManagementStudio,在對象資源管理器中,右擊TeachSystem數(shù)據(jù)庫,在彈出的快捷菜單中選擇“屬性”命令,打開“數(shù)據(jù)庫屬性”窗口,在“數(shù)據(jù)庫屬性”窗口的“常規(guī)”標(biāo)簽頁中,顯示的是數(shù)據(jù)庫的基本信息,如圖所示,這些信息不能修改。3.2.4修改用戶數(shù)據(jù)庫

單擊“文件”標(biāo)簽,如圖所示,可以修改數(shù)據(jù)庫的邏輯名稱、初始大小和自動增長等屬性,也可以根據(jù)需要添加數(shù)據(jù)文件和事務(wù)日志文件,還可以更改數(shù)據(jù)庫的所有者。

在“數(shù)據(jù)庫屬性”窗口的“選項”標(biāo)簽頁,單擊“限制訪問”下拉列表框,選擇不同選項可以限制訪問數(shù)據(jù)庫的用戶。3.2.4修改用戶數(shù)據(jù)庫(2)使用T-SQL語句修改用戶數(shù)據(jù)庫

使用ALTERDATABASE語句修改用戶數(shù)據(jù)庫的語法形式如下。3.2.4修改用戶數(shù)據(jù)庫【例3.2】為TeachSystem數(shù)據(jù)庫增加一個數(shù)據(jù)文件和一個事務(wù)日志文件,數(shù)據(jù)文件的邏輯名為TeachSystem_data,初始大小為10MB,最大容量為500MB,增量為5MB。事務(wù)日志文件的邏輯名為TeachSystem_data_log,初始大小為3MB,最大容量為100MB,增量為1MB。ALTERDATABASETeachSystemADDFILE(NAME=TeachSystem_data,

FILENAME='D:\Data\TeachSystem_data.ndf',

SIZE=10MB,

MAXSIZE=500MB,

FILEGROWTH=5MB)goALTERDATABASETeachSystemADDLOGFILE(NAME=TeachSystem_data_log,

FILENAME='D:\Data\TeachSystem_data_log.ldf',

SIZE=3MB,

MAXSIZE=100MB,

FILEGROWTH=1MB)go3.2.4修改用戶數(shù)據(jù)庫【例3.3】修改TeachSystem數(shù)據(jù)庫的名稱為Teach。

ALTERDATABASETeachSystem

MODIFYNAME=Teach

數(shù)據(jù)庫一經(jīng)創(chuàng)建,由于許多應(yīng)用程序會使用該數(shù)據(jù)庫,因此原則上不允許修改數(shù)據(jù)庫的名稱。如果確實需要修改數(shù)據(jù)庫的名稱,則可以使用數(shù)據(jù)庫定義語言進行修改。更改數(shù)據(jù)庫的名稱,除了使用SQL命令之外,也可以使用系統(tǒng)存儲過程sp_rename。同理,也可以采用圖形化界面修改數(shù)據(jù)庫名稱,啟動SQLServerManagementStudio,在對象資源管理器中,在選擇的數(shù)據(jù)庫上右擊,在彈出的快捷菜單中選擇“重命名”命令,然后輸入數(shù)據(jù)庫的新名稱即可。3.2.5刪除用戶數(shù)據(jù)庫

在SQLServer2019中,除了系統(tǒng)數(shù)據(jù)庫,用戶創(chuàng)建的數(shù)據(jù)庫都可以刪除。數(shù)據(jù)庫一旦被刪除則不能夠恢復(fù),相應(yīng)的數(shù)據(jù)文件和事務(wù)日志文件也會被刪除。刪除用戶數(shù)據(jù)庫的方式也有兩種,一種是使用對象資源管理器刪除用戶數(shù)據(jù)庫,另一種是采用T-SQL語句刪除用戶數(shù)據(jù)庫。(1)使用對象資源管理器刪除用戶數(shù)據(jù)庫

啟動SQLServerManagementStudio,在對象資源管理器中,選中TeachSystem數(shù)據(jù)庫,右擊,在彈出的快捷菜單中選擇“刪除”命令,如圖所示,然后打開“刪除對象”對話框,單擊“確定”按鈕即可刪除數(shù)據(jù)庫。3.2.5刪除用戶數(shù)據(jù)庫(2)使用T-SQL語句刪除用戶數(shù)據(jù)庫

使用DROPDATABASE命令可以一次刪除一個或多個數(shù)據(jù)庫。數(shù)據(jù)庫的所有者和數(shù)據(jù)庫管理員才有權(quán)限執(zhí)行此命令,其語法格式如下。

DROPDATABASEdatabase_name[,…]【例3.4】刪除用戶創(chuàng)建的TeachSystem數(shù)據(jù)庫。

DROPDATABASETeachSystem

注意,用戶只能刪除自己創(chuàng)建的數(shù)據(jù)庫,不能刪除其他用戶創(chuàng)建并且仍在使用的數(shù)據(jù)庫。3.2.6查看數(shù)據(jù)庫信息(1)打開數(shù)據(jù)庫

在用戶連接上SQLServer時,系統(tǒng)會打開默認(rèn)的數(shù)據(jù)庫。一般用戶需要具體指定連接到哪個數(shù)據(jù)庫,或者從一個數(shù)據(jù)庫切換到另一個數(shù)據(jù)庫,可以在SQL編輯器中使用USE命令打開或者切換到不同數(shù)據(jù)庫。

打開或切換數(shù)據(jù)庫的命令格式如下。

USEdatabase_name

其中,database_name為要打開或切換的數(shù)據(jù)庫的名稱。

例如打開TeachSystem數(shù)據(jù)庫,則使用命令USETeachSystem。3.2.6查看數(shù)據(jù)庫信息(2)查看數(shù)據(jù)庫的屬性信息

要確認(rèn)數(shù)據(jù)庫的當(dāng)前狀態(tài),除了通過“數(shù)據(jù)庫屬性”窗口的各個標(biāo)簽頁查看數(shù)據(jù)庫屬性以外,還可以采用T-SQL語句查看。例如,使用sys.databases數(shù)據(jù)庫和文件目錄視圖可以查看有關(guān)數(shù)據(jù)庫的基本信息,使用sys.database_files可以查看數(shù)據(jù)庫文件的信息,使用sys.filegroups可以查看有關(guān)數(shù)據(jù)庫文件組的信息,利用sys.master_files可以查看數(shù)據(jù)庫文件的基本信息和狀態(tài)信息,使用系統(tǒng)存儲過程sp_helpdb可以查看數(shù)據(jù)參數(shù)信息,使用系統(tǒng)存儲過程sp_dboption可以查看數(shù)據(jù)庫的選項信息?!纠?.5】通過sys.database查看數(shù)據(jù)庫的狀態(tài)信息。具體的T-SQL語句如下。

SELECTname,state,state_descFROMsys.databases

在查詢設(shè)計器窗口中輸入如上代碼并執(zhí)行。3.2.6查看數(shù)據(jù)庫信息【例3.6】通過sys.master_files查看數(shù)據(jù)文件和事務(wù)日志文件。具體的T-SQL語句如下。

SELECTname,physical_name,type,type_desc,state,state_desc

FROMsys.master_files

在查詢設(shè)計器窗口中輸入如上代碼并執(zhí)行,就可以查看數(shù)據(jù)文件和事務(wù)日志文件的有關(guān)信息?!纠?.7】使用sp_helpdb查看數(shù)據(jù)庫和數(shù)據(jù)庫參數(shù)的有關(guān)信息。具體的T-SQL語句如下。

EXECUTEsp_helpdb'TeachSystem'

在查詢設(shè)計器窗口中輸入如上代碼并執(zhí)行,3.2.7分離和附加用戶數(shù)據(jù)庫

在SQLServer系統(tǒng)中可以通過分離和附加用戶數(shù)據(jù)庫快速地把用戶數(shù)據(jù)庫從一臺計算機移動到另外一臺計算機。首先將數(shù)據(jù)庫文件與該SQLServer系統(tǒng)進行分離,即脫離關(guān)系,這時在該服務(wù)器上無法連接該數(shù)據(jù)庫,但數(shù)據(jù)庫文件仍然在該服務(wù)器的硬盤上,然后把分離下來的數(shù)據(jù)庫文件通過附加數(shù)據(jù)庫的技術(shù)將數(shù)據(jù)庫文件附加到另外一臺服務(wù)器上,這樣在另外一臺服務(wù)器上就可以使用和管理該數(shù)據(jù)庫。(1)分離數(shù)據(jù)庫

在SQLServerManagementStudio中選中TeachSystem數(shù)據(jù)庫,右擊,在彈出的快捷菜單中依次選擇“任務(wù)”→“分離”命令。

在彈出的對話框中進行設(shè)置。設(shè)置數(shù)據(jù)庫TeachSystem的分離參數(shù),單擊“確定”按鈕,即可完成操作。3.2.7分離和附加用戶數(shù)據(jù)庫(2)附加數(shù)據(jù)庫

在“對象資源管理器”中右擊“數(shù)據(jù)庫”選項,從彈出的快捷菜單中選擇“附加”命令,如圖所示,打開“附加數(shù)據(jù)庫”對話框。

在彈出的“附加數(shù)據(jù)庫”對話框中,單擊“添加”按鈕。在彈出的“定位數(shù)據(jù)庫文件”對話框中,選擇要添加的數(shù)據(jù)庫的主要數(shù)據(jù)文件,如圖所示。數(shù)據(jù)庫TeachSystem的主要數(shù)據(jù)文件為TeachSystem.mdf。數(shù)據(jù)表及其操作033.3數(shù)據(jù)表及其操作本節(jié)主要講解如何創(chuàng)建數(shù)據(jù)表,數(shù)據(jù)表就像數(shù)據(jù)容器里面的抽屜一樣,將數(shù)據(jù)分門別類地放在數(shù)據(jù)庫中進行存儲。因此,數(shù)據(jù)表是數(shù)據(jù)庫中極其重要的數(shù)據(jù)對象,是存儲數(shù)據(jù)的基本單元。通過對表結(jié)構(gòu)的設(shè)計可以定義數(shù)據(jù)庫的結(jié)構(gòu),還可以通過約束對保存的數(shù)據(jù)類型進行限制。數(shù)據(jù)表與電子表格類似,數(shù)據(jù)在表中是按照行和列的格式組織排列的。每一行代表一條唯一的記錄,每一列代表記錄中的一個域。例如,一個包含學(xué)生基本信息的數(shù)據(jù)表,表中的每一行代表一條學(xué)生信息,每一列表示學(xué)生的詳細(xì)資料,如SNO(學(xué)號)、SN(姓名)、Sex(性別)、Age(年齡)和DNO(系別)等,TeachSystem數(shù)據(jù)庫中的學(xué)生表student如圖所示。3.3.1數(shù)據(jù)類型

數(shù)據(jù)表中主要存儲的是數(shù)據(jù),現(xiàn)實社會中存放著不同類型的數(shù)據(jù),數(shù)據(jù)類型是以數(shù)據(jù)的表現(xiàn)方式和存儲方式劃分的。數(shù)據(jù)類型是數(shù)據(jù)的一種屬性,決定數(shù)據(jù)存儲的空間和格式。在SQLServer2019的數(shù)據(jù)表中,屬性列的數(shù)據(jù)類型既可以是系統(tǒng)提供的數(shù)據(jù)類型,也可以是用戶自定義的數(shù)據(jù)類型。數(shù)據(jù)類型可以為屬性列定義4個屬性:對象包含的數(shù)據(jù)種類、存儲值占有的空間(字節(jié)數(shù))與數(shù)值范圍、數(shù)值的精度(僅適用于數(shù)值類型)、數(shù)值的小數(shù)位數(shù)(僅適用于數(shù)值類型)。SQLServer2019中的數(shù)據(jù)類型可以歸納為整數(shù)數(shù)據(jù)類型、浮點數(shù)據(jù)類型、字符數(shù)據(jù)類型、日期和時間數(shù)據(jù)類型、貨幣數(shù)據(jù)類型、二進制數(shù)據(jù)類型和其他數(shù)據(jù)類型。3.3.1數(shù)據(jù)類型(1)整數(shù)數(shù)據(jù)類型

整數(shù)數(shù)據(jù)類型是常用的數(shù)據(jù)類型之一,主要用來存儲沒有小數(shù)位的整數(shù)。下面表格列出了SQLServer2019支持的整數(shù)數(shù)據(jù)類型。(2)浮點數(shù)據(jù)類型

浮點數(shù)據(jù)類型可以存儲十進制值,用于表示浮點數(shù)值數(shù)據(jù)的大致數(shù)值的數(shù)據(jù)類型,包括float、real、decimal和numeric四種。SQLServer2019存儲數(shù)據(jù)時對小數(shù)點右邊的數(shù)進行四舍五入。一般只有在精確數(shù)據(jù)類型不夠大、不能存儲數(shù)值時,才考慮使用float數(shù)值類型。表3.2列出了SQLServer2019支持的浮點數(shù)據(jù)類型。3.3.1數(shù)據(jù)類型(3)字符數(shù)據(jù)類型

字符數(shù)據(jù)類型是使用較多的數(shù)據(jù)類型,可以用來存儲各種字母、數(shù)字符號和特殊符號。字符數(shù)據(jù)類型分為定長類型和變長類型。對于定長字符數(shù)據(jù)類型,可以用n指定定長字符串的長度,如char(n)、nchar(n)。當(dāng)輸入的字長小于分配的長度時,用空格填充;當(dāng)輸入的字符串的字長大于分配的長度時,則SQLServer2019自動截取多余部分。對于變長字符數(shù)據(jù)類型,可以用n指定字符的最大長度,如varchar(n)、nvarchar(n)。在變長屬性列的數(shù)據(jù)會被去掉尾部的空格;存儲尺寸就是輸入數(shù)據(jù)的實際長度。SQLServer2019支持6種類型的字符數(shù)據(jù)類型,即char、varchar、text、nchar、nvarchar和ntext等。其中,前3種為ASCII編碼,后3種的編碼為Unicode編碼。3.3.1數(shù)據(jù)類型(4)日期和時間數(shù)據(jù)類型

日期和時間數(shù)據(jù)類型主要存儲日期和時間結(jié)合的數(shù)據(jù)類型,在計算機內(nèi)部作為整數(shù)存儲。SQLServer2019支持date、datetime、datetime2、datetimeoffst、smalldatetime、time6種類型。(5)貨幣數(shù)據(jù)類型

貨幣數(shù)據(jù)由十進制貨幣的數(shù)值數(shù)據(jù)組成。貨幣數(shù)據(jù)類型有money和smallmoney兩種,能精確到它們所代表的貨幣單位的萬分之一。3.3.1數(shù)據(jù)類型(6)二進制數(shù)據(jù)類型

二進制數(shù)據(jù)的字符串是由二進制值組成的,而不是由字符組成的,該類型通常用于時間戳(Timestamp)和IMAGE類型。(7)其他數(shù)據(jù)類型

為了更好地解決特殊類型的數(shù)據(jù),SQLServer2019還支持geography、geometry、hierarchyid、sql_variant、timestamp、uniqueidentifier、xml和用戶定義數(shù)據(jù)類型。3.3.2創(chuàng)建數(shù)據(jù)表

創(chuàng)建數(shù)據(jù)表的一般步驟:首先,設(shè)計數(shù)據(jù)表的表結(jié)構(gòu),即定義屬性列的列名、數(shù)據(jù)類型、數(shù)據(jù)長度和是否可為空等;其次,給表定義完整性約束,限制某列的取值范圍,保證數(shù)據(jù)的正確和一致性;最后,向數(shù)據(jù)表輸入數(shù)據(jù)。創(chuàng)建數(shù)據(jù)表的關(guān)鍵是設(shè)計合適的表結(jié)構(gòu)。教務(wù)管理信息系統(tǒng)數(shù)據(jù)庫TeachSystem包括學(xué)生表student(表結(jié)構(gòu)見表3.7,表數(shù)據(jù)見表3.13)、課程表course(表結(jié)構(gòu)見表3.8,表數(shù)據(jù)見表3.14)、教師表teacher(表結(jié)構(gòu)見表3.9,表數(shù)據(jù)見表3.15)、選課表SC(表結(jié)構(gòu)見表3.10,表數(shù)據(jù)見表3.16)、授課表TC(表結(jié)構(gòu)見表3.11,表數(shù)據(jù)見表3.17)和院系表dept(表結(jié)構(gòu)見表3.12,表數(shù)據(jù)見表3.18)。3.3.2創(chuàng)建數(shù)據(jù)表3.3.2創(chuàng)建數(shù)據(jù)表3.3.2創(chuàng)建數(shù)據(jù)表(1)使用對象資源管理器創(chuàng)建數(shù)據(jù)表

啟動SQLServerManagementStudio,在對象資源管理器中,展開TeachSystem數(shù)據(jù)庫,右擊“表”選項,在彈出的快捷菜單中選擇“新建”→“表”命令,如右圖所示。

在彈出的“編輯”面板中輸入各列的名稱、數(shù)據(jù)類型、長度和是否可為空等屬性(參考表3.7的學(xué)生表結(jié)構(gòu)),如右圖圖所示。3.3.2創(chuàng)建數(shù)據(jù)表

輸入各屬性列后,單擊“保存”按鈕,彈出“選擇名稱”對話框,如圖所示。在“選擇名稱”對話框中輸入表的名稱student,單擊“確定”按鈕,學(xué)生表student創(chuàng)建完成。

(2)使用T-SQL語句創(chuàng)建數(shù)據(jù)表:使用CREATETABLE語句創(chuàng)建表,其基本語法格式如下。3.3.2創(chuàng)建數(shù)據(jù)表【例3.8】在教學(xué)管理信息數(shù)據(jù)庫TeachSystem中創(chuàng)建學(xué)生表student。USETeachSystemGOCREATETABLEstudent(SNOnchar(6)NOTNULL,SNnvarchar(10)NOTNULL,Sexnchar(2)AgeSMALLINTDNOnchar(10))GO3.3.3修改表結(jié)構(gòu)

數(shù)據(jù)表在創(chuàng)建完成之后,在使用的過程中可以對表結(jié)構(gòu)進行修改,例如增加表中的某一列,刪除表中的某一列,修改已有的某一列屬性等??梢酝ㄟ^對象資源管理器和T-SQL語句兩種方法修改表結(jié)構(gòu)。(1)使用對象資源管理器修改表結(jié)構(gòu)修改表名

啟動SQLServerManagementStudio后,在對象資源管理器中展開TeachSystem,再展開“表”選項,選中要重命名的表(如表student),右擊,在彈出的快捷菜單中選擇“重命名”命令,然后在原表S上輸入表的新名稱S,即可完成表名的更改操作。

盡管SQLServer2019允許用戶修改表的名稱。但是,一般情況下不建議修改已有表的表名,因為表名在修改之后,與表名相關(guān)聯(lián)的某些對象(如視圖、存儲過程等)將無效。3.3.3修改表結(jié)構(gòu)添加列

當(dāng)需要向表中增加項目時,就要向表中增加列。例如,對TeachSystem數(shù)據(jù)庫中的學(xué)生表student增加一列家庭住址“address”。

啟動SQLServerManagementStudio后,在對象資源管理器中展開TeachSystem,再展開“表”選項,選中要修改結(jié)構(gòu)的表(如表student),右擊,在彈出的快捷菜單中選擇“設(shè)計”命令,如右圖(上)所示。接著在彈出的“dbo.student表”的窗口中單擊一行,輸入列名“address”,選擇數(shù)據(jù)類型nvarchar(30),并選擇可以為空值,如右圖(下)所示。最后單擊工具欄上的“保存”按鈕,即可完成增加列的操作,按此操作可以添加多列。3.3.3修改表結(jié)構(gòu)刪除列

在對象資源管理器中打開學(xué)生表student的設(shè)計窗口,右擊“address”列,在彈出的快捷菜單中選擇“刪除”命令,然后單擊工具欄上的“保存”按鈕,即可完成刪除列的操作,按此操作可以刪除多列。修改列

如同增加和刪除列的操作,在表窗口中可以對已有列的數(shù)據(jù)類型、長度和是否可以為空值等屬性進行修改,單擊工具欄上的“保存”按鈕可以保存修改結(jié)果,完成修改操作。3.3.3修改表結(jié)構(gòu)(2)使用T-SQL語句修改表結(jié)構(gòu)

使用ALTERTABLE語句可以完成修改表結(jié)構(gòu)的操作,其基本語法結(jié)構(gòu)如下:其中的參數(shù)說明如下。table_name:用于指定要修改的表名稱。ALTERCOLUMN:用于指定要變更或者修改數(shù)據(jù)類型的列。col_name:用于指定要修改、添加和刪除的列全名。3.3.3修改表結(jié)構(gòu)【例3.9】向?qū)W生信息表student中增加一列“address”,數(shù)據(jù)類型為nvarchar(30),可以為空值。【例3.10】修改學(xué)生信息表student中已有列“address”,將其數(shù)據(jù)類型改為nchar。【例3.11】刪除學(xué)生信息表student中的列“address”。3.3.4查看數(shù)據(jù)表(1)使用對象資源管理器查看表結(jié)構(gòu)

在對象資源管理器窗口中,右擊需要查看結(jié)構(gòu)的表,在彈出的快捷菜單中選擇“設(shè)計”命令,打開數(shù)據(jù)表窗口,即可查看數(shù)據(jù)表的結(jié)構(gòu)信息。(2)使用系統(tǒng)存儲過程sp_help查看表結(jié)構(gòu)

sp_help的語法格式如下。

[EXECUTE]sp_help[table_name]【例3.12】查看TeachSystem數(shù)據(jù)庫中的學(xué)生表student的表結(jié)構(gòu)。

EXECUTEsp_helpstudent3.3.4查看數(shù)據(jù)表(3)查看數(shù)據(jù)表中的數(shù)據(jù)

在對象資源管理器窗口中,右擊需要查看數(shù)據(jù)的表,在彈出的快捷菜單中選擇“選擇前1000行”命令,打開數(shù)據(jù)表窗口,即可查看數(shù)據(jù)表的數(shù)據(jù)信息。在數(shù)據(jù)表窗口中,不僅能查看表的數(shù)據(jù)信息,還能向數(shù)據(jù)表插入記錄、更新記錄和刪除記錄。3.3.5刪除數(shù)據(jù)表

當(dāng)某個數(shù)據(jù)表無用時,可以將其刪除。刪除表后,該表的結(jié)構(gòu)定義、數(shù)據(jù)、全文索引、約束和索引都將從數(shù)據(jù)庫中永久刪除,存儲空間將被釋放。(1)使用對象資源管理器刪除數(shù)據(jù)表

啟動SQLServerManagementStudio后,在對象資源管理器中展開數(shù)據(jù)表所在的數(shù)據(jù)庫,再展開“表”選項,選中要刪除的表(如表student),右擊,在彈出的快捷菜單中選擇“刪除”命令,如圖所示。然后,在“刪除對象”對話框中單擊“確定”按鈕,即可完成數(shù)據(jù)表的刪除操作。3.3.5刪除數(shù)據(jù)表(2)使用T-SQL語句刪除數(shù)據(jù)表

刪除數(shù)據(jù)表可以使用DROPTABLE命令,其語法格式如下。

DROPTABLEtable_name[,…n]【例3.13】刪除TeachSystem數(shù)據(jù)庫中的學(xué)生表student。

USETeachSystem

GO

DROPTABLEstudent

GO3.3.6更新數(shù)據(jù)表更新數(shù)據(jù)表主要是指向數(shù)據(jù)表中插入記錄、修改記錄和刪除記錄。插入記錄主要使用INSERT語句,修改記錄主要使用UPDATA語句,刪除記錄主要使用DELETE語句。(1)插入記錄

使用INSERT語句可以向數(shù)據(jù)表中插入一條記錄或多條記錄,且該記錄插入數(shù)據(jù)表的末尾。INSERT語句的語法格式如下。3.3.6更新數(shù)據(jù)表【例3.14】向?qū)W生表student中插入一條記錄('S10','張杰','男',19,'08')?!纠?.15】向?qū)W生表student中插入一條記錄的部分?jǐn)?shù)據(jù)值,只輸入SNO、SN兩個列的值:S11、李偉。3.3.6更新數(shù)據(jù)表(2)修改記錄

使用UPDATE語句修改表中數(shù)據(jù)的語法格式如下?!纠?.16】對例3.15中向表student中插入的記錄進行修改,修改語句如下。3.3.6更新數(shù)據(jù)表(3)刪除記錄

使用DELETE語句刪除表中記錄的語法格式如下。【例3.17】刪除數(shù)據(jù)表student中姓名為王杰的學(xué)生記錄,刪除語句如下?!纠?.18】刪除數(shù)據(jù)表student中所有的記錄,刪除語句如下。數(shù)據(jù)查詢043.4數(shù)據(jù)查詢在數(shù)據(jù)庫應(yīng)用系統(tǒng)中,表的查詢是經(jīng)常使用的操作??梢栽赟QLServerManagementStudio中通過對象資源管理器查詢數(shù)據(jù),也可以使用SELECT語句完成查詢操作。SQLServer2019提供了SELECT語句較完整的語法形式,該語句具有靈活的使用方式和豐富的功能。當(dāng)使用SELECT語句構(gòu)造查詢語句時,熟悉基本參數(shù)和選項能更有效地實現(xiàn)數(shù)據(jù)查詢。SELECT語句是T-SQL從數(shù)據(jù)庫中獲取信息的一個基本語句。該語句可以實現(xiàn)從一個或多個數(shù)據(jù)庫的一個或多個表中查詢信息,并將結(jié)果顯示為另外一個表(結(jié)果集)的形式。SELECT語句的基本語法格式如下。3.4數(shù)據(jù)查詢select_list:指明要查詢的選擇列表。table_source:指明查詢的表或視圖的名稱。source_condition:指明查詢要滿足的條件。group_by_expression:根據(jù)指定列中的值對結(jié)果集進行分組。search_condition:對FROM、WHERE或GROUPBY子句中創(chuàng)建的中間結(jié)果集進行行的篩選,通常與GROUPBY子句一起使用。<order_expression>[ASC|DESC]:對查詢結(jié)果集中的行重新排序。ASC和DESC關(guān)鍵字分別用于指定按升序或降序排序。如果省略ASC或DESC,則系統(tǒng)默認(rèn)為升序。3.4.1投影查詢使用SELECT語句可以選擇查詢表或視圖中的一列或者多列,當(dāng)選擇多列時,列之間要用“,”分隔。【例3.19】查詢?nèi)w學(xué)生的學(xué)號、姓名和年齡。3.4.1投影查詢(1)使用星號(*)查詢所有的列

如果想從FROM子句指定的表或視圖中查詢返回所有的列,可以在選擇列表中選擇星號*,而不需要列出表或視圖中所有的列?!纠?.20】查詢學(xué)生表student中的所有信息,即所有的行和所有的列。3.4.1投影查詢(2)使用DISTINCT消除重復(fù)值

在SELECT語句的選擇列表中使用DISTINCT關(guān)鍵字,可以從結(jié)果集中消除指定列的值重復(fù)的行?!纠?.21】查詢學(xué)生表student中學(xué)生的專業(yè),消除重復(fù)的行。

從第一部分語句的執(zhí)行結(jié)果和第二部分語句的執(zhí)行結(jié)果中,可以發(fā)現(xiàn)學(xué)生的院系編號有多行重復(fù),使用DISTINCT關(guān)鍵字可以實現(xiàn)去掉重復(fù)的行。3.4.1投影查詢(3)使用TOPn[PERCENT]僅返回n行

使用TOP關(guān)鍵字,可以從查詢結(jié)果集中只返回前n行。如果指定了PERCENT關(guān)鍵字,則返回前n%行,此時n必須介于0~100。如果查詢包括ORDERBY子句,則首先對行進行排序,然后從排序后的結(jié)果集中返回前n行或n%行。【例3.22】從學(xué)生表student中查詢學(xué)生的所有信息,要求只返回前3行數(shù)據(jù)?!纠?.23】從學(xué)生表student中查詢學(xué)生的所有信息,要求只返回前20%行數(shù)據(jù)。3.4.1投影查詢(4)修改查詢結(jié)果的列標(biāo)題(別名)

利用投影查詢可以控制列名的順序,并可通過指定別名改變查詢結(jié)果中的列標(biāo)題的名稱。修改查詢結(jié)果的列標(biāo)題有如下兩種方法。將要顯示的列標(biāo)題用單引號括起來后,寫在列名后面,兩者之間用空格或AS分隔開。將要顯示的列標(biāo)題用單引號括起來后接等號(=),以及要查詢的列名?!纠?.24】查詢?nèi)w學(xué)生的學(xué)號、姓名和年齡,改變查詢結(jié)果的列名顯示。3.4.2選擇查詢選擇查詢就是指定查詢條件,然后在表中顯示滿足查詢條件的記錄。為了選擇表中滿足查詢條件的某些行,可以使用SQL命令中的WHERE子句。WHERE子句后跟查詢的邏輯表達(dá)式,通常情況下,必須定義一個或多個條件限制檢索選擇的數(shù)據(jù)行,結(jié)果集將返回表達(dá)式為真的數(shù)據(jù)行。在WHERE子句中,查詢條件表達(dá)式可以包含比較運算符和邏輯運算符。(1)比較,包括<、<=、!<、>、>=、>!、=、!=、<>等。(2)范圍,包括BETWEENAND和NOTBETWEENAND。(3)集合,包括IN和NOTIN等。(4)字符匹配,包括LIKE和NOTLIKE。(5)未知判斷,包括ISNULL和ISNOTNULL。(6)組合條件,包括AND、OR、NOT等。3.4.2選擇查詢(1)比較【例3.25】查詢學(xué)生表student中性別為女的學(xué)生記錄?!纠?.26】查詢學(xué)生表student中年齡大于20歲的學(xué)生記錄。3.4.2選擇查詢(2)范圍

在WHERE子句的查詢篩選條件表達(dá)式中,可以使用BETWEEN…AND運算符查詢某一指定范圍的記錄。NOTBETWEEN…AND檢索不在某一范圍內(nèi)的信息?!纠?.27】查詢教師表teacher中在1990年1月1日到2000年1月1日之間入職的教師信息。3.4.2選擇查詢(3)集合

IN關(guān)鍵字允許用戶選擇與列表中的值相匹配的行,指定項必須用括號括起來,并用逗號隔開,表示“或”的關(guān)系。NOTIN表示的含義正好相反?!纠?.28】查詢選修了C01、C02或C03的學(xué)生的學(xué)號、課程號和成績。3.4.2選擇查詢(4)字符匹配

LIKE關(guān)鍵字用于查詢與指定的某些字符串表達(dá)式模糊匹配的數(shù)據(jù)行。LIKE后的表達(dá)式被定義為字符串,必須用半角單引號括起來,字符串中可以使用以下四種通配符。%:匹配任意類型和長度的字符串。例如,LIKE'張%'匹配以“張”開頭的字符串。LIKE'%應(yīng)用%'匹配的是前后字符串為任意,中間含有“應(yīng)用”兩個字的字符串。_(下畫線):可以匹配任何單個字符。例如,LIKE'_偉%'匹配的是第二個字符為“偉”的任何字符串。[]:匹配任何在范圍或集合之內(nèi)的單個字符。例如,[a-i]匹配的是a、b、c、d、e、f、g、h、i單個字符。[^]:匹配不在指定范圍之內(nèi)或集合的任何單個字符。例如,LIKE'[^a-c]'匹配的是不為a、b、c的所有字符串。3.4.2選擇查詢【例3.29】查詢姓“劉”的教師的信息?!纠?.30】查詢第二個字為“明”的教師的姓名、性別和職稱?!纠?.31】首先向?qū)W生表輸入一個學(xué)號為“S10”、姓名為“JAMES_TM”和院系編號為“08”的學(xué)生記錄,然后查詢姓名中含有下畫線的學(xué)生的學(xué)號、姓名、院系編號。3.4.2選擇查詢(5)未知判斷

某個字段沒有值,稱之為具有空值。通常某個列的值不確定,沒有輸入一個具體的值,該列的值就為空值??罩挡煌诹慊蛘呖崭?,其不占任何存儲空間。涉及空值查詢時,使用ISNULL或ISNOTNULL,這里的IS不能用“=”代替?!纠?.32】某些學(xué)生選修課程后沒有參加考試,所以有選修記錄,沒有考試成績。查詢?nèi)鄙倏荚嚦煽兊膶W(xué)生的學(xué)號和相應(yīng)的課程號。3.4.2選擇查詢(6)組合條件

當(dāng)WHERE子句中有多個查詢條件時,可以使用邏輯運算符AND、OR和NOT連接多個查詢條件,形成復(fù)雜的邏輯表達(dá)式。其優(yōu)先級由高到低為:NOT、AND、OR。但可用括號改變優(yōu)先級?!纠?.33】查詢學(xué)生表student中性別為男且年齡大于等于19歲的學(xué)生記錄。3.4.3排序查詢通常情況下,SELECT語句可以返回的查詢結(jié)果集的記錄是按表中記錄的物理順序排列的。ORDERBY子句可以按照升序(ASC)或降序(DESC)排列各行或各列,如果省略,則系統(tǒng)默認(rèn)為升序。需要注意的是,ORDERBY子句必須是SQL命令的最后一個語句,ORDERBY子句中不能使用NTEXT、TEXT和IMAGE列。【例3.34】查詢選修了C01課程的學(xué)生的學(xué)號和成績,并按照成績降序排列。3.4.3排序查詢對于空值,排序時的顯示順序由具體系統(tǒng)的實現(xiàn)決定。例如,按升序排列,含空值的記錄最后顯示;按降序排列,含空值的記錄則最先顯示。各個系統(tǒng)的實現(xiàn)可以不同,只要保持一致就行?!纠?.35】查詢選修了C01~C06課程的學(xué)生的學(xué)號、課程號和成績,3.4.4使用聚合函數(shù)聚合函數(shù)實現(xiàn)數(shù)據(jù)統(tǒng)計等功能,用于對一組值進行計算并返回一個單一的值。除了COUNT(*)外,聚合函數(shù)遇到空值時都忽略空值,僅處理非空值。SQL提供了許多聚合函數(shù),增強了基本的數(shù)據(jù)檢索能力。其參數(shù)說明如下。ALL:對所有的值進行聚合函數(shù)運算。ALL是默認(rèn)值。DISTINCT:指定只在每個值的唯一實例上執(zhí)行,而不管該值出現(xiàn)多少次。表達(dá)式:是精確數(shù)值或近似數(shù)值數(shù)據(jù)類型的表達(dá)式。不允許使用聚合函數(shù)和子查詢。3.4.4使用聚合函數(shù)【例3.36】查詢學(xué)生表student中學(xué)生的總數(shù)?!纠?.37】查詢選修了課程的學(xué)生人數(shù)?!纠?.38】求課程的最高分、最低分及之間相差的分?jǐn)?shù)。3.4.5分組查詢在大多數(shù)情況下,使用統(tǒng)計函數(shù)返回的是所有行數(shù)據(jù)的統(tǒng)計結(jié)果。如果需要按某一列數(shù)據(jù)的值進行分類,在分類的基礎(chǔ)上再進行統(tǒng)計,就要使用GROUPBY子句。GROUPBY子句將查詢結(jié)果按分組表達(dá)式的值進行分組,值相等的為一個組。使用HAVING子句可以對這些組進一步加以控制,篩選出滿足分組篩選條件的分組,以便在查詢結(jié)果中輸出。當(dāng)一個聚合函數(shù)和GROUPBY子句一起使用時,聚合函數(shù)的作用范圍變?yōu)槊拷M的所有記錄?!纠?.39】查詢每個教師的教工號及任課門數(shù)。3.4.5分組查詢【例3.40】查詢?nèi)握n一門以上的教師的教工號及任課門數(shù)?!纠?.41】查詢至少選修兩門課程且課程成績?yōu)榱己茫ù笥?0分)的學(xué)生的學(xué)號和最高分。3.4.6連接查詢前面的查詢都是針對一個表進行的,若一個查詢同時涉及兩個及兩個以上的表,則稱為連接查詢。連接查詢是關(guān)系數(shù)據(jù)庫中最主要的查詢,主要包括內(nèi)連接、外連接和交叉連接等。通過連接查詢可以實現(xiàn)多表查詢。在關(guān)系數(shù)據(jù)庫管理系統(tǒng)中,表建立時各數(shù)據(jù)之間的關(guān)系不必確定,常把一個實體的所有信息存放在一個表中。當(dāng)檢索數(shù)據(jù)時,通過連接操作查詢出存放在多個表中的不同實體的信息。連接查詢實際上是通過各個表之間的共同列(字段)的關(guān)聯(lián)性實現(xiàn)的,這種關(guān)聯(lián)字段稱為連接字段。連接操作給用戶帶來很大的靈活性,可以在任何時候添加新的數(shù)據(jù)類型,為不同實體創(chuàng)建新的表,然后通過連接進行查詢。在SQLServer2019中,可以使用兩種連接語法形式。一種是ANSI連接語法形式,此時連接用在FROM子句中,另一種是使用SQLServer連接語法形式,此時連接用在WHERE子句中(僅內(nèi)連接可使用,稱為舊式內(nèi)連接)。3.4.6連接查詢(1)WHERE子句中定義連接

在SELECT后面使用多個數(shù)據(jù)表且有同名字段時,必須明確定義字段所在的數(shù)據(jù)表名稱。連接操作符可以是=、!=、<>、>、<、>=、<=、!>、!<。當(dāng)操作符是“=”時,表示等值連接。(2)FROM子句中定義連接

其中,join_type指定連接的類型,可以是INNERJOIN(內(nèi)連接)、OUTERJOIN(外連接)、CROSSJOIN(交叉連接)。3.4.6連接查詢(1)等值連接與非等值連接

等值連接是指表之間的連接條件使用“=”運算符,而使用其他比較運算符的連接稱為非等值連接。除了使用比較運算符>、>=、<、<=、<>等,非等值連接還可以使用BETWEENAND之類的謂詞。【例3.42】查詢“王欣”同學(xué)選修的課程,結(jié)果顯示學(xué)號、姓名、課程號。3.4.6連接查詢【例3.43】查詢教師的教工號、教師姓名和講授的課程名稱?!纠?.44】在TeachSystem數(shù)據(jù)庫中創(chuàng)建一個grade表,然后查詢所有學(xué)生的SNO、CNO和rank,具體T-SQL語句如下。

本例使用BETWEENAND條件式,即條件不是等值條件,而是限定在一個范圍內(nèi),屬于非等值連接方式。3.4.6連接查詢(2)自身連接

連接操作不僅可以在兩個或兩個以上的表之間進行連接,也可以是一個表與其自身進行的連接,稱為自身連接?!纠?.45】查詢比韓耀飛年齡大的學(xué)生的姓名、年齡及韓耀飛的年齡。本例使用FROM子句定義連接條件,具體T-SQL語句如下。3.4.6連接查詢(3)外連接

在內(nèi)連接中,只有在兩個表中匹配的記錄才能在結(jié)果集中出現(xiàn)。而外連接只限制一個表,對另外一個表不加限制。外連接會返回FROM子句中提到的至少一個表或視圖的所有行,只要這些行符合任何WHERE或HAVING子句的篩選條件,將檢索通過左連接引用的左表的所有行,以及通過右連接引用的右表的所有行。全外連接中兩個表的行都將返回。①左外連接

左外連接又稱左連接,對左邊的表不加限制,用于顯示符合條件的數(shù)據(jù)行及左表中不符合條件的數(shù)據(jù)行,此時右表中的數(shù)據(jù)行會以NULL顯示。3.4.6連接查詢【例3.46】查詢所有課程的任課老師,顯示課程名和其對應(yīng)的授課老師的姓名,無授課老師的課程則授課老師的姓名一欄顯示NULL。②右外連接

右外連接又稱右連接,用于顯示符合條件的數(shù)據(jù)行及右表中不符合條件的數(shù)據(jù)行,此時左表中的數(shù)據(jù)行會以NULL顯示?!纠?.47】查詢所有老師的任課情況,顯示教師姓名和所授課程的課程名,如老師沒有授課,則對應(yīng)的課程名一欄顯示NULL。

為了觀察右外連接的執(zhí)行效果,首先使用INSERT語句向教師表T中添加一條記錄,語句如下。3.4.6連接查詢下面使用右外連接進行查詢。③全外連接

全外連接又稱全連接,全外連接對兩個表都不加限制,用于顯示符合條件的數(shù)據(jù)行及左表和右表中不符合條件的數(shù)據(jù)行,此時缺少數(shù)據(jù)的數(shù)據(jù)行會以NULL顯示。

【例3.48】查詢所有老師的任課情況和所有課程的任課老師。3.4.6連接查詢(4)交叉連接

使用關(guān)鍵字CROSS包含一個以上的表的連接稱為交叉連接,不能使用WHERE子句。交叉連接的結(jié)果集中,兩個表中每兩個可能成對的行占一行。在數(shù)學(xué)上,就是表的笛卡兒積。第一個表的行數(shù)乘以第二個表的行數(shù)等于笛卡兒積結(jié)果集的大小?!纠?.49】學(xué)生表student交叉連接課程表course。3.4.7子查詢子查詢是一個嵌套在SELECT、INSERT、UPDATE或DELETE語句或其他子查詢中的查詢。包含子查詢的語句稱為外部查詢或外部選擇。子查詢能夠?qū)⒈容^復(fù)雜的查詢分解為幾個簡單的查詢,而且子查詢可以嵌套。子查詢的執(zhí)行過程是:首先執(zhí)行內(nèi)部查詢,其查詢的結(jié)果并不顯示出來,而是傳遞給外層語句,并作為外層語句的條件使用。子查詢可以嵌套在外部SELECT、INSERT、UPDATE或DELETE語句的WHERE或HAVING子句內(nèi),也可以嵌套在其他子查詢內(nèi)。盡管根據(jù)可用內(nèi)存和查詢中其他表達(dá)式的復(fù)雜程度的不同,嵌套限制也有所不同,但嵌套到32層是可能的。3.4.7子查詢(1)返回單個值的子查詢

當(dāng)子查詢的返回值是單個值時,可以使用>、=、<、>=、<=、<>等比較運算符將外部查詢與子查詢連接起來?!纠?.50】查詢與“韓耀飛”同學(xué)院系相同的學(xué)生的學(xué)號、姓名和院系編號。3.4.7子查詢(2)返回一組值的子查詢

當(dāng)子查詢的返回值不止一個,而是一個集合時,則不能直接使用比較運算符,可以將ANY或ALL結(jié)合比較運算符使用,且ANY或ALL在比較運算符和子查詢之間。使用ANY進行子查詢【例3.51】查詢選修了C01課程的學(xué)生的姓名和院系編號。

先執(zhí)行子查詢,查詢選修了C01課程的學(xué)生的學(xué)號,學(xué)號為一組值構(gòu)成的集合;再執(zhí)行外部查詢。其中ANY的含義為任意一個,外部查詢查詢學(xué)號匹配內(nèi)查詢結(jié)果集中的任意一個。本例還可以使用IN實現(xiàn)查詢,使用IN代替上面語句中的=ANY即可。3.4.7子查詢【例3.52】查詢其他系比“06”系任意一個學(xué)生年齡大的學(xué)生的姓名和年齡。(2)使用ALL進行子查詢【例3.53】查詢其他系比“06”系所有學(xué)生年齡大的學(xué)生的姓名和年齡。3.4.7子查詢(3)使用EXISTS的子查詢

將EXISTS作用于一個子查詢時,如果子查詢至少返回一行則產(chǎn)生邏輯值“TRUE”,不返回任何行則產(chǎn)生邏輯值“FALSE”。NOTEXISTS與EXISTS的作用相反。

由EXISTS引出的子查詢,其選擇列表通常使用“*”表示,因為帶EXISTS的子查詢只用于檢查是否返回行,給出列名沒有實際意義。【例3.54】查詢選修了C01課程的學(xué)生的姓名和院系編號。當(dāng)子查詢中SC表中存在一行記錄滿足其WHERE子句的條件時,外部查詢便得到一個學(xué)生的信息,重復(fù)執(zhí)行以上過程,直到查詢完成。

本例中的子查詢的條件依賴于外部查詢的屬性值student.SNO,子查詢條件是否成立與這個屬性的值有關(guān),因此這類查詢稱為相關(guān)子查詢。3.4.7子查詢相關(guān)子查詢和普通子查詢兩者在執(zhí)行方式上有很大的區(qū)別。普通子查詢:首先執(zhí)行子查詢,然后把子查詢的結(jié)果作為外部查詢的查詢條件的值。普通子查詢只執(zhí)行一次,而外部查詢所涉及的所有記錄行都與子查詢的結(jié)果比較來確定最終結(jié)果集。相關(guān)子查詢:首先選擇外部查詢的第一行記錄,內(nèi)部子查詢利用此行中的某個屬性值進行查詢,然后外部查詢根據(jù)子查詢的返回結(jié)果判斷此行是否滿足查詢條件。如果滿足條件,則把該行放入父查詢的查詢結(jié)果集中。重復(fù)執(zhí)行此過程,直到處理完父查詢表中的每行記錄。(4)UPDATE、DELETE和INSERT語句中的子查詢除了嵌套在SELECT語句中,子查詢還可以嵌套在UPDATE、DELETE和INSERT語句中。

【例3.55】刪除沒有被選修的課程。3.4.8集合查詢SELECT語句的查詢結(jié)果是元組的集合,因此多個SELECT語句的結(jié)果可以進行集合操作。集合操作主要包括并操作(UNION)、交操作(INTERSECT)和差操作(EXCEPT)。參加集合操作的各個查詢結(jié)果的列數(shù)必須相同,對應(yīng)的數(shù)據(jù)類型必須兼容?!纠?.56】查詢選修了課程C01或課程C02的學(xué)生集合的并集。

使用UNION關(guān)鍵字,將多個查詢的結(jié)果合并起來,系統(tǒng)會自動去掉重復(fù)的元組。如果要保留重復(fù)的元組,可以使用UNIONALL操作符。3.4.8集合查詢【例3.57】查詢系別為“08”的學(xué)生與年齡大于18歲的學(xué)生的交集。【例3.58】查詢系別為“08”的學(xué)生與年齡大于18歲的學(xué)生的差集。

使用INTERSECT關(guān)鍵字,返回其左右兩邊的兩個查詢的結(jié)果集的交集。

使用EXCEPT關(guān)鍵字,從其左邊的查詢結(jié)果中刪除右邊的查詢結(jié)果中相同的記錄,即兩個查詢做差運算。視圖053.5視圖視圖是關(guān)系數(shù)據(jù)庫系統(tǒng)提供給用戶以多種角度觀察數(shù)據(jù)庫中數(shù)據(jù)的重要機制,是一個虛表,其內(nèi)容由查詢定義。同真實的表一樣,視圖包含一系列帶有名稱的列和行數(shù)據(jù)。但是,視圖并不在數(shù)據(jù)庫中以存儲的數(shù)據(jù)值集形式存在。行和列數(shù)據(jù)來自定義視圖的查詢所引用的表,并且在引用視圖時動態(tài)生成。視圖是一種常用的數(shù)據(jù)庫對象,可以把它看成從一個或幾個基本表中導(dǎo)出的虛表或存在數(shù)據(jù)庫中的查詢。對于其所引用的基本表來說,視圖的作用類似于篩選。定義視圖的篩選可以來自當(dāng)前數(shù)據(jù)庫或其他數(shù)據(jù)庫的一個或多個表,或者其他視圖。但是視圖并不是以一組數(shù)據(jù)的形式存儲在數(shù)據(jù)庫中,數(shù)據(jù)庫中只存儲視圖的定義,而不存儲視圖對應(yīng)的數(shù)據(jù),這些數(shù)據(jù)仍然存儲在導(dǎo)出視圖的基本表中。當(dāng)基本表中的數(shù)據(jù)發(fā)生變化時,從視圖中查詢出來的數(shù)據(jù)也隨之變化。3.5視圖視圖為數(shù)據(jù)庫用戶帶來很多便利之處,主要包括以下幾個方面。(1)簡化查詢操作。為復(fù)雜的查詢建立一個視圖,用戶不必鍵入復(fù)雜的查詢語句,只針對視圖做簡單的查詢即可。(2)數(shù)據(jù)保密。對不同的用戶定義不同的視圖,使用戶只能看到與自己有關(guān)的數(shù)據(jù)。(3)保證數(shù)據(jù)的邏輯獨立性。對于視圖的操作,例如查詢,只依賴于視圖的定義。當(dāng)視圖的基表要修改時,只需修改視圖定義的子查詢部分,而基于視圖的查詢不用改變。3.5.1創(chuàng)建視圖視圖是一種數(shù)據(jù)對象,保存在數(shù)據(jù)庫中,而查詢則不然,因此創(chuàng)建新視圖的過程與創(chuàng)建查詢的過程不同。SQLServer提供了兩種創(chuàng)建視圖的方法:使用對象資源管理器創(chuàng)建視圖和使用T-SQL語句創(chuàng)建視圖。(1)使用對象資源管理器創(chuàng)建視圖啟動SQLServerManagementStudio,在對象資源管理器中,展開TeachSystem數(shù)據(jù)庫,右擊“視圖”選項,在彈出的快捷菜單中選擇“新建視圖”命令,如圖所示。在彈出的“添加表”對話框中,選擇要使用的表或視圖,然后單擊“添加”按鈕,或者雙擊選中的表或視圖,就可將其添加到視圖的查詢中,這里選擇student表和SC表,如圖所示。最后單擊“關(guān)閉”按鈕,關(guān)閉“添加表”對話框,如圖所示的“視圖設(shè)計器”窗口。3.5.1創(chuàng)建視圖“視圖設(shè)計器”窗口由四個區(qū)組成,從上到下依次為關(guān)系圖窗格(表區(qū))、網(wǎng)格窗格(列區(qū))、SQL窗格(SQLSCRIPT區(qū))和結(jié)果窗格(數(shù)據(jù)結(jié)果區(qū))。在最上面的表區(qū)中選擇相應(yīng)的列,對每一列進行選中或取消選中,就可以控制屬性列是否在視圖中出現(xiàn)。在表區(qū)選中的列,將在列區(qū)中顯示,相應(yīng)的SQL語句將在SQLSCRIPT區(qū)中顯示。如果需要對某列進行分組,可以右擊屬性列,在彈出的快捷菜單中選擇“添加分組依據(jù)”命令。單擊工具欄上的紅色驚嘆號(!)按鈕可以預(yù)覽結(jié)果。最后單擊工具欄上的“保存”按鈕并輸入視圖的名稱,完成視圖的創(chuàng)建。3.5.1創(chuàng)建視圖(2)使用T-SQL語句創(chuàng)建視圖創(chuàng)建視圖可以使用CREATEVIEW語句實現(xiàn),其基本語法如下。view_name:視圖名稱。視圖名稱必須符合有關(guān)標(biāo)識符的規(guī)則。column:視圖中的列名,如果未指定列名,則視圖列將獲得與SELECT語句中的列相同的名字。WITHENCRYPTION:對CREATEVIEW語句的定義文本進行加密。AS:指定視圖要執(zhí)行的操作。select_statement:定義視圖的SELECT語句。該語句可以使用多個表和其他視圖。WITHCHECKOPTION:強制針對視圖執(zhí)行的所有數(shù)據(jù)修改語句都必須符合在select_statement中設(shè)置的條件。3.5.1創(chuàng)建視圖【例3.59】創(chuàng)建院系編號為“08”的學(xué)生信息的視圖?!纠?.60】創(chuàng)建院系編號為“08”的學(xué)生信息的視圖,要求在進行插入和更新操作時保證該視圖只有院系編號為“08”的學(xué)生。3.5.1創(chuàng)建視圖【例3.61】創(chuàng)建院系編號為“08”并選修了課程C02的學(xué)生信息的視圖?!纠?.62】創(chuàng)建學(xué)生平均成績的視圖?!纠?.63】創(chuàng)建學(xué)生平均成績的視圖,要求平均成績大于80。3.5.2修改視圖

視圖在創(chuàng)建成功之后,根據(jù)需要還可以修改其定義。視圖定義可以通過對象資源管理器修改,或通過ALTERVIEW語句進行修改,但對于加密存儲的視圖定義,只能通過ALTERVIEW語句進行修改。(1)使用對象資源管理器修改視圖

在對象資源管理器中,展開TeachSystem數(shù)據(jù)庫,再展開“視圖”,選中需要修改的視圖,右擊,在彈出的快捷菜單中選擇“設(shè)計”命令,將打開視圖設(shè)計器窗口,然后就可以如同創(chuàng)建視圖一樣對視圖定義進行修改。3.5.2修改視圖(2)使用T-SQL語句修改視圖

使用ALTERVIEW語句可以更改一個已存在的視圖的定義,其基本語法格式如下?!纠?.64】修改視圖S_VIEW的定義。3.5.3查看視圖

SQLServer允許用戶查看視圖的一些信息,如視圖的基本信息、定義信息、與其他對象建立的依賴關(guān)系等。這些信息可以通過相應(yīng)的存儲過程查看??梢允褂脤ο筚Y源管理器和系統(tǒng)存儲過程查看視圖信息。(1)使用對象資源管理器查看視圖信息

啟動SQLServerManagementStudio,在對象資源管理器中,依次展開“TeachSystem”→“視圖”→“dbo.S_VIEW”→“列”,即可查看視圖S_VIEW的列信息,包括列名稱、數(shù)據(jù)類型和約束信息,如圖所示。3.5.3查看視圖(2)使用存儲過程查看視圖信息

在SQLServer中,可以使用三個系統(tǒng)存儲過程了解視圖的信息,其分別是sp_depends、sp_help和sp_helptext。查看視圖與其他對象間的依賴關(guān)系

可以使用系統(tǒng)存儲過程sp_depends查看視圖與其他對象間的依賴關(guān)系。其語法形式如下?!纠?.65】查看視圖S_VIEW依賴的對象和列。

EXECsp_dependsS_VIEW3.5.3查看視圖查看視圖的基本信息

可以使用系統(tǒng)存儲過程SP_HELP顯示視圖的名稱、所有者、創(chuàng)建日期、列信息、參數(shù)等。其語法格式如下。

[EXCUTE]sp_help[[@objname=]'name']

參數(shù)[@objname=]'name'是數(shù)據(jù)庫對象的名稱?!纠?.66】查看視圖S_VIEW的詳細(xì)信息。

EXECsp_helpS_VIEW3.5.3查看視圖查看視圖的定義信息

如果視圖在創(chuàng)建時沒有加密,即創(chuàng)建視圖時沒有選擇WITHENCRYPTION,則可以使用系統(tǒng)存儲過程sp_helptext顯示視圖的定義信息。其語法格式如下。

[EXECUTE]sp_helptext[@objname=]'name'

參數(shù)[@objname=]'name'是數(shù)據(jù)庫對象的名稱,該數(shù)據(jù)庫對象必須在當(dāng)前數(shù)據(jù)庫中。【例3.67】查看視圖S_VIEW的定義文本。

EXECsp_helptextS_VIEW3.5.4刪除視圖

當(dāng)不再需要一個視圖,或想清除視圖定義及與之相關(guān)聯(lián)的權(quán)限時,可以刪除視圖。刪除視圖后,與視圖相關(guān)的數(shù)據(jù)并不受影響,只是刪除了定義在系統(tǒng)表中的視圖信息和視圖相關(guān)的權(quán)限。(1)使用對象資源管理器刪除視圖

啟動SQLServerManagementStudio,在對象資源管理器中,展開TeachSystem數(shù)據(jù)庫,再展開“視圖”,右擊欲刪除的視圖,如S_VIEW,在彈出的快捷菜單中選擇“刪除”命令,在彈出的“刪除對象”對話框中單擊“確定”按鈕,即可刪除視圖S_VIEW,如圖所示。3.5.4刪除視圖(2)使用T-SQL語句刪除視圖

可以使用DROPVIEW語句完成從當(dāng)前數(shù)據(jù)庫中刪除一個或多個視圖,其語法格式如下。

DROPVIEWview_name[…,n][;]【例3.68】刪除視圖S_VIEW。

DROPVIEWS_VIEW3.5.5查詢視圖

在定義視圖以后,用戶就可以對視圖進行查詢操作,查詢視圖數(shù)據(jù)的方法和查詢表一樣?!纠?.69】查詢視圖S_VIEW中年齡大于18歲的學(xué)生的姓名和年齡。

此查詢的執(zhí)行過程是:系統(tǒng)首先從數(shù)據(jù)字典中找到S-VIEW視圖的定義,然后把此定義與用戶的查詢結(jié)合起來,轉(zhuǎn)化成等價的對基本表student的查詢,然后執(zhí)行修正了的查詢,這一轉(zhuǎn)換過程稱為視圖消解,相當(dāng)于執(zhí)行了下列語句。

3.5.6更新視圖

由于視圖是一個虛表,因此對視圖的更新實際上最終要轉(zhuǎn)化成對基本表的更新。其更新操作包括插入、修改和刪除數(shù)據(jù)。如果要防止用戶通過視圖對不屬于視圖范圍內(nèi)的基本表數(shù)據(jù)進行操作,可在定義視圖時加上WITHCHECKOPTION子句。這樣在視圖上對數(shù)據(jù)進行增、刪、改時,SQLServer系統(tǒng)會檢查視圖定義中SELECT語句設(shè)置的條件,若操縱的記錄不滿足條件,則拒絕執(zhí)行相應(yīng)的操作。(1)插入數(shù)據(jù)

在視圖上用INSERT語句插入數(shù)據(jù)時要符合以下規(guī)則。使用INSERT語句向數(shù)據(jù)表中插入數(shù)據(jù)時,用戶必須具備插入數(shù)據(jù)的相關(guān)權(quán)限。進行插入操作的視圖只能引用一個基本表的列。視圖中包含的列必須是直接引用的表列中的基礎(chǔ)數(shù)據(jù),不能是通過計算或聚合函數(shù)等方式派生得出的。3.5.6更新視圖在基本表中插入的數(shù)據(jù)必須符合在相關(guān)列上定義的約束條件,如是否為空、默認(rèn)值的定義等。視圖中不能包含DISTINCT、GROUPBY或H

溫馨提示

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

評論

0/150

提交評論