第二章 C++語(yǔ)言基礎(chǔ).ppt_第1頁(yè)
第二章 C++語(yǔ)言基礎(chǔ).ppt_第2頁(yè)
第二章 C++語(yǔ)言基礎(chǔ).ppt_第3頁(yè)
第二章 C++語(yǔ)言基礎(chǔ).ppt_第4頁(yè)
第二章 C++語(yǔ)言基礎(chǔ).ppt_第5頁(yè)
已閱讀5頁(yè),還剩130頁(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、1,第3章 SQL語(yǔ)言,2,本章概要,SQL是結(jié)構(gòu)化查詢語(yǔ)言(Structured Query Language)的縮寫,其功能包括數(shù)據(jù)查詢、數(shù)據(jù)操縱、數(shù)據(jù)定義和數(shù)據(jù)控制四個(gè)部分。 SQL 語(yǔ)言簡(jiǎn)潔、方便實(shí)用、功能齊全,已成為目前應(yīng)用最廣的關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言。 本章要求 了解 SQL語(yǔ)言的特點(diǎn), 掌握SQL語(yǔ)言的四大功能及使用方法, 重點(diǎn)掌握其數(shù)據(jù)查詢功能及其使用。,3,3.1 SQL語(yǔ)言的基本概念與特點(diǎn),3.1.1 SQL語(yǔ)言的發(fā)展及標(biāo)準(zhǔn)化 SQL語(yǔ)言發(fā)展史 SQL語(yǔ)言是當(dāng)前最為成功、應(yīng)用最為廣泛的關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言,其發(fā)展主要經(jīng)歷了以下幾個(gè)階段: 1974年由CHAMBERLIN和

2、BOYEE提出,當(dāng)時(shí)稱為SEQUEL(STUCTURED ENGLISH QUERY LANGUAGE); IBM公司對(duì)其進(jìn)行了修改,并用于其SYSTEM R關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)中; 1981年 IBM推出其商用關(guān)系關(guān)系數(shù)據(jù)庫(kù)SQL/DS,并將其名字改為SQL,由于SQL語(yǔ)言功能強(qiáng)大,簡(jiǎn)潔易用,因此得到了廣泛的使用; 今天廣泛應(yīng)用于各種大型數(shù)據(jù)庫(kù),如SYBASE、INFORMIX、 ORACLE、DB2、INGRES等,也用于各種小型數(shù)據(jù)庫(kù),如FOXPRO、ACCESS。,4, SQL語(yǔ)言標(biāo)準(zhǔn)化 隨著關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)和SQL語(yǔ)言應(yīng)用的日益廣泛,SQL語(yǔ)言的標(biāo)準(zhǔn)化工作也在緊張革進(jìn)行著,十多

3、年來(lái)已制訂了多個(gè)SQL標(biāo)準(zhǔn); 1. 1982年,美國(guó)國(guó)家標(biāo)準(zhǔn)化局(AMERICAN NATIONAL STANDARD INSTITUTE,簡(jiǎn)稱ANSI)開始制定SQL標(biāo)準(zhǔn); 2. 1986年,美國(guó)國(guó)家標(biāo)準(zhǔn)化協(xié)會(huì)公布了SQL語(yǔ)言的第一個(gè)標(biāo)準(zhǔn)SQL86; 3. 1987年,國(guó)際標(biāo)準(zhǔn)化組織(ISO)通過(guò)了SQL86標(biāo)準(zhǔn); 4. 1989年,國(guó)際標(biāo)準(zhǔn)化組織(ISO)對(duì)SQL86進(jìn)行了補(bǔ)充,推出了SQL89標(biāo)準(zhǔn); 5. 1992年,ISO又推出了SQL92標(biāo)準(zhǔn),也稱為SQL2; 6. 目前SQL99(也稱為SQL3)在起草中,增加了面向?qū)ο蟮墓δ堋?5,3.1.2 SQL語(yǔ)言的基本概念 首先介紹兩個(gè)基

4、本概念:基本表和視圖。 基本表(BASE TABLE):是獨(dú)立存在的表,不是由其它的表導(dǎo)出的表。一個(gè)關(guān)系對(duì)應(yīng)一個(gè)基本表,一個(gè)或多個(gè)基本表對(duì)應(yīng)一個(gè)存儲(chǔ)文件。 視圖(VIEW):是一個(gè)虛擬的表,是從一個(gè)或幾個(gè)基本表導(dǎo)出的表。它本身不獨(dú)立存在于數(shù)據(jù)庫(kù)中,數(shù)據(jù)庫(kù)中只存放視圖的定義而不存放視圖對(duì)應(yīng)的數(shù)據(jù),這些數(shù)據(jù)仍存放在導(dǎo)出視圖的基本表中。當(dāng)基本表中的數(shù)據(jù)發(fā)生變化時(shí),從視圖中查詢出來(lái)的數(shù)據(jù)也隨之改變。,6,例如:學(xué)生數(shù)據(jù)庫(kù)中有學(xué)生基本情況表STUDENT(SNO,SNAME,SSEX,SAGE,SDEPT),此表為基本表,對(duì)應(yīng)一個(gè)存儲(chǔ)文件??梢栽谄浠A(chǔ)上定義一個(gè)男生基本情況表STUDENT_MALE(S

5、NO,SNAME,SAGE,SDEPT), 它是從STUDENT中選擇SSEX=男的各個(gè)行,然后在SNO,SNAME,SAGE,SDEPT上投影得到的。 在數(shù)據(jù)庫(kù)中只存有STUDENT_MALE的定義,而STUDENT_MALE的記錄不重復(fù)存儲(chǔ)。 在用戶看來(lái),視圖是通過(guò)不同路徑去看一個(gè)實(shí)際表,就象一個(gè)窗口一樣,我們通過(guò)窗戶去看外面的高樓,可以看到高樓的不同部分,而透過(guò)視圖可以看到數(shù)據(jù)庫(kù)中自己感興趣的內(nèi)容。,7,圖3.1 SQL語(yǔ)言支持的關(guān)系數(shù)據(jù)庫(kù)的三級(jí)邏輯結(jié)構(gòu),SQL語(yǔ)言支持?jǐn)?shù)據(jù)庫(kù)的三級(jí)模式結(jié)構(gòu),如圖3.1所示。其中外模式對(duì)應(yīng)于視圖和部分基本表,模式對(duì)應(yīng)于基本表,內(nèi)模式對(duì)應(yīng)于存儲(chǔ)文件。,8,3

6、.1.3 SQL語(yǔ)言的主要特點(diǎn) SQL語(yǔ)言類似于英語(yǔ)的自然語(yǔ)言,簡(jiǎn)潔易用。 SQL語(yǔ)言是一種非過(guò)程語(yǔ)言,即用戶只要提出“干什么”即可,不必管具體操作過(guò)程,也不必了解數(shù)據(jù)的存取路徑,只要指明所需的數(shù)據(jù)即可。 SQL語(yǔ)言是一種面向集合的語(yǔ)言,每個(gè)命令的操作對(duì)象是一個(gè)或多個(gè)關(guān)系,結(jié)果也是一個(gè)關(guān)系。 SQL語(yǔ)言既是自含式語(yǔ)言,又是嵌入式語(yǔ)言。可獨(dú)立使用,也可嵌入到宿主語(yǔ)言中。 自含式語(yǔ)言可以獨(dú)立使用交互命令,適用于終端用戶、應(yīng)用程序員和DBA; 嵌入式語(yǔ)言使其嵌入在高級(jí)語(yǔ)言中使用,供應(yīng)用程序員開發(fā)應(yīng)用程序。,9,5. SQL語(yǔ)言具有: 數(shù)據(jù)查詢(QUERY) 數(shù)據(jù)定義(DEFINITION) 數(shù)據(jù)操縱

7、(MANIPULATION) 數(shù)據(jù)控制(CONTROL) 四種語(yǔ)言一體化的功能。 下面以SQL SERVER 為例分別介紹其各個(gè)功能。各例題中所用的基本表如圖1.12所示。,10,3.2 SQL數(shù)據(jù)定義,SQL語(yǔ)言使用數(shù)據(jù)定義語(yǔ)言(DATA DEFINITION LANGUAGE,簡(jiǎn)稱DDL)實(shí)現(xiàn)其數(shù)據(jù)定義功能,可對(duì)數(shù)據(jù)庫(kù)用戶、基本表、視圖、索引進(jìn)行定義和撤消。 3.2.1 字段數(shù)據(jù)類型 當(dāng)用SQL語(yǔ)句定義表時(shí),需要為表中的每一個(gè)字段設(shè)置一個(gè)數(shù)據(jù)類型,用來(lái)指定字段所存放的數(shù)據(jù)是整數(shù)、字符串、貨幣或是其它類型的數(shù)據(jù)。 SQL SERVER 的數(shù)據(jù)類型有很多種,分為以下9類: 1. 整數(shù)數(shù)據(jù)類型:

8、依整數(shù)數(shù)值的范圍大小,有BIT, INT , SMALLINT, TINYINT四種。 2. 精確數(shù)值類型:用來(lái)定義可帶小數(shù)部分的數(shù)字,有NUMERIC和DECIMAL兩種。二者相同,但建議使用DECIMAL。如:123.0、8000.56,11,3. 近似浮點(diǎn)數(shù)值數(shù)據(jù)類型:當(dāng)數(shù)值的位數(shù)太多時(shí),可用此數(shù)據(jù)類型來(lái)取其近似值,用FLOAT和REAL兩種。如:1.23E+10 4. 日期時(shí)間數(shù)據(jù)類型:用來(lái)表示日期與時(shí)間,依時(shí)間范圍與精確程度可分為DATETIME與SMALLDATETIME兩種。如:1998-06-08 15:30:00 5. 字符串?dāng)?shù)據(jù)類型:用來(lái)表示字符串的字段。包括:CHAR,

9、VARCHAR, TEXT三種,如:“數(shù)據(jù)庫(kù)” 6. UNICODE字符串?dāng)?shù)據(jù)類型:UNICODE是雙字節(jié)文字編碼標(biāo)準(zhǔn),包括NCHAR, NVARCHAR與NTEXT三種。與字符串?dāng)?shù)據(jù)類型相類似,但UNICODE的一個(gè)字符用2字節(jié)存儲(chǔ),而一般字符數(shù)據(jù)用一個(gè)字節(jié)存儲(chǔ)。 7. 二進(jìn)制數(shù)據(jù)類型:用來(lái)定義二進(jìn)制碼的數(shù)據(jù)。有:BINARY, VARBINARY,IMAGE 三種,通常用十六進(jìn)制表示:如:OX5F3C,12,8. 貨幣數(shù)據(jù)類型:用來(lái)定義與貨幣有關(guān)的數(shù)據(jù),分為MONEY 與SMALLMONEY兩種,如:123.0000 9. 標(biāo)記數(shù)據(jù)類型:有UNIQUEIDENTIFIER ,TIMESTA

10、MP兩種,此數(shù)據(jù)類型通常系統(tǒng)自動(dòng)產(chǎn)生,而不是用戶輸入的,TIMESTAMP記錄數(shù)據(jù)更新的時(shí)間戳印,而UNIQUEIDENTIFIER用來(lái)識(shí)別每一筆數(shù)據(jù)的唯一性。 各種數(shù)據(jù)類型的有關(guān)規(guī)定如下表:,13,14,15,16,3.2.2 定義、修改和撤消數(shù)據(jù)庫(kù)的用戶 建立數(shù)據(jù)庫(kù)用戶 數(shù)據(jù)庫(kù)用戶是指能夠登錄到數(shù)據(jù)庫(kù),并能夠?qū)?shù)據(jù)庫(kù)進(jìn)行存取操作的用戶。 當(dāng)SQL SERVER系統(tǒng)安裝完畢后,數(shù)據(jù)庫(kù)管理員就可以通過(guò)CREATE USER語(yǔ)句建立其他數(shù)據(jù)庫(kù)用戶了。 語(yǔ)法格式為: CREATE USER IDENTIFIED BY 指定數(shù)據(jù)庫(kù)用戶的帳號(hào)名字,即用戶標(biāo)識(shí)符, 指用戶登錄到數(shù)據(jù)庫(kù)系統(tǒng)

11、時(shí)使用的口令, 這里的用戶名和口令可以與用戶登錄到操作系統(tǒng)時(shí)所使用的用戶名和口令不同。,17,例3.1 建立一個(gè)新用戶,其名稱為ZHANGSAN,登錄口令為123。 CREATE USER ZHANGSAN IDENTIFIED BY 123 更改數(shù)據(jù)庫(kù)用戶的口令 數(shù)據(jù)庫(kù)用戶最初的口令是由數(shù)據(jù)庫(kù)管理員指定的,數(shù)據(jù)庫(kù)用戶可以用ALTER USER命令來(lái)更改它, ALTER USER語(yǔ)句的基本語(yǔ)法格式為: ALTER USER IDENTIFIED BY 例3.2 將用戶ZHANGSAN的口令改為456。 ALTER USER ZHANGSAN IDENTIFIED BY 456,

12、18, 刪除用戶 隨著數(shù)據(jù)庫(kù)應(yīng)用的發(fā)展和變化,數(shù)據(jù)庫(kù)的用戶也會(huì)發(fā)生變化。 如果某些數(shù)據(jù)庫(kù)用戶不再需要使用數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)管理員就可以使用DROP USER把該用戶刪掉, DROP USER 語(yǔ)句的基本語(yǔ)法格式為: DROP USER 例3.3 刪除用戶ZHANGSAN DROP USER ZHANGSAN 注意:刪除數(shù)據(jù)庫(kù)用戶之前應(yīng)首先刪除該用戶建立的數(shù)據(jù)庫(kù)對(duì)象,包括基本表、視圖、索引等,否則系統(tǒng)將不允許刪除這個(gè)用戶。,19,3.2.2 建立數(shù)據(jù)庫(kù) CREATE DATABASE 3.2.3 創(chuàng)建、修改和刪除數(shù)據(jù)表 創(chuàng)建數(shù)據(jù)表 數(shù)據(jù)表是關(guān)系數(shù)據(jù)庫(kù)的基本組成單位,它物

13、理地存儲(chǔ)于數(shù)據(jù)庫(kù)的存儲(chǔ)文件中。 1. 創(chuàng)建一個(gè)數(shù)據(jù)表時(shí)主要包括以下幾個(gè)組成部分: (1)字段名(列名):字段名可長(zhǎng)達(dá)128個(gè)字符。字段名可包含中文、英文字母、下劃線、#號(hào)、貨幣符號(hào)(¥)及AT符號(hào)()。同一表中不許有重名列; (2)字段數(shù)據(jù)類型:見(jiàn)表3.2; (3)字段的長(zhǎng)度、精度和小數(shù)位數(shù);,20,字段的長(zhǎng)度:指字段所能容納的最大數(shù)據(jù)量,但對(duì)不同的數(shù)據(jù)類型來(lái)說(shuō),長(zhǎng)度對(duì)字段的意義可能有些不同。 對(duì)字符串與UNICODE數(shù)據(jù)類型而言,長(zhǎng)度代表字段所能容納的字符的數(shù)目,因此它會(huì)限制用戶所能輸入的文本長(zhǎng)度。 對(duì)數(shù)值類的數(shù)據(jù)類型而言,長(zhǎng)度則代表字段使用多少個(gè)字節(jié)來(lái)存放數(shù)字。 對(duì)BINARY、VARBI

14、NARY、IMAGE數(shù)據(jù)類型而言,長(zhǎng)度代表字段所能容納的字節(jié)數(shù)。 精度和小數(shù)位數(shù) 精度是指數(shù)中數(shù)字的位數(shù),包括小數(shù)點(diǎn)左側(cè)的整數(shù)部分和小數(shù)點(diǎn)右側(cè)的小數(shù)部分; 小數(shù)位數(shù)則是指數(shù)字小數(shù)點(diǎn)右側(cè)的位數(shù)。 例如:數(shù)字12345.678,其精度為8,小數(shù)位數(shù)為3; 所以只有數(shù)值類的數(shù)據(jù)類型才有必要指定精度和小數(shù)位數(shù)。,21,經(jīng)常以如下所示的格式來(lái)表示數(shù)據(jù)類型以及它所采用的長(zhǎng)度、精度和小數(shù)位數(shù),其中的N代表長(zhǎng)度,P代表精度,S表示小數(shù)位數(shù)。 BINARY(N) - BINARY(10) CHAR(N) - CHAR(20) NUMERIC(P,S) - NUMERIC(8,3) 但有的數(shù)據(jù)類型的精度與小數(shù)位數(shù)

15、是固定的,對(duì)采用此類數(shù)據(jù)類型的字段而言,不需設(shè)置精度與小數(shù)位數(shù), 如:如果某字段采用INT數(shù)據(jù)類型,其長(zhǎng)度固定是4,精度固定是10,小數(shù)位數(shù)則固定是0,這表示字段將能存放10位數(shù)沒(méi)有小數(shù)點(diǎn)的整數(shù)。存儲(chǔ)大小則是4個(gè)字節(jié)。 (4)NULL值與DEFAULT值 DEFAULT值表示某一字段的默認(rèn)值,當(dāng)沒(méi)有輸入數(shù)據(jù)時(shí),則使用此默認(rèn)的值。,22,2. 創(chuàng)建數(shù)據(jù)表的SQL語(yǔ)法格式 在SQL語(yǔ)言中,使用語(yǔ)句CREATE TABLE創(chuàng)建數(shù)據(jù)表,其基本語(yǔ)法格式為: CREATE TABLE (,|) 是合法標(biāo)識(shí)符,最多可有128個(gè)字符,如S,SC,C,不允許重名。 :DEFAULT DEFAULT:若是某字段設(shè)

16、置有默認(rèn)值,當(dāng)該字段未被輸入數(shù)據(jù)時(shí),則以該默認(rèn)值自動(dòng)填入該字段。,23,例3.4 建立一學(xué)生表 USE STUDENT CREATE TABLE S (SNO CHAR(8) , SN VARCHAR(20), AGE INT, SEX CHAR(2) DEFAULT 男 , DEPT VARCHAR(20); 執(zhí)行該語(yǔ)句后,便產(chǎn)生了學(xué)生基本表的表框架,此表為一個(gè)空表。 其中,SEX列的缺省值為“男”。,24,3. 定義完整性約束 上列為創(chuàng)建基本表的最簡(jiǎn)單形式,還可以對(duì)表進(jìn)一步定義,如主鍵、空值的設(shè)定,使數(shù)據(jù)庫(kù)用戶能夠根據(jù)應(yīng)用的需要對(duì)基本表的定義做出更為精確和詳盡的規(guī)定。 在SQL SERVE

17、R中,對(duì)于基本表的約束分為列約束和表約束。 列約束是對(duì)某一個(gè)特定列的約束,包含在列定義中,直接跟在該列的其他定義之后,用空格分隔,不必指定列名; 表約束與列定義相互獨(dú)立,不包括在列定義中,通常用于對(duì)多個(gè)列一起進(jìn)行約束,與列定義用,分隔,定義表約束時(shí)必須指出要約束的那些列的名稱。完整性約束的基本語(yǔ)法格式為: CONSTRAINT 約束名:約束不指定名稱時(shí),系統(tǒng)會(huì)給定一個(gè)名稱。,25,約束類型:在定義完整性約束時(shí)必須指定完整性約束的類型。 在SQL SERVER中可以定義五種類型的完整性約束,下面分別加以介紹: (1)NULL/NOT NULL 是否允許該字段的值為NULL。 NULL值不是0也不

18、是空白,更不是填入字符串“NULL”,而是表示“不知道”、“不確定”或“沒(méi)有數(shù)據(jù)”的意思。 當(dāng)某一字段的值一定要輸入才有意義的時(shí)候,則可以設(shè)置為NOT NULL。 如主鍵列就不允許出現(xiàn)空值,否則就失去了唯一標(biāo)識(shí)一條記錄的作用 只能用于定義列約束, 其語(yǔ)法格式如下: CONSTRAINT NULL|NOT NULL,26,例3.5 建立一個(gè)S表,對(duì)SNO字段進(jìn)行NOT NULL約束。 USE STUDENT CREATE TABLE S (SNO CHAR(10) CONSTRAINT S_CONS NOT NULL, SN VARCHAR(20), AGE INT, SEX CHAR(2) D

19、EFAULT 男 , DEPT VARCHAR(20); 當(dāng)SNO為空上時(shí),系統(tǒng)給出錯(cuò)誤信息,無(wú)NOT NULL約束時(shí),系統(tǒng)缺省為NULL。 其中S_CONS為指定的約束名稱,當(dāng)約束名稱省略時(shí),系統(tǒng)自動(dòng)產(chǎn)生一個(gè)名字。如下列功能同上,只是省略約束名稱。,27,USE STUDENT CREATE TABLE S (SNO CHAR(10) NOT NULL , SN VARCHAR(20), AGE INT, SEX CHAR(2) DEFAULT 男 , DEPT VARCHAR(20);,28,(2)UNIQUE約束 UNIQUE約束用于指明基本表在某一列或多個(gè)列的組合上的取值必須唯一。 定

20、義了UNIQUE約束的那些列稱為唯一鍵,系統(tǒng)自動(dòng)為唯一鍵建立唯一索引,從而保證了唯一鍵的唯一性。 唯一鍵允許為空,但系統(tǒng)為保證其唯一性,最多只可以出現(xiàn)一個(gè)NULL值。 UNIQUE既可用于列約束,也可用于表約束。 UNIQUE用于定義列約束時(shí),其語(yǔ)法格式如下: CONSTRAINT UNIQUE 例3.6 建立一個(gè)S表,定義SN為唯一鍵。 USE STUDENT CREATE TABLE S (SNO CHAR(6), SN CHAR(8) CONSTRAINT SN_UNIQ UNIQUE, SEX CHAR(2), AGE NUMERIC(2);,29,其中SN_UNIQ為指定的約束名稱,

21、約束名稱可以省略, 如下例: USE STUDENT CREATE TABLE S (SNO CHAR(6), SN CHAR(8) UNIQUE, SEX CHAR(2), AGE NUMERIC(2); UNIQUE用于定義表約束時(shí),其語(yǔ)法格式如下: CONSTRAINT UNIQUE(,),30,例3.7 建立一個(gè)S表,定義SN+SEX為唯一鍵。 USE STUDENT CREATE TABLE S ( SNO CHAR(5), SN CHAR(8), SEX CHAR(2), CONSTRAINT S_UNIQ UNIQUE(SN,SEX); 系統(tǒng)為SN+SEX建立唯一索引,確保同一性

22、別的學(xué)生沒(méi)有重名。 (3)PRIMARY KEY約束 PRIMARY KEY約束用于定義基本表的主鍵,起唯一標(biāo)識(shí)作用,其值不能為NULL,也不能重復(fù),以此來(lái)保證實(shí)體的完整性。,31,PRIMARY KEY與UNIQUE約束類似,通過(guò)建立唯一索引來(lái)保證基本表在主鍵列取值的唯一性,但它們之間存在著很大的區(qū)別: 在一個(gè)基本表中只能定義一個(gè)PRIMARY KEY約束,但可定義多個(gè)UNIQUE約束; 對(duì)于指定為PRIMARY KEY的一個(gè)列或多個(gè)列的組合,其中任何一個(gè)列都不能出現(xiàn)空值,而對(duì)于UNIQUE所約束的唯一鍵,則允許為空。 注意:不能為同一個(gè)列或一組列既定義UNIQUE約束,又定義PRIMARY

23、 KEY約束。 PRIMARY KEY既可用于列約束,也可用于表約束。 PRIMARY KEY用于定義列約束時(shí),其語(yǔ)法格式如下: CONSTRAINT PRIMARY KEY,32,例3.8 建立一個(gè)S表,定義SNO為S的主鍵 USE STUDENT CREATE TABLE S (SNO CHAR(5) NOT NULL CONSTRAINT S_PRIM PRIMARY KEY, SN CHAR(8), AGE NUMERIC(2); PRIMARY KEY用于定義表約束時(shí),即將某些列的組合定義為主鍵,其語(yǔ)法格式如下: CONSTRAINT S PRIMARY KEY (),33,例3.9

24、 建立一個(gè)SC表,定義SNO+CNO為SC的主鍵 USE STUDENT CREATE TABLE SC (SNO CHAR(5) NOT NULL, CNO CHAR(5) NOT NULL, SCORE NUMERIC(3), CONSTRAINT SC_PRIM PRIMARY KEY(SNO,CNO);,34,(4)FOREIGN KEY約束 FOREIGN KEY約束指定某一個(gè)列或一組列作為外部鍵,其中,包含外部鍵的表稱為從表,包含外部鍵所引用的主鍵或唯一鍵的表稱主表。 系統(tǒng)保證從表在外部鍵上的取值要么是主表中某一個(gè)主鍵值或唯一鍵值,要么取空值。以此保證兩個(gè)表之間的連接,確保了實(shí)體的

25、參照完整性。 FOREIGN KEY既可用于列約束,也可用于表約束, 其語(yǔ)法格式為: CONSTRAINT FOREIGN KEY REFERENCES (),35,例3.10 建立一個(gè)SC表,定義SNO,CNO為SC的外部鍵。 USE STUDENT CREATE TABLE SC (SNO CHAR(5) NOT NULL CONSTRAINT S_FORE FOREIGN KEY REFERENCES S(SNO), CNO CHAR(5) NOT NULL CONSTRAINT C_FORE FOREIGN KEY REFERENCES C(CNO), SCORE NUMERIC(3)

26、, CONSTRAINT S_C_PRIM PRIMARY KEY (SNO,CNO);,36,(5)CHECK約束 CHECK約束用來(lái)檢查字段值所允許的范圍,如,一個(gè)字段只能輸入整數(shù),而且限定在0-100的整數(shù),以此來(lái)保證域的完整性。 CHECK既可用于列約束,也可用于表約束, 其語(yǔ)法格式為: CONSTRAINT CHECK () 例3.10 建立一個(gè)SC表,定義SCORE 的取值范圍為0到100之間。 USE STUDENT CREATE TABLE SC (SNO CHAR(5), CNO CHAR(5), SCORE NUMERIC(5,1) CONSTRAINT SCORE_CHK

27、 CHECK(SCORE=0 AND SCORE =100);,37,例3.11 建立包含完整性定義的學(xué)生表 USE STUDENT CREATE TABLE S (SNO CHAR(6) CONSTRAINT S_PRIM PRIMARY KEY, SN CHAR(8) CONSTRAINT SN_CONS NOT NULL, AGE NUMERIC(2) CONSTRAINT AGE_CONS NOT NULL CONSTRAINT AGE_CHK CHECK (AGE BETWEEN 15 AND 50), SEX CHAR(2) DEFAULT 男, DEPT CHAR(10) CON

28、STRAINT DEPT_CONS NOT NULL);,38, 修改基本表 由于應(yīng)用環(huán)境和應(yīng)用需求的變化,經(jīng)常需要修改基本表的結(jié)構(gòu),比如,增加新列和完整性約束、修改原有的列定義和完整性約束等。 SQL語(yǔ)言使用ALTER TABLE命令來(lái)完成這一功能,有如下三種修改方式: 1. ADD方式 用于增加新列和完整性約束,定義方式同CREATE TABLE語(yǔ)句中的定義方式相同,其語(yǔ)法格式為: ALTER TABLE ADD | 例3.12 在S表中增加一個(gè)班號(hào)列和住址列。 USE STUDENT ALTER TABLE S ADD CLASS_NO CHAR(6), ADDRESS C

29、HAR(40),39,注意:使用此方式增加的新列自動(dòng)填充NULL值,所以不能為增加的新列指定NOT NULL約束 。 例3.13 在SC表中增加完整性約束定義,使SCORE在0-100之間。 USE STUDENT ALTER TABLE SC ADD CONSTRAINT SCORE_CHK CHECK(SCORE BETWEEN 0 AND 100),40,2. ALTER 方式 用于修改某些列,其語(yǔ)法格式為: ALTER TABLE ALTER COLUMN NULL|NOT NULL 例3.14 把S表中的SNO列加寬到8位字符寬度 USE STUDENT ALTER TABLE S

30、ALTER COLUMN SNO CHAR(8),41,注意:使用此方式有如下一些限制: 不能改變列名; 不能將含有空值的列的定義修改為NOT NULL約束; 若列中已有數(shù)據(jù),則不能減少該列的寬度,也不能改變其數(shù)據(jù)類型; 只能修改NULL|NOT NULL約束,其它類型的約束在修改之前必須先刪除,然后再重新添加修改過(guò)的約束定義。 3.DROP方式 刪除完整性約束定義,其語(yǔ)法格式為: ALTER TABLE DROP CONSTRAINT ,42,例3.15 刪除S表中的AGE_CHK約束 USE STUDENT ALTER TABLE S DROP CONSTRAINT AGE_CHK 3.2

31、.3.3 改變基本表的名字 使用RENAME命令,可以改變基本表的名字,其語(yǔ)法格式為: RENAME TO 例3.16 將S表的名字更改為STUDENT USE STUDENT RENAME S TO STUDENT,43, 刪除基本表 當(dāng)某個(gè)基本表無(wú)用時(shí),可將其刪除。 刪除后,該表中的數(shù)據(jù)和在此表上所建的索引都被刪除,而建立在該表上的視圖不會(huì)隨之刪除,系統(tǒng)將繼續(xù)保留其定義,但已無(wú)法使用。 如果重新恢復(fù)該表,這些視圖可重新使用。 刪除表的語(yǔ)法格式: DROP TABLE 例3.17 刪除表STUDENT USE STUDENT DROP TABLE STUDENT 注意:只能刪除

32、自己建立的表,不能刪除其他用戶所建的表。,44,3.2.5 設(shè)計(jì)、創(chuàng)建和維護(hù)索引 索引的作用 在日常生活中我們會(huì)經(jīng)常遇到索引,例如圖書目錄、詞典索引等。 借助索引,人們會(huì)很快地找到需要的東西。 索引是數(shù)據(jù)庫(kù)隨機(jī)檢索的常用手段,它實(shí)際上就是記錄的關(guān)鍵字與其相應(yīng)地址的對(duì)應(yīng)表。 例如,當(dāng)我們要在本書中查找有關(guān)“SQL查詢”的內(nèi)容時(shí),應(yīng)該先通過(guò)目錄找到“SQL查詢”所對(duì)應(yīng)的頁(yè)碼,然后從該頁(yè)碼中找出所要的信息。這種方法比直接翻閱書的內(nèi)容要快。 如果把數(shù)據(jù)庫(kù)表比作一本書,則表的索引就如書的目錄一樣,通過(guò)索引可大大提高查詢速度。 此外,在SQL SERVER中,行的唯一性也是通過(guò)建立唯一索引

33、來(lái)維護(hù)的。 索引的作用可歸納為: 1. 加快查詢速度; 2. 保證行的唯一性。,45, 索引的分類 1. 按照索引記錄的存放位置可分為聚集索引與非聚集索引 聚集索引:按照索引的字段排列記錄,并且依照排好的順序?qū)⒂涗洿鎯?chǔ)在表中。 非聚集索引:按照索引的字段排列記錄,但是排列的結(jié)果并不會(huì)存儲(chǔ)在表中,而是另外存儲(chǔ)。 2. 唯一索引的概念 唯一索引表示表中每一個(gè)索引值只對(duì)應(yīng)唯一的數(shù)據(jù)記錄, 這與表的PRIMARY KEY的特性類似,因此唯一性索引常用于PRIMARY KEY的字段上,以區(qū)別每一筆記錄。 當(dāng)表中有被設(shè)置為UNIQUE的字段時(shí),SQL SERVER會(huì)自動(dòng)建立一個(gè)非聚集的唯一性

34、索引。 而當(dāng)表中有PRIMARY KEY的字段時(shí),SQL SERVER會(huì)在PRIMARY KEY字段建立一個(gè)聚集索引。 3. 復(fù)合索引的概念 復(fù)合索引是將兩個(gè)字段或多個(gè)字段組合起來(lái)建立的索引,而單獨(dú)的字段允許有重復(fù)的值。,46, 建立索引 建立索引的語(yǔ)句是CREATE INDEX,其語(yǔ)法格式為: CREATE UNIQUE CLUSTER INDEX ON ( 次序 , 次序) UNIQUE表明建立唯一索引。 CLUSTER表示建立聚集索引。 次序用來(lái)指定索引值的排列順序,可為ASC(升序)或DESC(降序),缺省值為ASC。 例3.18 為表SC在SNO和CNO上建立唯一索引。

35、 USE STUDENT CREATE UNIQUE INDEX SCI ON SC(SNO,CNO),47,執(zhí)行此命令后,為SC表建立一個(gè)索引名為SCI的唯一索引, 此索引為SNO和CNO兩列的復(fù)合索引,即對(duì)SC表中的行先按SNO的遞增順序索引,對(duì)于相同的SNO,又按CNO的遞增順序索引。 由于有UNIQUE的限制,所以該索引在(SNO,CNO)組合列的排序上具有唯一性,不存在重復(fù)值。 例3.19 為教師表T在TN上建立聚集索引。 CREATE CLUSTER INDEX TI ON T(TN) 執(zhí)行此命令后,為T表建立一個(gè)索引名為TI的聚集索引,T表中的記錄將按照TN值的升序存放。,48,

36、注意: 1. 改變表中的數(shù)據(jù)(如增加或刪除記錄)時(shí),索引將自動(dòng)更新。 索引建立后,在查詢使用該列時(shí),系統(tǒng)將自動(dòng)使用索引進(jìn)行查詢。 2. 索引數(shù)目無(wú)限制,但索引越多,更新數(shù)據(jù)的速度越慢。對(duì)于僅用 于查詢的表可多建索引,對(duì)于數(shù)據(jù)更新頻繁的表則應(yīng)少建索引。 刪除索引 建立索引是為了提高查詢速度,但隨著索引的增多,數(shù)據(jù)更新時(shí),系統(tǒng)會(huì)花費(fèi)許多時(shí)間來(lái)維護(hù)索引。這時(shí),應(yīng)刪除不必要的索引。 刪除索引的語(yǔ)句是DROP INDEX,其語(yǔ)法格式為: DROP INDEX 數(shù)據(jù)表名.索引名 例3.20 刪除表SC的索引SCI。 DROP INDEX SC.SCI,49,3.3 SQL數(shù)據(jù)查詢,3.3.

37、1 SELECT命令的格式與基本使用 數(shù)據(jù)查詢是數(shù)據(jù)庫(kù)中最常見(jiàn)的操作。 SQL語(yǔ)言提供SELECT語(yǔ)句,通過(guò)查詢操作可得到所需的信息。 SELECT語(yǔ)句的一般格式為: SELECT列名,列名 FROM表名或視圖名,表名或視圖名 WHERE檢索條件 GROUP BY HAVING ORDER BY ASC|DESC;,50,SELECT語(yǔ)句的格式: SELECTALL|DISTINCTTOP N PERCENTWITH TIES 列名1 AS 別名1 , 列名2 AS 別名2 INTO 新表名 FROM 表名 1AS 表1別名 INNER|RIGHT|FULL|OUTEROUTERJOIN 表名

38、2 AS 表2別名 ON 條件,51,查詢的結(jié)果是仍是一個(gè)表。 SELECT語(yǔ)句的執(zhí)行過(guò)程是: 根據(jù)WHERE子句的檢索條件,從FROM子句指定的基本表或視圖中選取滿足條件的元組,再按照SELECT子句中指定的列,投影得到結(jié)果表。 如果有GROUP子句,則將查詢結(jié)果按照相同的值進(jìn)行分組。 如果GROUP子句后有HAVING短語(yǔ),則只輸出滿足HAVING條件的元組。 如果有ORDER子句,查詢結(jié)果還要按照的值進(jìn)行排序。,52,例3.21 查詢?nèi)w學(xué)生的學(xué)號(hào)、姓名和年齡。 SELECT SNO, SN, AGE FROM S 例3.22 查詢學(xué)生的全部信息。 SELECT * FROM S 用 *

39、 表示S表的全部列名,而不必逐一列出。 例3.23 查詢選修了課程的學(xué)生號(hào)。 SELECT DISTINCT SNO FROM SC 查詢結(jié)果中的重復(fù)行被去掉 上述查詢均為不使用WHERE子句的無(wú)條件查詢,也稱作投影查詢。,53,另外,利用投影查詢可控制列名的順序,并可通過(guò)指定別名改變查詢結(jié)果的列標(biāo)題的名字。 例3.24 查詢?nèi)w學(xué)生的姓名、學(xué)號(hào)和年齡。 SELECT SNAME NAME, SNO, AGE FROM S 其中,NAME為SNAME的別名,54,3.3.2條件查詢 當(dāng)要在表中找出滿足某些條件的行時(shí),則需使用WHERE子句指定查詢條件。 WHERE子句中,條件通常通過(guò)三部分來(lái)描

40、述: 1 列名; 2 比較運(yùn)算符; 3 列名、常數(shù)。,表3.8 常用的比較運(yùn)算符,55, 比較大小 例3.25 查詢選修課程號(hào)為C1的學(xué)生的學(xué)號(hào)和成績(jī)。 SELECT SNO,SCORE FROM SC WHERE CNO=C1 例3.26 查詢成績(jī)高于85分的學(xué)生的學(xué)號(hào)、課程號(hào)和成績(jī)。 SELECT SNO,CNO,SCORE FROM SC WHERE SCORE85,56, 多重條件查詢 當(dāng)WHERE子句需要指定一個(gè)以上的查詢條件時(shí),則需要使用邏輯運(yùn)算符AND、OR和NOT將其連結(jié)成復(fù)合的邏輯表達(dá)式。 其優(yōu)先級(jí)由高到低為:NOT、AND、OR,用戶可以使用括號(hào)

41、改變優(yōu)先級(jí)。 例3.27 查詢選修C1或C2且分?jǐn)?shù)大于等于85分學(xué)生的的學(xué)號(hào)、課程號(hào)和成績(jī)。 SELECT SNO,CNO,SCORE FROM SC WHERE(CNO=C1 OR CNO=C2) AND SCORE=85,57, 確定范圍 例3.28 查詢工資在1000至1500之間的教師的教師號(hào)、姓名及職稱。 SELECT TNO,TN,PROF FROM T WHERE SAL BETWEEN 1000 AND 1500 等價(jià)于 SELECT TNO,TN,PROF FROM T WHERE SAL=1000 AND SAL=1500,58,例3.29 查詢工資不在100

42、0至1500之間的教師的教師號(hào)、姓名及職稱。 SELECT TNO,TN,PROF FROM T WHERE SAL NOT BETWEEN 1000 AND 1500 確定集合 利用“IN”操作可以查詢屬性值屬于指定集合的元組。 例3.30 查詢選修C1或C2的學(xué)生的學(xué)號(hào)、課程號(hào)和成績(jī)。 SELECT SNO, CNO, SCORE FROM SC WHERE CNO IN(C1, C2) 此語(yǔ)句也可以使用邏輯運(yùn)算符“OR”實(shí)現(xiàn)。,59,SELECT SNO, CNO, SCORE FROM SC WHERE CNO=C1 OR CNO= C2 利用“NOT IN”可以查詢指

43、定集合外的元組。 例3.31 查詢沒(méi)有選修C1,也沒(méi)有選修C2的學(xué)生的學(xué)號(hào)、課程號(hào)和成績(jī)。 SELECT SNO, CNO, SCORE FROM SC WHERE CNO NOT IN(C1, C2) 等價(jià)于: SELECT SNO, CNO, SCORE FROM SC WHERE CNO!=C1 AND CNO!= C2,60, 部分匹配查詢 上例均屬于完全匹配查詢,當(dāng)不知道完全精確的値時(shí),用戶還可以使用LIKE或NOT LIKE進(jìn)行部分匹配查詢(也稱模糊查詢)。 LIKE定義的一般格式為: LIKE 屬性名必須為字符型,字符串常量的字符可以包含如下兩個(gè)特殊符號(hào): %:表示

44、任意知長(zhǎng)度的字符串; _:表示任意單個(gè)字符。 例3.32 查詢所有姓張的教師的教師號(hào)和姓名。 SELECT TNO, TN FROM T WHERE TN LIKE 張%,61,例3.33 查詢姓名中第二個(gè)漢字是“力”的教師號(hào)和姓名。 SELECT TNO, TN FROM T WHERE TN LIKE _ _力% 注:一個(gè)漢字占兩個(gè)字符。 空值查詢 某個(gè)字段沒(méi)有值稱之為具有空值(NULL)。 通常沒(méi)有為一個(gè)列輸入值時(shí),該列的值就是空值。 空值不同于零和空格,它不占任何存儲(chǔ)空間。 例如,某些學(xué)生選課后沒(méi)有參加考試,有選課記錄,但沒(méi)有考試成績(jī),考試成績(jī)?yōu)榭罩?,這與參加考試,成績(jī)?yōu)?/p>

45、零分的不同。,62,例3.34 查詢沒(méi)有考試成績(jī)的學(xué)生的學(xué)號(hào)和相應(yīng)的課程號(hào)。 SELECT SNO, CNO FROM SC WHERE SCORE IS NULL 注意:這里的空值條件為IS NULL,不能寫成SCORE=NULL。,63,3.2.2常用庫(kù)函數(shù)及統(tǒng)計(jì)匯總查詢 SQL提供了許多庫(kù)函數(shù),增強(qiáng)了基本檢索能力。 常用的庫(kù)函數(shù),如表3.2所示,64,例3.35 求學(xué)號(hào)為S1學(xué)生的總分和平均分。 SELECT SUM(SCORE) AS TotalScore, AVG(SCORE) AS AveScore FROM SC WHERE (SNO = S1) 注意:函數(shù)SUM和AVG只能對(duì)數(shù)

46、值型字段進(jìn)行計(jì)算。,65,例3.36 求選修C1號(hào)課程的最高分、最低分及之間相差的分?jǐn)?shù) SELECT MAX(SCORE) AS MaxScore, MIN(SCORE) AS MinScore, MAX(SCORE) - MIN(SCORE) AS Diff FROM SC WHERE (CNO = C1) 例3.37 求計(jì)算機(jī)系學(xué)生的總數(shù) SELECT COUNT(SNO) FROM S WHERE DEPT=計(jì)算機(jī),66,例3.38 求學(xué)校中共有多少個(gè)系 SELECT COUNT(DISTINCT DEPT) AS DeptNum FROM S 注意:加入關(guān)鍵字DISTINCT后表示消去

47、重復(fù)行,可計(jì)算字段“DEPT“不同值的數(shù)目。 COUNT函數(shù)對(duì)空值不計(jì)算,但對(duì)零進(jìn)行計(jì)算。 例3.39 統(tǒng)計(jì)有成績(jī)同學(xué)的人數(shù) SELECT COUNT (SCORE) FROM SC 上例中成績(jī)?yōu)榱愕耐瑢W(xué)計(jì)算在內(nèi),沒(méi)有成績(jī)(即為空值)的不計(jì)算。,67,例3.40 利用特殊函數(shù)COUNT(*)求計(jì)算機(jī)系學(xué)生的總數(shù) SELECT COUNT(*) FROM S WHERE DEPT=計(jì)算機(jī) COUNT(*)用來(lái)統(tǒng)計(jì)元組的個(gè)數(shù) 不消除重復(fù)行,不允許使用DISTINCT關(guān)鍵字。,68,3.3.3 分組查詢 GROUP BY子句可以將查詢結(jié)果按屬性列或?qū)傩粤薪M合在行的方向上進(jìn)行分組,每組在屬性列或?qū)傩粤?/p>

48、組合上具有相同的值。 例3.42 查詢各位教師的教師號(hào)及其任課的門數(shù)。 SELECT TNO,COUNT(*) AS C_NUM FROM TC GROUP BY TNO GROUP BY子句按TNO的值分組,所有具有相同TNO的元組為一組,對(duì)每一組使用函數(shù)COUNT進(jìn)行計(jì)算,統(tǒng)計(jì)出各位教師任課的門數(shù)。,69,若在分組后還要按照一定的條件進(jìn)行篩選,則需使用HAVING子句。 例3.43 查詢選修兩門以上課程的學(xué)生學(xué)號(hào)和選課門數(shù) SELECT SNO,COUNT(*) AS SC_NUM FROM SC GROUP BY SNO HAVING COUNT(*)=2 GROUP BY子句按SNO的

49、值分組,所有具有相同SNO的元組為一組,對(duì)每一組使用函數(shù)COUNT進(jìn)行計(jì)算,統(tǒng)計(jì)出每位學(xué)生選課的門數(shù)。 HAVING子句去掉不滿足COUNT(*)=2的組。,70,當(dāng)在一個(gè)SQL查詢中同時(shí)使用WHERE子句,GROUP BY 子句和HAVING子句時(shí),其順序是WHEREGROUP BY HAVING。 WHERE與HAVING子句的根本區(qū)別在于作用對(duì)象不同。 WHERE子句作用于基本表或視圖,從中選擇滿足條件的元組; HAVING子句作用于組,選擇滿足條件的組,必須用于GROUP BY子句之后,但GROUP BY子句可沒(méi)有HAVING子句。,71,3.3.5 查詢的排序 當(dāng)需要對(duì)查詢結(jié)果排序時(shí)

50、,應(yīng)該使用ORDER BY子句 ORDER BY子句必須出現(xiàn)在其他子句之后 排序方式可以指定,DESC為降序,ASC為升序,缺省時(shí)為升序 例3.44 查詢選修C1 的學(xué)生學(xué)號(hào)和成績(jī),并按成績(jī)降序排列。 SELECT SNO, SCORE FROM SC WHERE CNO=C1 ORDER BY SCORE DESC,72,例3.45 查詢選修C2、C3、C4或C5課程的學(xué)號(hào)、課程號(hào)和成績(jī),查詢結(jié)果按學(xué)號(hào)升序排列,學(xué)號(hào)相同再按成績(jī)降序排列。 SELECT SNO,CNO, SCORE FROM SC WHERE CNO IN (C2 ,C3, C4,C5) ORDER BY SNO,SCORE

51、 DESC 例3.46 求選課在三門以上且各門課程均及格的學(xué)生的學(xué)號(hào)及其總成績(jī),查詢結(jié)果按總成績(jī)降序列出。 SELECT SNO,SUM(SCORE) AS TotalScore FROM SC WHERE SCORE=60 GROUP BY SNO HAVING COUNT(*)=3 ORDER BY SUM(SCORE) DESC,73,此語(yǔ)句為分組排序,執(zhí)行過(guò)程如下: 1.(FROM)取出整個(gè)SC 2.(WHERE)篩選SCORE=60的元組 3.(GROUP BY)將選出的元組按SNO分組 4.(HAVING)篩選選課三門以上的分組 5.(SELECT)以剩下的組中提取學(xué)號(hào)和總成績(jī) 6

52、.(ORDER BY)將選取結(jié)果排序 ORDER BY SUM(SCORE) DESC 可以改寫成 ORDER BY 2 DESC 2 代表查詢結(jié)果的第二列。,74,3.3.6 數(shù)據(jù)表連接及連接查詢 數(shù)據(jù)表之間的聯(lián)系是通過(guò)表的字段值來(lái)體現(xiàn)的,這種字段稱為連接字段。 連接操作的目的就是通過(guò)加在連接字段的條件將多個(gè)表連接起來(lái),以便從多個(gè)表中查詢數(shù)據(jù)。 前面的查詢都是針對(duì)一個(gè)表進(jìn)行的,當(dāng)查詢同時(shí)涉及兩個(gè)以上的表時(shí),稱為連接查詢。 表的連接方法有兩種: 方法1:表之間滿足一定的條件的行進(jìn)行連接,此時(shí)FROM子句中指明進(jìn)行連接的表名,WHERE子句指明連接的列名及其連接條件。 方法2:利用關(guān)鍵字JOIN

53、進(jìn)行連接。,75,具體分為以下幾種: INNER JOIN :顯示符合條件的記錄,此為默認(rèn)值; LEFT (OUTER) JOIN:顯示符合條件的數(shù)據(jù)行以及左邊表中不符合條件的數(shù)據(jù)行,此時(shí)右邊數(shù)據(jù)行會(huì)以NULL來(lái)顯示,此稱為左連接; RIGHT (OUTER) JOIN:顯示符合條件的數(shù)據(jù)行以及右邊表中不符合條件的數(shù)據(jù)行,此時(shí)左邊數(shù)據(jù)行會(huì)以NULL來(lái)顯示,此稱為右連接; FULL (OUTER) JOIN:顯示符合條件的數(shù)據(jù)行以及左邊表和右邊表中不符合條件的數(shù)據(jù)行,此時(shí)缺乏數(shù)據(jù)的數(shù)據(jù)行會(huì)以NULL來(lái)顯示; CROSS JOIN:會(huì)將一個(gè)表的每一筆數(shù)據(jù)和另一表的每筆數(shù)據(jù)匹配成新的數(shù)據(jù)行。 當(dāng)將J

54、OIN 關(guān)鍵詞放于FROM子句中時(shí),應(yīng)有關(guān)鍵詞ON與之相對(duì)應(yīng),以表明連接的條件。,76, 等值連接與非等值連接 例3.47 查詢劉偉老師所講授的課程。 方法1: SELECT T.TNO ,TN,CNO FROM T,TC WHERE (T.TNO = TC. TNO) AND (TN=劉偉) 這里,TN=劉偉為查詢條件,而T.TNO = TC.TNO 為連接條件,TNO為連接字段。連接條件的一般格式為: . . 其中,比較運(yùn)算符主要有:、!。 當(dāng)比較運(yùn)算符為“時(shí),稱為等值連接,其他情況為非等值連接。,77,引用列名TNO時(shí)要加上表名前綴,是因?yàn)閮蓚€(gè)表中的列名相同,必須用表名前綴

55、來(lái)確切說(shuō)明所指列屬于哪個(gè)表,以避免二義性。如果列名是唯一的,比如TN,就不必須加前綴。 上面的操作是將T表中的TNO 和TC表中的TNO相等的行連接,同時(shí)選取TN為“劉偉“的行,然后再在TN,CNO列上投影,這是連接、選取和投影的操作組合。 方法2: SELECT T.TNO,TN,CNO FROM T INNER JOIN TC ON T.TNO=TC.TNO AND T.TN=劉偉,78,方法3: SELECT R2.TNO,R2.TN, R1.CNO FROM (SELECT TNO,CNO FROM TC ) AS R1 INNER JOIN (SELECT TNO ,TN FROM

56、T WHERE TN=劉偉) AS R2 ON R1.TNO=R2.TNO,79,例3.48 查詢所有選課學(xué)生的學(xué)號(hào)、姓名、選課名稱及成績(jī)。 SELECT S.SNO,SN,CN,SCORE FROM S,C,SC WHERE S.SNO=SC.SNO AND SC.CNO=C.CNO 本例涉及三個(gè)表,WHERE子句中有兩個(gè)連接條件。當(dāng)有兩個(gè)以上的表進(jìn)行連接時(shí),稱為多表連接。,80, 自身連接 當(dāng)一個(gè)表與其自已進(jìn)行連接操作時(shí),稱為表的自身連接。 例3.49 查詢所有比劉偉工資高的教師姓名、性別、工資和劉偉的工資。 要查詢的內(nèi)容均在同一表T中,可以將表T分別取兩個(gè)別名,一個(gè)是X,一

57、個(gè)是Y。將X, Y 中滿足比劉偉工資高的行連接起來(lái)。這實(shí)際上是同一表T的自身連接。 方法1: SELECT X.TN,X.SAL AS SAL_a,Y.SAL AS SAL_b FROM T AS X ,T AS Y WHERE X.SALY.SAL AND Y.TN=劉偉,81,方法2: SELECT X.TN, X.SAL,Y.SAL FROM T AS X INNER JOIN T AS Y ON X.SALY.SAL AND Y.TN=劉偉 方法3: SELECT R1.TN,R1.SAL, R2.SAL FROM (SELECT TN,SAL FROM T ) AS R1 INNER

58、 JOIN (SELECT SAL FROM T WHERE TN=劉偉) AS R2 ON R1.SALR2.SAL,82,例3.50 檢索所有學(xué)生姓名,年齡和選課名稱。 方法1: SELECT SN,AGE,CN FROM S,C,SC WHERE S.SNO=SC.SNO AND SC.CNO=C.CNO 方法2: SELECT R3.SNO,R3.SN,R3.AGE,R4.CN FROM (SELECT SNO,SN,AGE FROM S) AS R3 INNER JOIN (SELECT R2.SNO,R1.CN FROM (SELECT CNO,CN FROM C) AS R1 I

59、NNER JOIN (SELECT SNO,CNO FROM SC) AS R2 ON R1.CNO=R2.CNO) AS R4 ON R3.SNO=R4.SNO,83, 外連接 在上面的連接操作中,不滿足連接條件的元組不能作為查詢結(jié)果輸出。 如例3.48的查詢結(jié)果只包括有選課記錄的學(xué)生,而不會(huì)有吳麗同學(xué)的信息。若將例3.48改成: 例3.51 查詢所有學(xué)生的學(xué)號(hào)、姓名、選課名稱及成績(jī)。(沒(méi)有選課的同學(xué)的選課信息顯示為空)則應(yīng)寫成如下的SQL語(yǔ)句。 SELECT S.SNO,SN,CN,SCORE FROM S LEFT OUTER JOIN SC ON S.SNO=SC.SNO LEFT OUTER JOIN C ON C.CNO=SC.CNO 則查詢結(jié)果只包括所有的學(xué)生,沒(méi)有選課的吳麗同學(xué)的選課信息顯示為空。,84,3.3.7 子查詢 在WHERE子句中包含一個(gè)形如SELECT-FROM-WHERE的查詢塊,此查詢塊稱為子查詢或嵌套查詢,包含子查詢的語(yǔ)句稱為父查詢或外部查詢。 嵌套查詢可以將一系列簡(jiǎn)單查詢構(gòu)成復(fù)雜查詢,增強(qiáng)查詢能力。 子查詢的嵌套層次最多可達(dá)到255層,以層層嵌套的方式構(gòu)造查詢充分體現(xiàn)

溫馨提示

  • 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)論