數(shù)據(jù)庫(kù)技術(shù)及應(yīng)用03結(jié)構(gòu)化查詢語(yǔ)言-課件_第1頁(yè)
數(shù)據(jù)庫(kù)技術(shù)及應(yīng)用03結(jié)構(gòu)化查詢語(yǔ)言-課件_第2頁(yè)
數(shù)據(jù)庫(kù)技術(shù)及應(yīng)用03結(jié)構(gòu)化查詢語(yǔ)言-課件_第3頁(yè)
數(shù)據(jù)庫(kù)技術(shù)及應(yīng)用03結(jié)構(gòu)化查詢語(yǔ)言-課件_第4頁(yè)
數(shù)據(jù)庫(kù)技術(shù)及應(yīng)用03結(jié)構(gòu)化查詢語(yǔ)言-課件_第5頁(yè)
已閱讀5頁(yè),還剩246頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、結(jié)構(gòu)化查詢SQL(Structured Query Language)是關(guān)系數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言,對(duì)關(guān)系模型的發(fā)展和商用DBMS的研制起著重要的作用。SQL語(yǔ)言建立在關(guān)系運(yùn)算理論基礎(chǔ)之上,是介于關(guān)系代數(shù)和元組演算之間的一種語(yǔ)言,是一種通用的、功能強(qiáng)大的關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言。本章將介紹SQL的數(shù)據(jù)定義、數(shù)據(jù)查詢、數(shù)據(jù)更新和嵌入式SQL。緒論機(jī)械工業(yè)出版社0目錄SQL語(yǔ)言概述3.1SQL數(shù)據(jù)定義3.2 SQL數(shù)據(jù)查詢3.3SQL數(shù)據(jù)更新3.4視圖 3.5SQL 數(shù)據(jù)控制 3.6 嵌入式SQL 3.7機(jī)械工業(yè)出版社13.1 SQL語(yǔ)言概述3.1.1 SQL語(yǔ)言的產(chǎn)生與發(fā)展: 1970年,美國(guó)IBM研究中心的E

2、.Codd發(fā)表多篇文章,提出了關(guān)系模型。1972年,IBM公司開(kāi)始研制關(guān)系數(shù)據(jù)庫(kù)管理實(shí)驗(yàn)系統(tǒng)System R,配制的查詢語(yǔ)言稱(chēng)為SQUARE語(yǔ)言(Specifying Queries As Relational Expression),在語(yǔ)言中使用了大量的數(shù)學(xué)符號(hào)。1974年,Boyce和Chamberlin把SQUARE語(yǔ)言修改為SEQUEL語(yǔ)言(Structured English Query Language)。這兩種語(yǔ)言在本質(zhì)上是相同的,但后者去掉了一些數(shù)學(xué)符號(hào),并采用英語(yǔ)單詞表示和結(jié)構(gòu)式的語(yǔ)法規(guī)則,后來(lái)SEQUEL語(yǔ)言簡(jiǎn)稱(chēng)為SQL,即結(jié)構(gòu)化查詢語(yǔ)言。由于它功能豐富,語(yǔ)言簡(jiǎn)捷,倍受用戶

3、歡迎。經(jīng)眾多計(jì)算機(jī)公司的不斷修改、擴(kuò)充和完善,SQL語(yǔ)言最終發(fā)展成為關(guān)系數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言。機(jī)械工業(yè)出版社23.1 SQL語(yǔ)言概述SQL被認(rèn)為是數(shù)據(jù)庫(kù)界的奇跡,幾乎所有著名的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),如Oracle、Sybase、Informix、Ingres、DB2、SQL server都先后實(shí)現(xiàn)了對(duì)SQL語(yǔ)言的支持。1986年,美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì)(ANSI)發(fā)布了第一個(gè)SQL標(biāo)準(zhǔn),即SQL86,并于1987年獲得國(guó)際標(biāo)準(zhǔn)化組織(ISO)的一致通過(guò)。SQL86主要包括模式定義、數(shù)據(jù)操作、嵌入式SQL等內(nèi)容。1989年,ISO組織在模式定義中增補(bǔ)了完整性描述并修訂了一些其他內(nèi)容,并頒布了SQL89標(biāo)準(zhǔn)。

4、1992年ISO組織對(duì)SQL89又進(jìn)行了擴(kuò)充和修改,公布了SQL92標(biāo)準(zhǔn),人們習(xí)慣稱(chēng)為SQL2標(biāo)準(zhǔn)。SQL2標(biāo)準(zhǔn)分為初級(jí)SQL2、中級(jí)SQL2和完全SQL2三個(gè)級(jí)別。初級(jí)SQL2在SQL89的基礎(chǔ)上增加了某些功能;中級(jí)SQL2是在初級(jí)SQL2的基礎(chǔ)上擴(kuò)充了數(shù)據(jù)的類(lèi)型、操作的種類(lèi)和完整性方面的內(nèi)容;完全SQL2進(jìn)一步擴(kuò)充了中級(jí)SQL2,放寬了對(duì)某些操作的限制,并增加了“BIT”的數(shù)據(jù)類(lèi)型。此外,SQL2還提供對(duì)網(wǎng)絡(luò)環(huán)境和互聯(lián)網(wǎng)的支持,以實(shí)現(xiàn)對(duì)遠(yuǎn)程數(shù)據(jù)庫(kù)的訪問(wèn)。 機(jī)械工業(yè)出版社33.1 SQL語(yǔ)言概述1995年美國(guó)國(guó)家標(biāo)準(zhǔn)局在SQL2的基礎(chǔ)上進(jìn)一步擴(kuò)充了面向?qū)ο蟮墓δ埽⒐剂薙QL3標(biāo)準(zhǔn)。SQL

5、3支持用戶自定義數(shù)據(jù)類(lèi)型,提供了遞歸操作、臨時(shí)視圖、嵌套查詢、異步DML等新功能。SQL3是目前的最新標(biāo)準(zhǔn),但由于各種歷史原因,仍有一些數(shù)據(jù)庫(kù)僅支持到SQL2。自SQL成為國(guó)際標(biāo)準(zhǔn)語(yǔ)言以后,各個(gè)數(shù)據(jù)庫(kù)廠家紛紛推出各自的SQL軟件或與SQL的接口軟件。這就使大多數(shù)數(shù)據(jù)庫(kù)均用SQL作為共同的數(shù)據(jù)存取語(yǔ)言和標(biāo)準(zhǔn)接口,使不同數(shù)據(jù)庫(kù)系統(tǒng)之間的互操作有了共同的基礎(chǔ)。SQL成為國(guó)際標(biāo)準(zhǔn),對(duì)數(shù)據(jù)庫(kù)以外的領(lǐng)域也產(chǎn)生了巨大影響,很多軟件產(chǎn)品將SQL語(yǔ)言的數(shù)據(jù)查詢功能與圖形功能、軟件工程工具、軟件開(kāi)發(fā)工具、人工智能程序結(jié)合起來(lái)。SQL已成為數(shù)據(jù)庫(kù)領(lǐng)域中一個(gè)主流語(yǔ)言,被廣泛應(yīng)用在各種系統(tǒng)中。 機(jī)械工業(yè)出版社43.1

6、SQL語(yǔ)言概述3.1.2 SQL語(yǔ)言的基本概念 SQL語(yǔ)言支持關(guān)系數(shù)據(jù)庫(kù)的三級(jí)模式結(jié)構(gòu)體系,如圖3-1所示。在SQL中,外模式對(duì)應(yīng)于視圖(View)或部分基本表(Base Table),模式對(duì)應(yīng)于基本表,內(nèi)模式對(duì)應(yīng)于存儲(chǔ)文件(Stored File)。 圖3-1 SQL數(shù)據(jù)庫(kù)的體系結(jié)構(gòu)機(jī)械工業(yè)出版社53.1 SQL語(yǔ)言概述SQL數(shù)據(jù)庫(kù)的體系結(jié)構(gòu)要點(diǎn)如下:(1)一個(gè)SQL模式(Schema)是已命名的數(shù)據(jù)組,由表、授權(quán)、規(guī)則、約束等組成。(2)一個(gè)SQL表由行(Row)組成,行由列(Column)組成,每一列對(duì)應(yīng)一個(gè)數(shù)據(jù)項(xiàng)。(3)SQL表有三種類(lèi)型:基本表、視圖和導(dǎo)出表?;颈硎菍?shí)際存儲(chǔ)在數(shù)據(jù)庫(kù)

7、中的表,視圖是由若干個(gè)基本表或其他視圖構(gòu)成的表的定義,是虛擬表,而導(dǎo)出表是執(zhí)行查詢后產(chǎn)生的表。(4)一個(gè)基本表可以跨一個(gè)或多個(gè)存儲(chǔ)文件,一個(gè)存儲(chǔ)文件也可以存放一個(gè)或多個(gè)基本表。每個(gè)存儲(chǔ)文件與外部存儲(chǔ)上的一個(gè)物理文件相對(duì)應(yīng)。 機(jī)械工業(yè)出版社63.1 SQL語(yǔ)言概述(5)用戶可以使用SQL語(yǔ)句對(duì)基本表和視圖進(jìn)行查詢等操作。對(duì)用戶來(lái)說(shuō),基本表和視圖是一樣的,都是表。(6)SQL用戶可以是終端用戶,也可以是應(yīng)用程序。也就是說(shuō),SQL語(yǔ)言既可以作為獨(dú)立的交互型語(yǔ)言,供交互環(huán)境下的終端用戶使用;也可以作為嵌入式語(yǔ)言嵌入宿主語(yǔ)言的程序中使用,宿主語(yǔ)言可以是Visual Basic(VB)、C語(yǔ)言、COBOL

8、、 FORTRAN、PL/1等程序設(shè)計(jì)語(yǔ)言。(7)存儲(chǔ)文件的邏輯結(jié)構(gòu)組成了關(guān)系數(shù)據(jù)庫(kù)的內(nèi)模式。存儲(chǔ)文件的物理結(jié)構(gòu)是任意的,對(duì)用戶是透明的。 機(jī)械工業(yè)出版社73.1 SQL語(yǔ)言概述3.1.3 SQL語(yǔ)言的主要特點(diǎn) SQL語(yǔ)言是介于關(guān)系數(shù)據(jù)庫(kù)與關(guān)系演算之間的一種結(jié)構(gòu)化查詢語(yǔ)言。雖然SQL是一種查詢語(yǔ)言,但實(shí)際上它的功能并非查詢信息那么簡(jiǎn)單,主要功能包括數(shù)據(jù)查詢(Data Query)、數(shù)據(jù)操縱(Data Manipulation)、數(shù)據(jù)定義(Data Definition)和數(shù)據(jù)控制(Data Control),是一種通用的、功能強(qiáng)大而又簡(jiǎn)單易學(xué)的關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言,其主要特點(diǎn)包括以下幾個(gè)方面。 機(jī)械

9、工業(yè)出版社83.1 SQL語(yǔ)言概述1綜合統(tǒng)一 數(shù)據(jù)庫(kù)系統(tǒng)的主要功能是通過(guò)數(shù)據(jù)庫(kù)支持的數(shù)據(jù)語(yǔ)言來(lái)實(shí)現(xiàn)。層次模型、網(wǎng)狀模型等非關(guān)系模式數(shù)據(jù)庫(kù)語(yǔ)言大多分為模式數(shù)據(jù)定義語(yǔ)言(模式DDL,Schema Data Definition Language)、外模式數(shù)據(jù)定義語(yǔ)言(外模式DDL或子模式DDL,Subschema Data Definition Language)、與數(shù)據(jù)存儲(chǔ)有關(guān)的描述語(yǔ)言(DSDL,Data Storage Description Language)及數(shù)據(jù)操縱語(yǔ)言(DML,Data Manipulation Language),分別用于定義模式、外模式、內(nèi)模式和進(jìn)行數(shù)據(jù)的存取與處

10、置。不足之處是:當(dāng)用戶數(shù)據(jù)庫(kù)投入運(yùn)行之后,如果需要修改模式,必須停止現(xiàn)有數(shù)據(jù)庫(kù)的運(yùn)行,轉(zhuǎn)儲(chǔ)數(shù)據(jù),修改模式并編譯后再重裝數(shù)據(jù)庫(kù),非常麻煩。SQL語(yǔ)言集數(shù)據(jù)定義語(yǔ)言DDL、數(shù)據(jù)操縱語(yǔ)言DML、數(shù)據(jù)控制語(yǔ)言DCL的功能于一體,語(yǔ)言風(fēng)格統(tǒng)一,可以獨(dú)立完成數(shù)據(jù)庫(kù)生命周期中的全部活動(dòng),包括定義關(guān)系模式、建立數(shù)據(jù)庫(kù)、插入數(shù)據(jù)、查詢、更新、維護(hù)、數(shù)據(jù)庫(kù)重構(gòu)、數(shù)據(jù)庫(kù)安全控制等一系列操作要求,為數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)提供了良好的開(kāi)發(fā)環(huán)境。更重要的是,用戶數(shù)據(jù)庫(kù)在投入運(yùn)行后,在不影響數(shù)據(jù)庫(kù)運(yùn)行的情況下,可根據(jù)需要隨時(shí)修改模式,從而使系統(tǒng)具有良好的可擴(kuò)展性。機(jī)械工業(yè)出版社93.1 SQL語(yǔ)言概述2高度非過(guò)程化 非關(guān)系數(shù)據(jù)模型

11、的數(shù)據(jù)操縱語(yǔ)言是面向過(guò)程的語(yǔ)言,如果要完成某項(xiàng)請(qǐng)求,必須指出存取路徑。而SQL語(yǔ)言是高度非過(guò)程化語(yǔ)言,當(dāng)進(jìn)行數(shù)據(jù)操作時(shí),只需要指出“做什么”,無(wú)須指明“怎么做”,存儲(chǔ)路徑對(duì)用戶來(lái)說(shuō)是透明的,而不需要指出存儲(chǔ)路徑,存儲(chǔ)路徑的選擇和SQL語(yǔ)句的操作過(guò)程全部是由系統(tǒng)自動(dòng)完成的,從而大大減輕了用戶的負(fù)擔(dān),同時(shí)有利于提高數(shù)據(jù)的獨(dú)立性。機(jī)械工業(yè)出版社103.1 SQL語(yǔ)言概述3面向集合的操作方 法 非關(guān)系數(shù)據(jù)模型采用面向記錄的操作方式,操作對(duì)象是一條記錄。例如查詢工資在2000元以上的員工姓名,用戶必須要編寫(xiě)一段處理程序,指明具體處理過(guò)程,包括按照哪條存儲(chǔ)路徑、如何循環(huán)等,才能一條一條地把滿足要求的員工記

12、錄查找出來(lái)。而SQL語(yǔ)言采用面向集合的操作方式,不僅操作對(duì)象、查找結(jié)果可以是元組的集合,而且一次插入、刪除、更新操作的對(duì)象也可以是元組的集合。機(jī)械工業(yè)出版社113.1 SQL語(yǔ)言概述4以同一種語(yǔ)言結(jié)構(gòu)提供兩種使用方式 SQL語(yǔ)言提供兩種工作方式:一種是交互式命令方式,另一種是嵌入式程序方式。第一種方式是用戶可以在終端鍵盤(pán)上輸入SQL命令,對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,能夠獨(dú)立地用于聯(lián)機(jī)交互的使用方式,所以稱(chēng)為自含式語(yǔ)言;第二種方式是將SQL語(yǔ)句嵌入到高級(jí)程序設(shè)計(jì)語(yǔ)言(如C語(yǔ)言、C+語(yǔ)言、COBOL、 FORTRAN、PowerBuilder、PL/1)程序中,供程序員設(shè)計(jì)程序時(shí)使用,因此又稱(chēng)為嵌入式語(yǔ)言。

13、而在以上兩種不同的使用方式下,SQL語(yǔ)言的語(yǔ)法結(jié)構(gòu)基本上是一致的。這種以統(tǒng)一的語(yǔ)法結(jié)構(gòu)提供兩種不同的使用方式的做法,提供了極大的靈活性和方便性。機(jī)械工業(yè)出版社123.1 SQL語(yǔ)言概述5語(yǔ)言簡(jiǎn)潔,易學(xué)易用 SQL語(yǔ)言不僅功能強(qiáng)大,而且十分簡(jiǎn)潔,完成核心功能只用了9個(gè)動(dòng)詞,如表3-1所示。SQL語(yǔ)言接近英語(yǔ)口語(yǔ),因此容易學(xué)習(xí),方便使用。 表3-1 SQL語(yǔ)言功能表SQL功能 動(dòng) 詞 數(shù)據(jù)查詢SELECT數(shù)據(jù)定義CREATE,DROP,ALTER數(shù)據(jù)操縱INSERT,UPDATE,DELETE數(shù)據(jù)控制GRANT,REVOKE機(jī)械工業(yè)出版社133.2 SQL數(shù)據(jù)定義 關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)支持三級(jí)模式結(jié)構(gòu),

14、其模式、外模式和內(nèi)模式中的基本對(duì)象有表、視圖和索引。因此SQL的數(shù)據(jù)定義功能包括定義表、定義視圖和定義索引,具體命令如表3-2所示。 機(jī)械工業(yè)出版社143.2 SQL數(shù)據(jù)定義表3-2 SQL的數(shù)據(jù)定義語(yǔ)句 操作對(duì)象 操 作 方 式 創(chuàng) 建刪 除修 改表CREATETABLEDROPTABLEALTERTABLE視圖CREATE VIEWDROP VIEW索引CREATE INDEX DROP INDEX 機(jī)械工業(yè)出版社153.2 SQL數(shù)據(jù)定義 在數(shù)據(jù)庫(kù)中獨(dú)立存在的表稱(chēng)為基本表,一個(gè)基本表對(duì)應(yīng)一個(gè)基本關(guān)系,它是由CREATE TABLE命令來(lái)創(chuàng)建的?;颈淼亩x是指建立基本的關(guān)系模式,基本表的

15、變更是指對(duì)數(shù)據(jù)庫(kù)中已存在的基本表進(jìn)行修改或刪除。數(shù)據(jù)庫(kù)通常是包含多個(gè)基本表的一個(gè)數(shù)據(jù)集。 機(jī)械工業(yè)出版社163.2 SQL數(shù)據(jù)定義 一個(gè)基本表可以建立若干索引,它們都依附于基本表且存放在存儲(chǔ)文件中。索引屬于物理存儲(chǔ)概念,而不是邏輯概念。有些關(guān)系型數(shù)據(jù)庫(kù)同時(shí)包括索引機(jī)制和主鍵機(jī)制,相比而言,主鍵機(jī)制占用系統(tǒng)資源較少,并且效率較高。 機(jī)械工業(yè)出版社173.2 SQL數(shù)據(jù)定義 視圖對(duì)應(yīng)于外模式,它是從現(xiàn)有的一個(gè)或幾個(gè)基本表中抽取若干子集組成的“虛表”。 視圖可以通過(guò)SQL中的CREATE VIEW命令來(lái)來(lái)創(chuàng)建,創(chuàng)建視圖只是把視圖的定義存放在系統(tǒng)中,而不是直接存儲(chǔ)視圖相應(yīng)的數(shù)據(jù),這些數(shù)據(jù)仍然存放在導(dǎo)出

16、視圖的基本表中。只有當(dāng)用戶使用該視圖時(shí),才從相應(yīng)的表中獲取數(shù)據(jù)。SQL在查詢視圖時(shí)與基本表完全相同,并且用戶可以在視圖上再定義視圖,但用視圖對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行增加、刪除、修改等更新操作時(shí)有一定的限制。本節(jié)將介紹如何定義基本表和索引,視圖的定義方法將在3.5節(jié)介紹。機(jī)械工業(yè)出版社183.2 SQL數(shù)據(jù)定義3.2.1 基本數(shù)據(jù)類(lèi)型 不同的數(shù)據(jù)庫(kù)系統(tǒng)支持的數(shù)據(jù)類(lèi)型不完全相同。SQL提供的主要數(shù)據(jù)類(lèi)型(也稱(chēng)為“域類(lèi)型”)有以下幾種:(1)數(shù)值型 INTEGER 全字長(zhǎng)二進(jìn)制整數(shù)(也可寫(xiě)成INT) SMALLINT 半字長(zhǎng)二進(jìn)制整數(shù) REAL 取決于機(jī)器精度的浮點(diǎn)數(shù) DOUBLE PRECISION

17、取決于機(jī)器精度的雙精度浮點(diǎn)數(shù) FLOAT(n) 浮點(diǎn)數(shù),精度至少為n位數(shù)字 NUMERIC(p,d) 定點(diǎn)數(shù),由p位數(shù)字(不包括符號(hào)、 小數(shù)點(diǎn))組 成,小數(shù)點(diǎn)后面有d位數(shù)字 (也可以寫(xiě)成 DECIMAL(p,d)DEC(p,d)機(jī)械工業(yè)出版社193.2 SQL數(shù)據(jù)定義(2)字符串型 CHAR(n) 長(zhǎng)度為n的定長(zhǎng)字符串 VARCHAR(n) 具有最大長(zhǎng)度為n的變長(zhǎng)字符串 GRAPHIC(n) 長(zhǎng)度為n的定長(zhǎng)圖形字符串 VARGRAPHIC(n) 具有最大長(zhǎng)度為n的定長(zhǎng)圖形字符串(3)位串型 BIT(n) 長(zhǎng)度為n的二進(jìn)制位串 BIT VARYING(n) 最大長(zhǎng)度為n的變長(zhǎng)二進(jìn)制位串(4)時(shí)間

18、型 DATE 日期型,格式為YYYY-MM-DD TIME 時(shí)間型,格式為HH:MM:SS TIMESTAMP 日期加時(shí)間機(jī)械工業(yè)出版社203.2 SQL數(shù)據(jù)定義3.2.2 創(chuàng)建、修改和刪除基本表 如果在系統(tǒng)中創(chuàng)建了一個(gè)數(shù)據(jù)庫(kù),那么就可以在數(shù)據(jù)庫(kù)中定義基本表。對(duì)基本表的操作包括創(chuàng)建、修改和刪除。1基本表的創(chuàng)建 建立數(shù)據(jù)庫(kù)最基本、最重要的一步就是創(chuàng)建基本表,也就是定義基本表的結(jié)構(gòu)。SQL語(yǔ)言使用CREATE TABLE語(yǔ)句創(chuàng)建基本表,其一般格式為:CREATE TABLE ( 列級(jí)完整性約束條件 , 列級(jí)完整性約束條件 ,); 其中,是所要定義的基本表的名字,基本表可以由一個(gè)或多個(gè)屬性(列)組成

19、,每個(gè)列的類(lèi)型可以是基本數(shù)據(jù)類(lèi)型,也可以是用戶預(yù)先定義的域名。機(jī)械工業(yè)出版社213.2 SQL數(shù)據(jù)定義 建立基本表的同時(shí)通常還可以定義與該表有關(guān)的完整性約束條件,這些完整性約束條件被存儲(chǔ)在系統(tǒng)的數(shù)據(jù)字典中,當(dāng)用戶操作表中數(shù)據(jù)時(shí),由DBMS自動(dòng)檢查該操作是否違背這些完整性約束條件。如果完整性約束條件涉及該表的多個(gè)屬性列,則必須定義在表級(jí)上,否則既可以定義在列級(jí)上,也可以定義在表級(jí)上。 機(jī)械工業(yè)出版社223.2 SQL數(shù)據(jù)定義 例3.1 設(shè)教學(xué)管理數(shù)據(jù)庫(kù)S-C中有三個(gè)基本表:學(xué)生表STUDENT、學(xué)生選課表SC和課程表COURSE。其中學(xué)生表由學(xué)號(hào)SNO、姓名SNAME、性別SSEX、年齡SAGE

20、、所在系SDEPT五個(gè)屬性組成;學(xué)生選課表由學(xué)號(hào)SNO、課程號(hào)CNO、成績(jī)GRADE三個(gè)屬性組成;課程表由課程號(hào)CNO、課程名CNAME、先修課程號(hào)CPNO、學(xué)分CREDITS 四個(gè)屬性組成。 STUDENT (SNO, SNAME, SSEX, SAGE, SDEPT) SC (SNO, CNO, GRADE) COURSE (CNO, CNAME, CPNO, CREDITS)機(jī)械工業(yè)出版社233.2 SQL數(shù)據(jù)定義基本表STUDENT可用下列命令創(chuàng)建: CREATE TABLE STUDENT (SNO CHAR(5) NOT NULL UNIQUE, /*列級(jí)完整性約 束條件, SNO

21、、SNAME不能為空值,取值唯一*/ SNAME CHAR(8) NOT NULL UNIQUE, SSEX CHAR(2), SAGE INT, SDEPT CHAR(20), PRIMARY KEY(SNO); 機(jī)械工業(yè)出版社243.2 SQL數(shù)據(jù)定義 系統(tǒng)執(zhí)行上面的CREATE TABLE命令后,就在數(shù)據(jù)庫(kù)中建立一個(gè)新的空表STUDENT,并將有關(guān)表的定義以及有關(guān)約束條件存放在數(shù)據(jù)字典中。定義表的各個(gè)屬性時(shí)需要指明其數(shù)據(jù)類(lèi)型及長(zhǎng)度。 SQL中允許列值是空值,但當(dāng)要求某一列的值不允許為空值時(shí),就應(yīng)在定義該列時(shí)寫(xiě)上關(guān)鍵字“NOT NULL”,例如這里的學(xué)號(hào)SNO、學(xué)生姓名SNAME后都有“N

22、OT NULL”字樣。PRIMARY KEY(SNO)表示定義主碼為SNO。 機(jī)械工業(yè)出版社253.2 SQL數(shù)據(jù)定義對(duì)于基本表SC、COURSE可以用下列語(yǔ)句創(chuàng)建:CREATE TABLE SC (SNO CHAR(5), CNO CHAR(4), GRADE INT, PRIMARY KEY(SNO,CNO), FOREIGN KEY(SNO) REFERENCES STUDENT(SNO), FOREIGN KEY(CNO) REFERENCES COURSE(CNO), CHECK (GRADE BETWEEN 0 AND 100);CREATE TABLE COURSE (CNO C

23、HAR(4) NOT NULL, CNAME CHAR(10) NOT NULL, CPNO CHAR(4), CREDITS INT, PRIMARY KEY(CNO); 機(jī)械工業(yè)出版社263.2 SQL數(shù)據(jù)定義 在基本表SC的定義中說(shuō)明有三個(gè)屬性列,主鍵是(SNO,CNO)。還定義了兩個(gè)外碼,并指出外碼SNO和基本表STUDENT中的SNO相對(duì)應(yīng),外碼CNO和基本表COURSE中的CNO相對(duì)應(yīng)。在本例中對(duì)應(yīng)的屬性列名稱(chēng)恰好同名,實(shí)際上也可以不同名,只要指出其對(duì)應(yīng)性即可。外碼體現(xiàn)了關(guān)系數(shù)據(jù)庫(kù)的參照完整性。定義中還使用了一個(gè)檢查子句,指出成績(jī)GRADE的值應(yīng)在0100之間。 在基本表COURS

24、E的定義中也說(shuō)明有三個(gè)屬性列,主碼是CNO,同時(shí)屬性CNO和CNAME不允許為空值。 機(jī)械工業(yè)出版社273.2 SQL數(shù)據(jù)定義 2基本表的修改 在基本表建立后,可根據(jù)實(shí)際需要對(duì)基本表的結(jié)構(gòu)進(jìn)行修改,可以增加新的屬性列和新的完整性約束條件、刪除指定列的完整性約束條件,還可以修改數(shù)據(jù)類(lèi)型、寬度等。SQL語(yǔ)言用ALTER TABLE語(yǔ)句修改基本表,其一般格式為: ALTER TABLE ADD 完整性約束 DORP MODIFY ; 其中指出要修改的基本表;ADD子句用于增加新列和新的完整性約束條件;DORP子句用于刪除指定的完整性約束條件;MODFIY子句用于修改原有的列定義,包括修改列名和數(shù)據(jù)類(lèi)

25、型。 機(jī)械工業(yè)出版社283.2 SQL數(shù)據(jù)定義 (1)增加列 例3.2 在基本表STUDENT中增加一個(gè)地址列ADDRESS, 可用下列語(yǔ)句實(shí)現(xiàn): ALTER TABLE STUDENT ADD ADDRESS CHAR(30) 應(yīng)該注意的是,不論基本表中原來(lái)是否已有數(shù)據(jù),新增加 的列不能定義為“NOT NULL”,基本表在增加一個(gè)屬性列后,原有元組在新增加的列上的值都被定義為空值NULL。 機(jī)械工業(yè)出版社293.2 SQL數(shù)據(jù)定義 (2)補(bǔ)充定義主碼 由于SQL并不要求每個(gè)基本表在建立時(shí)都定義主碼,因此提供了一個(gè)補(bǔ)充定義主碼的命令,在需要時(shí)定義主碼。被定義為主碼的列名表必須滿足NOT NUL

26、L和唯一性條件。ALTER TABLE ADD PRIMARY KEY(); 機(jī)械工業(yè)出版社303.2 SQL數(shù)據(jù)定義 (3)撤銷(xiāo)主碼定義 如果定義了主碼,系統(tǒng)一般在主碼上自動(dòng)建立索引,并在插入新的元組時(shí),進(jìn)行主碼唯一性檢驗(yàn)。這在插入大量數(shù)據(jù)時(shí),會(huì)嚴(yán)重影響系統(tǒng)的性能。利用下面的命令,可以暫時(shí)撤銷(xiāo)主碼定義。 ALTER TABLE DORP PRIMARY KEY; 機(jī)械工業(yè)出版社313.2 SQL數(shù)據(jù)定義 (4)補(bǔ)充定義外碼 ALTER TABLE ADD FOREIGN KEY )() REFERENCES ON DELETERESTRICT|CASCADE|SET NULL; 上述命令中,

27、花括號(hào)表示任選三項(xiàng)中的一項(xiàng),RESTRICT為默認(rèn)值。 機(jī)械工業(yè)出版社323.2 SQL數(shù)據(jù)定義 (5)撤銷(xiāo)外碼定義 定義了外碼,必須引用完整性檢驗(yàn),這在有些情況下會(huì)影響系統(tǒng)的性能。為此,SQL提供了撤銷(xiāo)外碼的命令,在必要時(shí)暫時(shí)撤銷(xiāo)外碼。 ALTER TABLE DORP ;(6)修改屬性的數(shù)據(jù)類(lèi)型及約束條件 機(jī)械工業(yè)出版社333.2 SQL數(shù)據(jù)定義例3.3 將表STUDENT中年齡的數(shù)據(jù)類(lèi)型改為半字長(zhǎng)整數(shù)(SMALLINT)。 ALTER TABLE STUDENT MODIFY SAGE SMALLINT; 修改原有的屬性列定義有可能會(huì)破壞已有的數(shù)據(jù)。例3.4 刪除表STUDENT中學(xué)生姓

28、名必須取唯一值的約束。 ALTER TABLE STUDENT DORP UNIQUE(SNAME); 標(biāo)準(zhǔn)SQL沒(méi)有提供刪除屬性列的語(yǔ)句,用戶只能間接實(shí)現(xiàn)這一功能,可以先把表中要保留的屬性列及其內(nèi)容復(fù)制到一個(gè)新表中,然后刪除原表,再建新表重新命名為原表名。 機(jī)械工業(yè)出版社343.2 SQL數(shù)據(jù)定義3基本表的刪除 當(dāng)某個(gè)基本表不再需要時(shí),用戶可以使用DORP TABLE命令刪除它。其一般格式為:DORP TABLE ; 基本表一旦刪除,表中的數(shù)據(jù)以及此表上建立的索引和視圖都將自動(dòng)被刪除掉。因此執(zhí)行刪除基本表的操作一定要格外謹(jǐn)慎。例3.5 刪除STUDENT表。 DORP TABLE STUDE

29、NT;機(jī)械工業(yè)出版社353.2 SQL數(shù)據(jù)定義3.2.3 創(chuàng)建和維護(hù)索引 索引屬于物理存儲(chǔ)的路徑概念,而不是邏輯的概念。在定義基本表時(shí)定義索引,就會(huì)把數(shù)據(jù)庫(kù)的物理結(jié)構(gòu)和邏輯結(jié)構(gòu)混在一起。建立索引是加快查詢速度的有效手段。用戶可以根據(jù)應(yīng)用環(huán)境的需要,在基本表上建立一個(gè)或多個(gè)索引,以提供多種存取路徑,加快查找速度。一般來(lái)說(shuō),建立與刪除索引由數(shù)據(jù)庫(kù)管理員DBA或表的屬主(即建立該表的人)負(fù)責(zé)完成。系統(tǒng)在存取數(shù)據(jù)時(shí)會(huì)自動(dòng)選擇合適的索引作為存取路徑,用戶不必也不能選擇索引。 機(jī)械工業(yè)出版社363.2 SQL數(shù)據(jù)定義1索引的建立 在SQL語(yǔ)言中,建立索引使用CREATE INDEX語(yǔ)句,其一般格式為: C

30、REATE UNIQUECLUSTER INDEX ON (,); 機(jī)械工業(yè)出版社373.2 SQL數(shù)據(jù)定義 其中,表名是要建立索引的基本表的名字。索引可以建立在該表的一列或多列上,各列名之間用逗號(hào)分隔。每個(gè)列名后面還可以用次序指定索引值的排列次序,可選ASC(升序)或DESC(降序),默認(rèn)值為ASC。 UNIQUE表明此索引的每一個(gè)索引值只對(duì)應(yīng)唯一的數(shù)據(jù)記錄。 CLUSTER表示要建立的索引是聚簇索引。所謂聚簇索引是指索引項(xiàng)的順序與表中記錄的物理順序一致的索引組織。機(jī)械工業(yè)出版社383.2 SQL數(shù)據(jù)定義 例3.6 在基本表STUDENT中的SNAME(姓名)列 上建立一個(gè)聚簇索引,并且ST

31、UDENT表中的記錄將按照SNAME值的降序存放。 CREATE CLUSTER INDEX STU-SNAME ON STUDENT (SNAME DESC); 用戶可以在最常查詢的列上建立聚簇索引以提高查詢效率。值得注意的是,每個(gè)基本表上最多只能建立一個(gè)聚簇索引。建立聚簇索引后,更新索引列上的數(shù)據(jù)時(shí),往往導(dǎo)致基本表中元組的物理順序的變更,時(shí)間開(kāi)銷(xiāo)較大,因此對(duì)于經(jīng)常更新的列不易建立聚簇索引。機(jī)械工業(yè)出版社393.2 SQL數(shù)據(jù)定義 例3.7 為教學(xué)管理數(shù)據(jù)庫(kù)中的STUDENT、SC、COURSE三個(gè)表建立索引。其中STUDENT表按學(xué)號(hào)(SNO)升序建立唯一索引,SC表按學(xué)號(hào)(SNO)升序和

32、成績(jī)(GRADE)降序建立唯一索引,COURSE表按課程號(hào)(CNO)升序建立唯一索引。 CREATE UNIQUE INDEX STU-SNO ON STUDENT (SNO ASC); CREATE UNIQUE INDEX SC-SNO ON SC (SNO ASC, GRADE DESC); CREATE UNIQUE INDEX C-CNO ON COURSE (CNO ASC);機(jī)械工業(yè)出版社403.2 SQL數(shù)據(jù)定義2索引的刪除 索引建立以后,就由系統(tǒng)使用和維護(hù)它,不需用戶干預(yù)。建立索引是為了減少查詢操作的時(shí)間。但如果數(shù)據(jù)增加和修改頻繁,系統(tǒng)會(huì)花費(fèi)許多時(shí)間來(lái)維護(hù)索引。這時(shí)可以刪除不

33、必要的索引。 在SQL語(yǔ)言中,刪除索引使用DORP INDEX語(yǔ)句,其一般格式為:DORP INDEX ;機(jī)械工業(yè)出版社413.2 SQL數(shù)據(jù)定義 例3.8 刪除基本表STUDENT中的STU-SNAME索引。DORP INDEX ; 刪除索引時(shí),系統(tǒng)會(huì)同時(shí)從數(shù)據(jù)字典中刪去有關(guān)該索引的描述。機(jī)械工業(yè)出版社423.3 SQL數(shù)據(jù)查詢3.3.1 SELECT查詢命令 數(shù)據(jù)查詢是數(shù)據(jù)庫(kù)的核心操作。SQL提供了SELECT語(yǔ)句進(jìn)行數(shù)據(jù)庫(kù)的查詢,該語(yǔ)句具有靈活的使用方式和豐富的功能。其一般格式為: SELECT ALL|DISTINCT , FROM , WHERE GROUP BY HAVING OR

34、DER BY ASC|DESC;機(jī)械工業(yè)出版社433.3 SQL數(shù)據(jù)查詢 整個(gè)SELECT語(yǔ)句的含義是:根據(jù)WHERE子句給出的條件表達(dá)式,從FROM子句指定的基本表或視圖中找出滿足條件的元組,再按照SELECT子句中的目標(biāo)列表達(dá)式,選出元組中的屬性值形成結(jié)果表。如果有GROUP子句,則將結(jié)果按的值進(jìn)行分組,該屬性列值相等的元組為一個(gè)組。如果GROUP子句帶有HAVING短語(yǔ),則只輸出滿足指定條件的組。如果有ORDER子句,則結(jié)果表還要按的值的升序或降序排序。機(jī)械工業(yè)出版社443.3 SQL數(shù)據(jù)查詢 SELECT語(yǔ)句既可以完成簡(jiǎn)單的單表查詢,也可以完成復(fù)雜的連接查詢和嵌套查詢,SELECT語(yǔ)句

35、能表達(dá)所有的關(guān)系代數(shù)表達(dá)式。下面以教學(xué)管理數(shù)據(jù)庫(kù)S-C為例說(shuō)明SELECT語(yǔ)句的各種用法。 教學(xué)管理數(shù)據(jù)庫(kù)中包含三個(gè)基本表:學(xué)生表:STUDENT(SNO,SNAME,SSEX,SAGE,SDEPT) STUDENT由學(xué)號(hào)(SNO)、姓名(SNAME)、性 別(SSEX)、年齡(SAGE)、所在系(SDEPT) 五個(gè)屬性組成,其中SNO為主碼。機(jī)械工業(yè)出版社453.3 SQL數(shù)據(jù)查詢課程表: CORUSE(CNO,CNAME,CPNO,CREDITS) CORUSE有課程號(hào)(CNO)、課程名 (CNAME)、選修課號(hào)(CPNO)、學(xué)分 (CREDITS)四個(gè)屬性組成,其中CNO為主碼。學(xué)生選課

36、表:SC(SNO,CNO,GRADE) SC由學(xué)號(hào)(SNO)、課程號(hào)(CNO)、成績(jī) (GRADE)三個(gè)屬性組成,其中主碼為 (SNO,CNO)。機(jī)械工業(yè)出版社463.3 SQL數(shù)據(jù)查詢SNOSNAMESSEXSAGESDEPTS8201王晨男21計(jì)算機(jī)系S8202李俊女20計(jì)算機(jī)系S8203劉利敏女19計(jì)算機(jī)系S8204張海男20計(jì)算機(jī)系S8801吳浩男18數(shù)學(xué)系S8802程小磊男20數(shù)學(xué)系S8803張建超男19數(shù)學(xué)系S9101李云鵬男18自動(dòng)化系S9102劉一鳴女20自動(dòng)化系表3-3 基本STUDENT機(jī)械工業(yè)出版社473.3 SQL數(shù)據(jù)查詢CNOCCNAMECPNOCREDITS1高等數(shù)

37、學(xué) 22英語(yǔ)43C語(yǔ)言44數(shù)據(jù)結(jié)構(gòu)345操作系統(tǒng)446離散數(shù)學(xué)137數(shù)據(jù)庫(kù)438網(wǎng)絡(luò)原理53表3-4 基本表COURSE機(jī)械工業(yè)出版社483.3 SQL數(shù)據(jù)查詢SNOCNOGRADES8201195S8201385S8202188S8202274S8202383S8203194S8203291S82044 75S8204590S8801486表3-5 基本表SC機(jī)械工業(yè)出版社493.3 SQL數(shù)據(jù)查詢3.3.2 簡(jiǎn)單查詢 簡(jiǎn)單查詢是指數(shù)據(jù)源只涉及一個(gè)基本表或一個(gè)視圖的查詢。1選擇表中的若干列 選擇表中的若干列,既可以是選擇表中的全部列,也可以是選擇表中的部分列。選擇表中的全部列或部分列,這就是

38、投影運(yùn)算。 (1) 查詢指定列 在多數(shù)情況下,用戶只對(duì)表中的一部分屬性列感興趣,這時(shí)可通過(guò)在SELECT子句的目標(biāo)列表達(dá)式中指定要查詢的屬性列。機(jī)械工業(yè)出版社503.3 SQL數(shù)據(jù)查詢 例3.9 查詢?nèi)w學(xué)生的學(xué)號(hào)、姓名和所在系。SELECT SNO, SNAME, SEPTFROM STUDENT; 查詢結(jié)果如表3-6所示。機(jī)械工業(yè)出版社513.3 SQL數(shù)據(jù)查詢SNOSNAMESDEPTS8201王晨計(jì)算機(jī)系S8202李俊計(jì)算機(jī)系S8203劉利敏計(jì)算機(jī)系S8204張海計(jì)算機(jī)系S8801吳浩數(shù)學(xué)系S8802程小磊數(shù)學(xué)系S8803張建超數(shù)學(xué)系S9101李云鵬自動(dòng)化系S9102劉一鳴自動(dòng)化系表3

39、-6 查詢學(xué)號(hào)、姓名和所在系結(jié)果機(jī)械工業(yè)出版社523.3 SQL數(shù)據(jù)查詢例3.10 查詢?nèi)w學(xué)生的姓名、學(xué)號(hào)、性別和所在系。SELECT SNAME, SNO, SSEX, SEPTFROM STUDENT;查詢結(jié)果如表3-7所示。 機(jī)械工業(yè)出版社533.3 SQL數(shù)據(jù)查詢SNOSNAMESSEXSDEPTS8201王晨男計(jì)算機(jī)系S8202李俊女計(jì)算機(jī)系S8203劉利敏女計(jì)算機(jī)系S8204張海男計(jì)算機(jī)系S8801吳浩男數(shù)學(xué)系S8802程小磊男數(shù)學(xué)系S8803張建超男數(shù)學(xué)系S9101李云鵬男自動(dòng)化系S9102劉一鳴女自動(dòng)化系表3-7查詢學(xué)號(hào)、姓名、性別和所在系結(jié)果目標(biāo)列表達(dá)式中各個(gè)列的先后順序可

40、以與表中的順序不一致,用戶可以根據(jù)應(yīng)用的需要改變列的顯示順序。機(jī)械工業(yè)出版社543.3 SQL數(shù)據(jù)查詢(2) 查詢?nèi)苛?如果要查詢表中的所有屬性列,可以使用兩種方法:一種方法是在目標(biāo)列表達(dá)式中列出所有的列名;另一種方法是如果列的顯示順序與基本表中定義的順序相同,則可以簡(jiǎn)單地將目標(biāo)列表達(dá)式指定為星號(hào)“*”。例3.11 查詢?nèi)w學(xué)生的記錄。SELECT SNO, SNAME, SAGE, SSEX, SEPTFROM STUDENT; 等價(jià)于: SELECT * FROM STUDENT;查詢結(jié)果如表3-8所示。機(jī)械工業(yè)出版社553.3 SQL數(shù)據(jù)查詢例3.10 查詢?nèi)w學(xué)生的姓名、學(xué)號(hào)、性別和

41、所在系。SELECT SNAME, SNO, SSEX, SEPTFROM STUDENT;查詢結(jié)果如表3-7所示。 機(jī)械工業(yè)出版社563.3 SQL數(shù)據(jù)查詢SNOSNAMESSEXSAGESDEPTS8201王晨男21計(jì)算機(jī)系S8202李俊女20計(jì)算機(jī)系S8203劉利敏女19計(jì)算機(jī)系S8204張海男20計(jì)算機(jī)系S8801吳浩男18數(shù)學(xué)系S8802程小磊男20數(shù)學(xué)系S8803張建超男19數(shù)學(xué)系S9101李云鵬男18自動(dòng)化系S9102劉一鳴女20自動(dòng)化系表3-8 查詢?nèi)w學(xué)生記錄結(jié)果機(jī)械工業(yè)出版社573.3 SQL數(shù)據(jù)查詢(3)查詢經(jīng)過(guò)計(jì)算的列 SELECT子句中的目標(biāo)列表達(dá)式可以是表中存在的屬

42、性列,也可以是表達(dá)式、常量或函數(shù)。例3.12 查詢?nèi)w學(xué)生的姓名和出生年份。 在STUDENT表中只記錄了學(xué)生的年齡,而沒(méi)有記錄學(xué)生的出生年份,但可以經(jīng)過(guò)計(jì)算得到出生年份,即用當(dāng)前年(假設(shè)為2007年)減去年齡,得到出生年份。因此,實(shí)現(xiàn)此功能的查詢語(yǔ)句為:SELECT SNAME,2007SAGEFROM STUDENT;查詢結(jié)果如表3-9所示。機(jī)械工業(yè)出版社583.3 SQL數(shù)據(jù)查詢SNAMESSEX王晨1986李俊1987劉利敏1988張海1987吳浩1989程小磊1987張建超1988李云鵬1989劉一鳴1987表3-9 查詢姓名和出生年份結(jié)果機(jī)械工業(yè)出版社593.3 SQL數(shù)據(jù)查詢例3

43、.13 查詢?nèi)w學(xué)生的姓名和出生年份,并在出生年 份列前加入一個(gè)列,此列的每行數(shù)據(jù)均為“YEAR OF BIRTH”常量值。SELECT SNAME, YEAR OF BIRTH,2007SAGEFROM STUDENT;查詢結(jié)果如表3-10所示。機(jī)械工業(yè)出版社603.3 SQL數(shù)據(jù)查詢表3-10 查詢并加入新列結(jié)果SNAME王晨YEAROFBIRTH 1986李俊YEAROFBIRTH1987劉利敏YEAROFBIRTH1988張海YEAROFBIRTH1987吳浩YEAROFBIRTH1989程小磊YEAROFBIRTH1987張建超YEAROFBIRTH1988李云鵬YEAROFBIRT

44、H1989劉一鳴YEAROFBIRTH1987注意,選擇列表中的常量和計(jì)算是對(duì)表中的每一行進(jìn)行的。機(jī)械工業(yè)出版社613.3 SQL數(shù)據(jù)查詢例3.14 查詢?nèi)w學(xué)生的姓名、出生年份和所在系,要求用小寫(xiě)字母表示學(xué)號(hào)中的字母。 SELECT ISLOWER(SNO) ,SNAME, YEAR OF BIRTH,2007SAGEFROM STUDENT;查詢結(jié)果如表3-11所示。機(jī)械工業(yè)出版社623.3 SQL數(shù)據(jù)查詢表3-11 查詢并用小寫(xiě)字母標(biāo)示系名結(jié)果SNAMES8201王晨YEAROFBIRTH 1986S8202李俊YEAROFBIRTH1987S8203劉利敏YEAROFBIRTH1988

45、S8204張海YEAROFBIRTH1987S8801吳浩YEAROFBIRTH1989S8802程小磊YEAROFBIRTH1987S8803張建超YEAROFBIRTH1988S9101李云鵬YEAROFBIRTH1989S9102劉一鳴YEAROFBIRTH1987機(jī)械工業(yè)出版社633.3 SQL數(shù)據(jù)查詢 可以看出經(jīng)過(guò)計(jì)算的列、函數(shù)的列和常量列顯示結(jié)果都沒(méi)有列標(biāo)題,通過(guò)指定列的別名可以改變查詢結(jié)果的列標(biāo)題,這對(duì)于算數(shù)表達(dá)式、常量、函數(shù)名的目標(biāo)列尤其有用。 改變列標(biāo)題的語(yǔ)法格式為:列名|表達(dá)式 AS 列標(biāo)題或列標(biāo)題=列名|表達(dá)式機(jī)械工業(yè)出版社643.3 SQL數(shù)據(jù)查詢例如,對(duì)于例3.14,

46、可以定義如下列別名:SELECT ISLOWER(SNO) LSNO,SNAME, YEAR OF BIRTH BRITH, 2007SAGE BRITHDAYFROM STUDENT;查詢結(jié)果間如表3-12所示。機(jī)械工業(yè)出版社653.3 SQL數(shù)據(jù)查詢表3-12 查詢并定義別名結(jié)果LSNO SNAMEBIRTHBRITHDAYS8201王晨YEAROFBIRTH 1986S8202李俊YEAROFBIRTH1987S8203劉利敏YEAROFBIRTH1988S8204張海YEAROFBIRTH1987S8801吳浩YEAROFBIRTH1989S8802程小磊YEAROFBIRTH1987

47、S8803張建超YEAROFBIRTH1988S9101李云鵬YEAROFBIRTH1989S9102劉一鳴YEAROFBIRTH1987機(jī)械工業(yè)出版社663.3 SQL數(shù)據(jù)查詢2選擇表中的若干元組 上面介紹的例子全部都是選擇表中的所有記錄,而沒(méi)有對(duì)表中的記錄進(jìn)行任何有條件的選擇。事實(shí)上,在查詢的過(guò)程中,除了可以選擇列之外,還可以對(duì)行進(jìn)行選擇,使查詢結(jié)果更加滿足用戶的要求。(1)消除取值相同的元組 本來(lái)在數(shù)據(jù)庫(kù)表中不存在取值完全相同的元組,但在進(jìn)行了對(duì)列的選擇后,在查詢結(jié)果中就有可能出現(xiàn)取值完全相同的行了。取值相同的行在結(jié)果中是沒(méi)有意義的,因此應(yīng)消除掉。機(jī)械工業(yè)出版社673.3 SQL數(shù)據(jù)查詢

48、例3.15 在基本表SC中查詢選修了課程的學(xué)生學(xué)號(hào)。SELECT SNO FROM SC;查詢結(jié)果如表3-13所示。SNOS8201S8202S8203S8204S8801S8802S8803S9101S9102 表3-13 查詢學(xué)號(hào)結(jié)果機(jī)械工業(yè)出版社683.3 SQL數(shù)據(jù)查詢 在這個(gè)查詢結(jié)果中有許多重復(fù)的元組,一個(gè)學(xué)生選修了多少門(mén)課程,其學(xué)號(hào)就在結(jié)果中重復(fù)幾次。如果想去掉結(jié)果表中的重復(fù)行,必須指定DISTINCT短語(yǔ):SELECT DISTINCT SNO FROM SC;執(zhí)行結(jié)果如表3-14所示。機(jī)械工業(yè)出版社69TableSNOS8201S8202S8203S8204S8801表3-14

49、去掉重復(fù)行結(jié)果 DISTINCT關(guān)鍵字在SELECT的后邊,目標(biāo)列表達(dá)式的前邊。如果沒(méi)有指定DISTINCT短語(yǔ),則默認(rèn)ALL,即保留結(jié)果表中取值重復(fù)的行。SELECT SNO FROM SC;等價(jià)于:SELECT ALL SNO FROM SC;機(jī)械工業(yè)出版社703.3 SQL數(shù)據(jù)查詢(2)查詢滿足條件的元組查詢滿足條件的元組是通過(guò)WHERE子句來(lái)實(shí)現(xiàn)的。WHERE子句常用的查詢條件如表3-15所示。查詢條件謂 詞比較(比較運(yùn)算符)=,=,=,!=,!,!,NOT+上述比較運(yùn)算符確定范圍BETWEEN AND,NOT BETWEEN AND確定集合IN,NOT IN字符匹配LIKE,NOT

50、LIKE空值IS NULL,IS NOT NULL多重條件(邏輯謂詞)AND,OR表3-15 常用的查詢條件機(jī)械工業(yè)出版社713.3 SQL數(shù)據(jù)查詢比較大小的查詢例3.16 查詢計(jì)算機(jī)系的所有學(xué)生的學(xué)號(hào)、姓名。SELECT SNO, SNAMEFROM STUDENTWHERE SDEPT=計(jì)算機(jī)系;查詢結(jié)果如表3-16所示。SNOSNAMES8201王晨S8202李俊S8203劉利敏S8204張海表3-16 查詢計(jì)算機(jī)系學(xué)生學(xué)號(hào)、姓名結(jié)果機(jī)械工業(yè)出版社723.3 SQL數(shù)據(jù)查詢例3.17 查詢所有年齡在21歲以下的學(xué)生姓名及年齡。SELECT SNAME, SAGEFROM STUDENTW

51、HERE SAGE=21;查詢結(jié)果如表3-17所示。SNAMESAGE李俊20劉利敏19張海20吳浩18程小磊20張建超19李云鵬18劉一鳴20表3-17 查詢21歲以下的學(xué)生結(jié)果機(jī)械工業(yè)出版社733.3 SQL數(shù)據(jù)查詢例3.18 查詢考試成績(jī)?cè)?5分以上(包括85分)的學(xué)生學(xué)號(hào)。SELECT SNOFROM COURSEWHERE GRADE=85;查詢結(jié)果如表3-18所示。SNO GRADES820192S820185S820288S820394S820391S820490S880186表3-18 查詢成績(jī)?cè)?5分以上的結(jié)果機(jī)械工業(yè)出版社743.3 SQL數(shù)據(jù)查詢確定范圍的查詢 BETWE

52、ENAND和NOT BETWEENAND是邏輯運(yùn)算符,可以用來(lái)查找屬性值在或不在指定范圍內(nèi)的元組,其中BETWEEN后面指定范圍的下限,AND后面指定范圍的上限。使用BETWEENAND的格式為:列名|表達(dá)式 NOT BETWEEN 下限值 AND 上限值 BETWEENAND一般用于對(duì)數(shù)值型數(shù)據(jù)進(jìn)行比較。列名或表達(dá)式的類(lèi)型要與下限值或上限值的類(lèi)型相同。 “BETWEEN 下限值 AND 上限值”的含義是:如果列或表達(dá)式的值在下限值和上限值范圍內(nèi),則結(jié)果為T(mén)RUE,表明此記錄符合查詢條件,否則結(jié)果為FALSE,表明此記錄不符合查詢條件。 “NOT BETWEEN 下限值 AND 上限值”的含義

53、正好相反:如果列或表達(dá)式的值在下限值和上限值范圍內(nèi),則結(jié)果為FALSE,表明此記錄不符合查詢條件,否則結(jié)果為T(mén)RUE,表明此記錄符合查詢條件。機(jī)械工業(yè)出版社753.3 SQL數(shù)據(jù)查詢例3.19 查詢年齡在1921歲之間的學(xué)生學(xué)號(hào)、 姓名和年齡。SELECT SNO, SNAME, SAGEFROM STUDENTWHERE SAGE BETWEEN 19 AND 21;查詢結(jié)果如表3-19所示。機(jī)械工業(yè)出版社763.3 SQL數(shù)據(jù)查詢SNOSNAMESAGES8201王晨21S8202李俊20S8203劉利敏19S8204張海20S8802程小磊20S8803張建超19S9102劉一鳴20表3

54、-19 查詢年齡1921歲學(xué)生結(jié)果等價(jià)于:SELECT SNO, SNAME, SAGEFROM STUDENTWHERE SAGE=19 AND SAGE=21;機(jī)械工業(yè)出版社773.3 SQL數(shù)據(jù)查詢例3.20 查詢年齡不在1921歲之間的學(xué)生學(xué)號(hào)、姓名和年齡。SELECT SNO, SNAME, SAGEFROM STUDENTWHERE SAGE NOT BETWEEN 19 AND 21;等價(jià)于:SELECT SNO, SNAME, SAGEFROM STUDENTWHERE SAGE21;查詢結(jié)果如表3-20所示。SNOSNAMESAGES8801吳浩18S9101李云鵬18表3-

55、20查詢不在年齡1921歲學(xué)生結(jié)果機(jī)械工業(yè)出版社783.3 SQL數(shù)據(jù)查詢確定集合的查詢 如果要查找屬性值屬于指定集合的元組,可以使用一個(gè)邏輯運(yùn)算符IN,使用IN的格式為:列名NOT IN 用IN進(jìn)行比較的數(shù)據(jù)大多為字符型數(shù)據(jù),也可以是數(shù)值型數(shù)據(jù)。 IN的含義為:當(dāng)列的值與IN中的某個(gè)常量值相同時(shí),則結(jié)果為T(mén)RUE,表明此記錄符合查詢條件。NOT IN的含義正好相反,當(dāng)列的值與某個(gè)常量相同時(shí),則結(jié)果為FALSE,表明此記錄不符合查詢條件。機(jī)械工業(yè)出版社793.3 SQL數(shù)據(jù)查詢例3.21查詢計(jì)算機(jī)系和數(shù)學(xué)系學(xué)生的學(xué)號(hào)、姓名和性別。SELECT SNO, SNAME, SSEXFROM STUD

56、ENTWHERE SDEPT IN (計(jì)算機(jī)系, 數(shù)學(xué)系);等價(jià)于:SELECT SNO, SNAME, SSEXFROM STUDENTWHERE SDEPT =計(jì)算機(jī)系 OR SDEPT =數(shù)學(xué)系;查詢結(jié)果如表3-21所示。機(jī)械工業(yè)出版社803.3 SQL數(shù)據(jù)查詢SNOSNAMESSEXS8201王晨男S8202李俊女S8203劉利敏女S8204張海男S8801吳浩男S8802程小磊男S8803張建超男表3-21 查詢計(jì)算機(jī)系和數(shù)學(xué)系學(xué)生結(jié)果機(jī)械工業(yè)出版社813.3 SQL數(shù)據(jù)查詢例3.22 查詢既不是計(jì)算機(jī)系,也不是數(shù)學(xué)系學(xué)生的學(xué)號(hào)、姓名、性別和年齡。SELECT SNO, SNAME,

57、 SSEX, SAGEFROM STUDENTWHERE SDEPT NOT IN (計(jì)算機(jī)系, 數(shù)學(xué)系);等價(jià)于:SELECT SNO, SNAME, SSEX, SAGEFROM STUDENTWHERE SDEPT! =計(jì)算機(jī)系 OR SDEPT!= 數(shù)學(xué)系;查詢結(jié)果如表3-22所示。表3-22查詢既不是計(jì)算機(jī)系也不是數(shù)學(xué)系學(xué)生結(jié)果機(jī)械工業(yè)出版社823.3 SQL數(shù)據(jù)查詢字符匹配的查詢 LIKE用于查找指定列值與匹配串常量匹配的元組。匹配串是一種特殊的字符串,其特殊之處在于它不僅可以包含普通字符,而且還可以包含通配符。通配符用于表示任意的字符或字符串。在實(shí)際應(yīng)用中,如果需要從數(shù)據(jù)庫(kù)中檢索

58、一批記錄,但又不能給出精確的字符查詢條件,這時(shí)就可以使用LIKE運(yùn)算符和通配符來(lái)實(shí)現(xiàn)模糊查詢。在LIKE運(yùn)算符前邊也可以使用NOT運(yùn)算符,表示對(duì)結(jié)果取反,其一般格式為:NOT LIKE 匹配串 ESCAPE 機(jī)械工業(yè)出版社833.3 SQL數(shù)據(jù)查詢 其含義是查找指定的屬性列值與匹配串相匹配的元組。匹配串可以是一個(gè)完整的字符串,也可以含有通配符%和_。其中:%(百分號(hào))代表任意長(zhǎng)度(長(zhǎng)度可以為0)的字符串。例如,a%b表示以a開(kāi)頭,以b結(jié)尾的任意長(zhǎng)度的字符串。如acb、adertb、artghklb等。_(下橫線)表示任意單個(gè)字符。例如,a_b表示以a開(kāi)頭,以b結(jié)尾的長(zhǎng)度為3的任意字符串。如ad

59、b、agb等都滿足該匹配串。機(jī)械工業(yè)出版社843.3 SQL數(shù)據(jù)查詢例3.23 查詢數(shù)學(xué)系學(xué)生的信息。SELECT *FROM STUDENTWHERE SDEPT LIKE 數(shù)學(xué)系;等價(jià)于:SELECT *FROM STUDENTWHERE SDEPT= 數(shù)學(xué)系;如果LIKE后面的匹配串中不含通配符,則可以用=(等于)運(yùn)算符代替LIKE謂詞,用!=或(不等于)運(yùn)算符取代NOT LIKE謂詞。查詢結(jié)果如表3-23所示。機(jī)械工業(yè)出版社853.3 SQL數(shù)據(jù)查詢SNOSNAMESSEXSAGESDEPTS8801吳浩男18數(shù)學(xué)系S8802程小磊男20數(shù)學(xué)系S8803張建超男19數(shù)學(xué)系表3-23查詢

60、數(shù)學(xué)系學(xué)生結(jié)果機(jī)械工業(yè)出版社863.3 SQL數(shù)據(jù)查詢例3.24 查詢所有姓李的學(xué)生信息。SELECT *FROM STUDENTWHERE SNAME LIKE 李%;查詢結(jié)果如表3-24所示。SNOSNAMESSEXSAGESDEPTS8202李俊女20計(jì)算機(jī)系S9101李云鵬男18自動(dòng)化系表3-24 查詢所有姓李的學(xué)生結(jié)果機(jī)械工業(yè)出版社873.3 SQL數(shù)據(jù)查詢例3.25 查詢姓名中第二個(gè)字為“小”的學(xué)生信息。SELECT *FROM STUDENTWHERE SNAME LIKE _ _小%;注意:因?yàn)橐粋€(gè)漢字要占兩個(gè)字符的位置,所以匹配串“小”前面需要兩個(gè)“_”。查詢結(jié)果如表3-25

溫馨提示

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

評(píng)論

0/150

提交評(píng)論