《數(shù)據(jù)庫SQL語言》PPT課件.ppt
《《數(shù)據(jù)庫SQL語言》PPT課件.ppt》由會員分享,可在線閱讀,更多相關(guān)《《數(shù)據(jù)庫SQL語言》PPT課件.ppt(144頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、1,第3章 SQL語言,2,本章概要,SQL是結(jié)構(gòu)化查詢語言(Structured Query Language)的縮寫,其功能包括數(shù)據(jù)查詢、數(shù)據(jù)操縱、數(shù)據(jù)定義和數(shù)據(jù)控制四個部分。 SQL 語言簡潔、方便實用、功能齊全,已成為目前應用最廣的關(guān)系數(shù)據(jù)庫語言。 本章要求 了解 SQL語言的特點, 掌握SQL語言的四大功能及使用方法, 重點掌握其數(shù)據(jù)查詢功能及其使用。,3,3.1 SQL語言的基本概念與特點,實例1:大一新生報到時需要經(jīng)歷一系列的報到流程,其中包括建立學生信息數(shù)據(jù)庫,以下是學生信息數(shù)據(jù)庫建立的過程,,這里,我們假設(shè)建立的是一個關(guān)系數(shù)據(jù)庫,新生數(shù)據(jù)即是一個二維表,那么學生表的結(jié)構(gòu)是什
2、么?包含什么內(nèi)容?,4,3.1 SQL語言的基本概念與特點,3.1.1 SQL語言的發(fā)展及標準化 3.1.1.1 SQL語言發(fā)展史 SQL語言是當前最為成功、應用最為廣泛的關(guān)系數(shù)據(jù)庫語言,其發(fā)展主要經(jīng)歷了以下幾個階段: 1974年由CHAMBERLIN和BOYEE提出,當時稱為SEQUEL(STUCTURED ENGLISH QUERY LANGUAGE); IBM公司對其進行了修改,并用于其SYSTEM R關(guān)系數(shù)據(jù)庫系統(tǒng)中; 1981年 IBM推出其商用關(guān)系關(guān)系數(shù)據(jù)庫SQL/DS,并將其名字改為SQL,由于SQL語言功能強大,簡潔易用,因此得到了廣泛的使用; 今天廣泛應用于各種大型數(shù)據(jù)
3、庫,如SYBASE、INFORMIX、 ORACLE、DB2、INGRES等,也用于各種小型數(shù)據(jù)庫,如FOXPRO、ACCESS。,5,3.1.1.2 SQL語言標準化 隨著關(guān)系數(shù)據(jù)庫系統(tǒng)和SQL語言應用的日益廣泛,SQL語言的標準化工作也在緊張革進行著,十多年來已制訂了多個SQL標準; 1. 1982年,美國國家標準化局(AMERICAN NATIONAL STANDARD INSTITUTE,簡稱ANSI)開始制定SQL標準; 2. 1986年,美國國家標準化協(xié)會公布了SQL語言的第一個標準SQL86; 3. 1987年,國際標準化組織(ISO)通過了SQL86標準; 4. 1989
4、年,國際標準化組織(ISO)對SQL86進行了補充,推出了SQL89標準; 5. 1992年,ISO又推出了SQL92標準,也稱為SQL2; 6.SQL/99:Core level跟其他8種相應的level,包括遞歸查詢,程序跟流程控制,基本的對象(object)支持包括oids; 7.SQL/2003:包含了XML相關(guān)內(nèi)容,自動生成列值(column values); 8.2005-09-30:“Data is the next generation inside...SQL is the new HTML”! Tim Oeilly提出了Web 2.0理念,稱數(shù)據(jù)將是核心,SQL將成為“新的
5、HTML; 9.SQL/2006:定義了SQL與XML(包含XQuery)的關(guān)聯(lián)應用; 10.2006:Sun公司將以SQL基礎(chǔ)的數(shù)據(jù)庫管理系統(tǒng)嵌入Java V6; 11.2007 :SQL Server 2008(Katmi)在過去的SQL2005基礎(chǔ)上增強了它的安全性,主要在:簡單的數(shù)據(jù)加密,外鍵管理,增強了審查,改進了數(shù)據(jù)庫鏡像,加強了可支持性。,6,3.1.2 SQL語言的基本概念 首先介紹兩個基本概念:基本表和視圖。 基本表(BASE TABLE):是獨立存在的表,不是由其它的表導出的表。一個關(guān)系對應一個基本表,一個或多個基本表對應一個存儲文件。 視圖(VIEW):是一個虛擬的表,是
6、從一個或幾個基本表導出的表。它本身不獨立存在于數(shù)據(jù)庫中,數(shù)據(jù)庫中只存放視圖的定義而不存放視圖對應的數(shù)據(jù),這些數(shù)據(jù)仍存放在導出視圖的基本表中。當基本表中的數(shù)據(jù)發(fā)生變化時,從視圖中查詢出來的數(shù)據(jù)也隨之改變。,7,例如:學生數(shù)據(jù)庫中有學生基本情況表STUDENT(SNO,SNAME,SSEX,SAGE,SDEPT),此表為基本表,對應一個存儲文件??梢栽谄浠A(chǔ)上定義一個男生基本情況表STUDENT_MALE(SNO,SNAME,SAGE,SDEPT), 它是從STUDENT中選擇SSEX=男的各個行,然后在SNO,SNAME,SAGE,SDEPT上投影得到的。 在數(shù)據(jù)庫中只存有STUDENT_MAL
7、E的定義,而STUDENT_MALE的記錄不重復存儲。 在用戶看來,視圖是通過不同路徑去看一個實際表,就象一個窗口一樣,我們通過窗戶去看外面的高樓,可以看到高樓的不同部分,而透過視圖可以看到數(shù)據(jù)庫中自己感興趣的內(nèi)容。,8,圖3.1 SQL語言支持的關(guān)系數(shù)據(jù)庫的三級邏輯結(jié)構(gòu),SQL語言支持數(shù)據(jù)庫的三級模式結(jié)構(gòu),如圖3.1所示。其中外模式對應于視圖和部分基本表,模式對應于基本表,內(nèi)模式對應于存儲文件。,9,3.1.3 SQL語言的主要特點 1.綜合統(tǒng)一。 SQL語言具有:數(shù)據(jù)查詢(QUERY);數(shù)據(jù)定義(DEFINITION) 數(shù)據(jù)操縱(MANIPULATION);數(shù)據(jù)控制(CONTROL)
8、四種語言一體化的功能。 2.高度非過程化 即用戶只要提出“干什么”即可,不必管具體操作過程,也不必了解數(shù)據(jù)的存取路徑,只要指明所需的數(shù)據(jù)即可。 3.面向集合的操作方式 SQL語言是一種面向集合的語言,每個命令的操作對象是一個或多個關(guān)系,結(jié)果也是一個關(guān)系。 4.以同一種語法結(jié)構(gòu)提供兩種使用方式 SQL語言既是自含式語言,又是嵌入式語言??瑟毩⑹褂?,也可嵌入到宿主語言中。 自含式語言可以獨立使用交互命令,適用于終端用戶、應用程序員和DBA; 嵌入式語言使其嵌入在高級語言中使用,供應用程序員開發(fā)應用程序。,10,主要特點 (5)語言簡潔、易學易用:核心功能只有8個動詞,語法簡單,接近英語,11
9、,3.2 SQL數(shù)據(jù)定義,SQL語言使用數(shù)據(jù)定義語言(DATA DEFINITION LANGUAGE,簡稱DDL)實現(xiàn)其數(shù)據(jù)定義功能,可對數(shù)據(jù)庫用戶、基本表、視圖、索引進行定義和撤消。,12,3.2 SQL數(shù)據(jù)定義,3.2.1 字段數(shù)據(jù)類型 當用SQL語句定義表時,需要為表中的每一個字段設(shè)置一個數(shù)據(jù)類型,用來指定字段所存放的數(shù)據(jù)是整數(shù)、字符串、貨幣或是其它類型的數(shù)據(jù)。 SQL SERVER 的數(shù)據(jù)類型有很多種,分為以下9類: 1. 整數(shù)數(shù)據(jù)類型:依整數(shù)數(shù)值的范圍大小,有BIT, INT , SMALLINT, TINYINT四種。 2. 精確數(shù)值類型:用來定義可帶小數(shù)部分的數(shù)字,有NUMER
10、IC和DECIMAL兩種。二者相同,但建議使用DECIMAL。如:123.0、8000.56,13,3. 近似浮點數(shù)值數(shù)據(jù)類型:當數(shù)值的位數(shù)太多時,可用此數(shù)據(jù)類型來取其近似值,用FLOAT和REAL兩種。如:1.23E+10 4. 日期時間數(shù)據(jù)類型:用來表示日期與時間,依時間范圍與精確程度可分為DATETIME與SMALLDATETIME兩種。如:1998-06-08 15:30:00 5. 字符串數(shù)據(jù)類型:用來表示字符串的字段。包括:CHAR, VARCHAR, TEXT三種,如:“數(shù)據(jù)庫” 6. UNICODE字符串數(shù)據(jù)類型:UNICODE是雙字節(jié)文字編碼標準,包括NCHAR, NVARC
11、HAR與NTEXT三種。與字符串數(shù)據(jù)類型相類似,但UNICODE的一個字符用2字節(jié)存儲,而一般字符數(shù)據(jù)用一個字節(jié)存儲。 7. 二進制數(shù)據(jù)類型:用來定義二進制碼的數(shù)據(jù)。有:BINARY, VARBINARY,IMAGE 三種,通常用十六進制表示:如:OX5F3C,14,8. 貨幣數(shù)據(jù)類型:用來定義與貨幣有關(guān)的數(shù)據(jù),分為MONEY 與SMALLMONEY兩種,如:123.0000 9. 標記數(shù)據(jù)類型:有UNIQUEIDENTIFIER ,TIMESTAMP兩種,此數(shù)據(jù)類型通常系統(tǒng)自動產(chǎn)生,而不是用戶輸入的,TIMESTAMP記錄數(shù)據(jù)更新的時間戳印,而UNIQUEIDENTIFIER用來識別每一筆數(shù)
12、據(jù)的唯一性。 各種數(shù)據(jù)類型的有關(guān)規(guī)定如下表:,15,16,17,18,3.2.2 定義、修改和撤消數(shù)據(jù)庫的用戶 3.2.2.1 建立數(shù)據(jù)庫用戶 數(shù)據(jù)庫用戶是指能夠登錄到數(shù)據(jù)庫,并能夠?qū)?shù)據(jù)庫進行存取操作的用戶。 當SQL SERVER系統(tǒng)安裝完畢后,數(shù)據(jù)庫管理員就可以通過CREATE USER語句建立其他數(shù)據(jù)庫用戶了。 語法格式為: CREATE USER IDENTIFIED BY 指定數(shù)據(jù)庫用戶的帳號名字,即用戶標識符, 指用戶登錄到數(shù)據(jù)庫系統(tǒng)時使用的口令, 這里的用戶名和口令可以與用戶登錄到操作系統(tǒng)時所使用的用戶名和口令不同。,19,例3.1 建立一個新用戶,其名稱為ZHANGSAN,登
13、錄口令為123。 CREATE USER ZHANGSAN IDENTIFIED BY 123 3.2.2.2 更改數(shù)據(jù)庫用戶的口令 數(shù)據(jù)庫用戶最初的口令是由數(shù)據(jù)庫管理員指定的,數(shù)據(jù)庫用戶可以用ALTER USER命令來更改它, ALTER USER語句的基本語法格式為: ALTER USER IDENTIFIED BY 例3.2 將用戶ZHANGSAN的口令改為456。 ALTER USER ZHANGSAN IDENTIFIED BY 456,20,3.2.2.3 刪除用戶 隨著數(shù)據(jù)庫應用的發(fā)展和變化,數(shù)據(jù)庫的用戶也會發(fā)生變化。 如果某些數(shù)據(jù)庫用戶不再需要使用數(shù)據(jù)庫,數(shù)據(jù)庫管理員就可以使
14、用DROP USER把該用戶刪掉, DROP USER 語句的基本語法格式為: DROP USER 例3.3 刪除用戶ZHANGSAN DROP USER ZHANGSAN 注意:刪除數(shù)據(jù)庫用戶之前應首先刪除該用戶建立的數(shù)據(jù)庫對象,包括基本表、視圖、索引等,否則系統(tǒng)將不允許刪除這個用戶。,21,3.2.2 建立數(shù)據(jù)庫 CREATE DATABASE 3.2.3 創(chuàng)建、修改和刪除數(shù)據(jù)表 3.2.3.1 創(chuàng)建數(shù)據(jù)表 數(shù)據(jù)表是關(guān)系數(shù)據(jù)庫的基本組成單位,它物理地存儲于數(shù)據(jù)庫的存儲文件中。 1. 創(chuàng)建一個數(shù)據(jù)表時主要包括以下幾個組成部分: (1)字段名(列名):字段名可長達128個字符。字段名可包含中文
15、、英文字母、下劃線、#號、貨幣符號(¥)及AT符號()。同一表中不許有重名列; (2)字段數(shù)據(jù)類型:見表3.2; (3)字段的長度、精度和小數(shù)位數(shù);,22,字段的長度:指字段所能容納的最大數(shù)據(jù)量,但對不同的數(shù)據(jù)類型來說,長度對字段的意義可能有些不同。 對字符串與UNICODE數(shù)據(jù)類型而言,長度代表字段所能容納的字符的數(shù)目,因此它會限制用戶所能輸入的文本長度。 對數(shù)值類的數(shù)據(jù)類型而言,長度則代表字段使用多少個字節(jié)來存放數(shù)字。 對BINARY、VARBINARY、IMAGE數(shù)據(jù)類型而言,長度代表字段所能容納的字節(jié)數(shù)。 精度和小數(shù)位數(shù) 精度是指數(shù)中數(shù)字的位數(shù),包括小數(shù)點左側(cè)的整數(shù)部分和小數(shù)點右側(cè)的小
16、數(shù)部分; 小數(shù)位數(shù)則是指數(shù)字小數(shù)點右側(cè)的位數(shù)。 例如:數(shù)字12345.678,其精度為8,小數(shù)位數(shù)為3; 所以只有數(shù)值類的數(shù)據(jù)類型才有必要指定精度和小數(shù)位數(shù)。,23,經(jīng)常以如下所示的格式來表示數(shù)據(jù)類型以及它所采用的長度、精度和小數(shù)位數(shù),其中的N代表長度,P代表精度,S表示小數(shù)位數(shù)。 BINARY(N) -------- BINARY(10) CHAR(N) -------- CHAR(20) NUMERIC(P,S) ------- NUMERIC(8,3) 但有的數(shù)據(jù)類型的精度與小數(shù)位數(shù)是固定的,對采用此類數(shù)據(jù)類型的字段而言,不需設(shè)置精度與小數(shù)位數(shù), 如:如果某字段采用INT數(shù)據(jù)類型,其長
17、度固定是4,精度固定是10,小數(shù)位數(shù)則固定是0,這表示字段將能存放10位數(shù)沒有小數(shù)點的整數(shù)。存儲大小則是4個字節(jié)。 (4)NULL值與DEFAULT值 DEFAULT值表示某一字段的默認值,當沒有輸入數(shù)據(jù)時,則使用此默認的值。,24,2. 創(chuàng)建數(shù)據(jù)表的SQL語法格式 在SQL語言中,使用語句CREATE TABLE創(chuàng)建數(shù)據(jù)表,其基本語法格式為: CREATE TABLE (,|) 是合法標識符,最多可有128個字符,如S,SC,C,不允許重名。 :DEFAULT DEFAULT:若是某字段設(shè)置有默認值,當該字段未被輸入數(shù)據(jù)時,則以該默認值自動填入該字段。,25,例3.4 建立一學生表 CREA
18、TE TABLE S (SNO CHAR(8) , SN VARCHAR(20), AGE INT, SEX CHAR(2) DEFAULT 男 , DEPT VARCHAR(20)); 執(zhí)行該語句后,便產(chǎn)生了學生基本表的表框架,此表為一個空表。 其中,SEX列的缺省值為“男”。,26,,實例2: 設(shè)某商業(yè)集團數(shù)據(jù)庫中有三個實體集。一是“倉庫”實體集,屬性有倉庫號、倉庫名和地址等;二是“商店”實體集,屬性有商店號、商店名、地址等;三是“商品”實體集,屬性有商品號、商品名、單價。 1.創(chuàng)建倉庫表,商店表,商品表。,27,實例2: 設(shè)某商業(yè)集團數(shù)據(jù)庫中有三個實體集。一是“倉庫”實體集,屬性
19、有倉庫號、倉庫名和地址等;二是“商店”實體集,屬性有商店號、商店名、地址等;三是“商品”實體集,屬性有商品號、商品名、單價。 設(shè)倉庫與商品之間存在“庫存”聯(lián)系,每個倉庫可存儲若干種商品,每種商品存儲在若干倉庫中,每個倉庫每存儲一種商品有個日期及存儲量,它的關(guān)系模式是:庫存(倉庫號,商品號,日期,庫存量); 1.使用SQL創(chuàng)建倉庫表,商店表,商品表以及庫存表。 2.要求倉庫表中倉庫號為主鍵,倉庫地址唯一。 商店表中商店號為主鍵,商店名不能為空值。 商品表中商品號為主鍵,單價大于0。,28,3. 定義完整性約束 在SQL SERVER中,對于基本表的約束分為列約束和表約束。 列約
20、束是對某一個特定列的約束,包含在列定義中,直接跟在該列的其他定義之后,用空格分隔,不必指定列名; 表約束與列定義相互獨立,不包括在列定義中,通常用于對多個列一起進行約束,與列定義用,分隔,定義表約束時必須指出要約束的那些列的名稱。完整性約束的基本語法格式為: CONSTRAINT 約束名:約束不指定名稱時,系統(tǒng)會給定一個名稱。,29,約束類型:在定義完整性約束時必須指定完整性約束的類型。 在SQL SERVER中可以定義五種類型的完整性約束,下面分別加以介紹: (1)NULL/NOT NULL 是否允許該字段的值為NULL。 NULL值不是0也不是空白,更不是填入字符串“NULL”,而是表示“
21、不知道”、“不確定”或“沒有數(shù)據(jù)”的意思。 當某一字段的值一定要輸入才有意義的時候,則可以設(shè)置為NOT NULL。 如主鍵列就不允許出現(xiàn)空值,否則就失去了唯一標識一條記錄的作用 只能用于定義列約束, 其語法格式如下: CONSTRAINT NULL|NOT NULL,30,例3.5 建立一個S表,對SNO字段進行NOT NULL約束。 CREATE TABLE S (SNO CHAR(10) CONSTRAINT S_CONS NOT NULL, SN VARCHAR(20), AGE INT, SEX CHAR(2) DEFAULT 男 , DEPT VARCHAR(20)); 當SNO為空
22、時,系統(tǒng)給出錯誤信息,無NOT NULL約束時,系統(tǒng)缺省為NULL。 其中S_CONS為指定的約束名稱,當約束名稱省略時,系統(tǒng)自動產(chǎn)生一個名字。如下列功能同上,只是省略約束名稱。,31,CREATE TABLE S (SNO CHAR(10) NOT NULL , SN VARCHAR(20), AGE INT, SEX CHAR(2) DEFAULT 男 , DEPT VARCHAR(20));,32,(2)UNIQUE約束 UNIQUE約束用于指明基本表在某一列或多個列的組合上的取值必須唯一。 定義了UNIQUE約束的那些列稱為唯一鍵,系統(tǒng)自動為唯一鍵建立唯一索引,從而保證了唯一鍵的唯一性
23、。 唯一鍵允許為空,但系統(tǒng)為保證其唯一性,最多只可以出現(xiàn)一個NULL值。 UNIQUE既可用于列約束,也可用于表約束。 UNIQUE用于定義列約束時,其語法格式如下: CONSTRAINT UNIQUE 例3.6 建立一個S表,定義SN為唯一鍵。 CREATE TABLE S (SNO CHAR(6), SN CHAR(8) CONSTRAINT SN_UNIQ UNIQUE, SEX CHAR(2), AGE NUMERIC(2));,33,其中SN_UNIQ為指定的約束名稱,約束名稱可以省略, 如下例: CREATE TABLE S (SNO CHAR(6), SN CHAR(8) UNI
24、QUE, SEX CHAR(2), AGE NUMERIC(2)); UNIQUE用于定義表約束時,其語法格式如下: CONSTRAINT UNIQUE(,),34,例3.7 建立一個S表,定義SN+SEX為唯一鍵。 CREATE TABLE S ( SNO CHAR(5), SN CHAR(8), SEX CHAR(2), CONSTRAINT S_UNIQ UNIQUE(SN,SEX)); 系統(tǒng)為SN+SEX建立唯一索引,確保同一性別的學生沒有重名。 (3)PRIMARY KEY約束 PRIMARY KEY約束用于定義基本表的主鍵,起唯一標識作用,其值不能為NULL,也不能重復,以此來保證
25、實體的完整性。,35,PRIMARY KEY與UNIQUE約束類似,通過建立唯一索引來保證基本表在主鍵列取值的唯一性,但它們之間存在著很大的區(qū)別: 在一個基本表中只能定義一個PRIMARY KEY約束,但可定義多個UNIQUE約束; 對于指定為PRIMARY KEY的一個列或多個列的組合,其中任何一個列都不能出現(xiàn)空值,而對于UNIQUE所約束的唯一鍵,則允許為空。 注意:不能為同一個列或一組列既定義UNIQUE約束,又定義PRIMARY KEY約束。 PRIMARY KEY既可用于列約束,也可用于表約束。 PRIMARY KEY用于定義列約束時,其語法格式如下: CONSTRAINT PRIM
26、ARY KEY,36,例3.8 建立一個S表,定義SNO為S的主鍵 CREATE TABLE S (SNO CHAR(5) NOT NULL CONSTRAINT S_PRIM PRIMARY KEY, SN CHAR(8), AGE NUMERIC(2)); PRIMARY KEY用于定義表約束時,即將某些列的組合定義為主鍵,其語法格式如下: CONSTRAINT S PRIMARY KEY (),37,例3.9 建立一個SC表,定義SNO+CNO為SC的主鍵 CREATE TABLE SC (SNO CHAR(5) NOT NULL, CNO CHAR(5) NOT NULL, SCOR
27、E NUMERIC(3), CONSTRAINT SC_PRIM PRIMARY KEY(SNO,CNO));,38,(4)FOREIGN KEY約束 FOREIGN KEY約束指定某一個列或一組列作為外部鍵,其中,包含外部鍵的表稱為從表,包含外部鍵所引用的主鍵或唯一鍵的表稱主表。 系統(tǒng)保證從表在外部鍵上的取值要么是主表中某一個主鍵值或唯一鍵值,要么取空值。以此保證兩個表之間的連接,確保了實體的參照完整性。 FOREIGN KEY既可用于列約束,也可用于表約束, 其語法格式為: CONSTRAINT FOREIGN KEY REFERENCES (),39,例3.10 建立一個SC表,定義SN
28、O,CNO為SC的外部鍵。 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), CONSTRAINT S_C_PRIM PRIMARY KEY (SNO,CNO));,40,(5)CHECK約束 CHECK約束用來檢查字段值所允許的范圍,如,一個字段只能輸入整數(shù),而且限定在0-100的整數(shù),以此來保證
29、域的完整性。 CHECK既可用于列約束,也可用于表約束, 其語法格式為: CONSTRAINT CHECK () 例3.10 建立一個SC表,定義SCORE 的取值范圍為0到100之間。 CREATE TABLE SC (SNO CHAR(5), CNO CHAR(5), SCORE NUMERIC(5,1) CONSTRAINT SCORE_CHK CHECK(SCORE=0 AND SCORE <=100));,41,例3.11 建立包含完整性定義的學生表 CREATE TABLE S (SNO CHAR(6) CONSTRAINT S_PRIM PRIMARY KEY, SN CHAR(
30、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) CONSTRAINT DEPT_CONS NOT NULL);,42,實例2: 設(shè)某商業(yè)集團數(shù)據(jù)庫中有三個實體集。一是“倉庫”實體集,屬性有倉庫號、倉庫名和地址等;二是“商店”實體集,屬性有商店號、商店名、地址等;三是“商品”實體集,屬性有商品號、商品名、單價。 設(shè)倉庫
31、與商品之間存在“庫存”聯(lián)系,每個倉庫可存儲若干種商品,每種商品存儲在若干倉庫中,每個倉庫每存儲一種商品有個日期及存儲量,它的關(guān)系模式是:庫存(倉庫號,商品號,日期,庫存量); 1.使用SQL創(chuàng)建倉庫表,商店表,商品表以及庫存表。 2.要求倉庫表中倉庫號為主鍵,倉庫地址唯一。 商店表中商店號為主鍵,商店名不能為空值。 商品表中商品號為主鍵,單價大于0。,43,3.2.3.2 修改基本表 由于應用環(huán)境和應用需求的變化,經(jīng)常需要修改基本表的結(jié)構(gòu),比如,增加新列和完整性約束、修改原有的列定義和完整性約束等。 SQL語言使用ALTER TABLE命令來完成這一功能,有如下三種修改方式:,
32、語句格式 ALTER TABLE ALTER COLUMN ADD 完整性約束 DROP | ;,:要修改的基本表 ALTER COLUMN子句:用于修改列 ADD子句:增加新列和新的完整性約束條件 DROP子句:刪除指定列或完整性約束條件,44,ADD方式 用于增加新列和完整性約束,定義方式同CREATE TABLE語句中的定義方式相同,其語法格式為: ALTER TABLE ADD | 例3.12 在S表中增加一個班號列和住址列。 ALTER TABLE S ADD CLASS_NO CHAR(6), ADDRESS CHAR(40),45,注意:使用此方式增加的新列自動填充NUL
33、L值,所以不能為增加的新列指定NOT NULL約束 。 例3.13 在SC表中增加完整性約束定義,使SCORE在0-100之間。 ALTER TABLE SC ADD CONSTRAINT SCORE_CHK CHECK(SCORE BETWEEN 0 AND 100),46,2. ALTER 方式 用于修改某些列,其語法格式為: ALTER TABLE ALTER COLUMN NULL|NOT NULL 例3.14 把S表中的SNO列加寬到8位字符寬度 ALTER TABLE S ALTER COLUMN SNO CHAR(8),47,注意:使用此方式有如下一些限制: 不能改變列名; 不能
34、將含有空值的列的定義修改為NOT NULL約束; 若列中已有數(shù)據(jù),則不能減少該列的寬度,也不能改變其數(shù)據(jù)類型; 只能修改NULL|NOT NULL約束,其它類型的約束在修改之前必須先刪除,然后再重新添加修改過的約束定義。,48,例3.15 刪除S表中的AGE_CHK約束 ALTER TABLE S DROP CONSTRAINT AGE_CHK 3.2.3.3 改變基本表的名字 使用RENAME命令,可以改變基本表的名字,其語法格式為: RENAME TO 例3.16 將S表的名字更改為STUDENT RENAME S TO STUDENT,49,,3.DROP方式 刪除完整性約束定義,其語法
35、格式為: ALTER TABLE DROP CONSTRAINT ,50,實例2: 設(shè)某商業(yè)集團數(shù)據(jù)庫中有三個實體集。一是“倉庫”實體集,屬性有倉庫號、倉庫名和地址等;二是“商店”實體集,屬性有商店號、商店名、地址等;三是“商品”實體集,屬性有商品號、商品名、單價。 設(shè)倉庫與商品之間存在“庫存”聯(lián)系,每個倉庫可存儲若干種商品,每種商品存儲在若干倉庫中,每個倉庫每存儲一種商品有個日期及存儲量,它的關(guān)系模式是:庫存(倉庫號,商品號,日期,庫存量); 1.修改商品表,添加產(chǎn)地屬性。 2. 為庫存量添加完整性約束條件使庫存量值大于等于0。 3.刪除商品表中商品地址唯一的完整性約束條件,51,3.2
36、.3.4 刪除基本表 當某個基本表無用時,可將其刪除。 刪除后,該表中的數(shù)據(jù)和在此表上所建的索引都被刪除,而建立在該表上的視圖不會隨之刪除,系統(tǒng)將繼續(xù)保留其定義,但已無法使用。 如果重新恢復該表,這些視圖可重新使用。 刪除表的語法格式: DROP TABLE 例3.17 刪除表STUDENT USE STUDENT DROP TABLE STUDENT 注意:只能刪除自己建立的表,不能刪除其他用戶所建的表。,52,3.2.5 設(shè)計、創(chuàng)建和維護索引 3.2.5.1 索引的作用 在日常生活中我們會經(jīng)常遇到索引,例如圖書目錄、詞典索引等。 借助索引,人們會很快地找到需要的東西。 索引是數(shù)據(jù)庫隨機檢索
37、的常用手段,它實際上就是記錄的關(guān)鍵字與其相應地址的對應表。 例如,當我們要在本書中查找有關(guān)“SQL查詢”的內(nèi)容時,應該先通過目錄找到“SQL查詢”所對應的頁碼,然后從該頁碼中找出所要的信息。這種方法比直接翻閱書的內(nèi)容要快。 如果把數(shù)據(jù)庫表比作一本書,則表的索引就如書的目錄一樣,通過索引可大大提高查詢速度。 此外,在SQL SERVER中,行的唯一性也是通過建立唯一索引來維護的。 索引的作用可歸納為: 1. 加快查詢速度; 2. 保證行的唯一性。,53,3.2.5.2 索引的分類 1. 按照索引記錄的存放位置可分為聚集索引與非聚集索引 聚集索引:按照索引的字段排列記錄,并且依照排好的順序?qū)⒂涗洿?/p>
38、儲在表中。 非聚集索引:按照索引的字段排列記錄,但是排列的結(jié)果并不會存儲在表中,而是另外存儲。 2. 唯一索引的概念 唯一索引表示表中每一個索引值只對應唯一的數(shù)據(jù)記錄, 這與表的PRIMARY KEY的特性類似,因此唯一性索引常用于PRIMARY KEY的字段上,以區(qū)別每一筆記錄。 當表中有被設(shè)置為UNIQUE的字段時,SQL SERVER會自動建立一個非聚集的唯一性索引。 而當表中有PRIMARY KEY的字段時,SQL SERVER會在PRIMARY KEY字段建立一個聚集索引。 3. 復合索引的概念 復合索引是將兩個字段或多個字段組合起來建立的索引,而單獨的字段允許有重復的值。,54,3
39、.2.5.3 建立索引 建立索引的語句是CREATE INDEX,其語法格式為: CREATE UNIQUE CLUSTER INDEX ON ( 次序 , 次序) UNIQUE表明建立唯一索引。 CLUSTER表示建立聚集索引。 次序用來指定索引值的排列順序,可為ASC(升序)或DESC(降序),缺省值為ASC。 例3.18 為表SC在SNO和CNO上建立唯一索引。 USE STUDENT CREATE UNIQUE INDEX SCI ON SC(SNO,CNO),55,執(zhí)行此命令后,為SC表建立一個索引名為SCI的唯一索引, 此索引為SNO和CNO兩列的復合索引,即對SC表中的行先按SN
40、O的遞增順序索引,對于相同的SNO,又按CNO的遞增順序索引。 由于有UNIQUE的限制,所以該索引在(SNO,CNO)組合列的排序上具有唯一性,不存在重復值。 例3.19 為教師表T在TN上建立聚集索引。 CREATE CLUSTER INDEX TI ON T(TN) 執(zhí)行此命令后,為T表建立一個索引名為TI的聚集索引,T表中的記錄將按照TN值的升序存放。,56,注意: 1. 改變表中的數(shù)據(jù)(如增加或刪除記錄)時,索引將自動更新。 索引建立后,在查詢使用該列時,系統(tǒng)將自動使用索引進行查詢。 2. 索引數(shù)目無限制,但索引越多,更新數(shù)據(jù)的速度越慢。對于僅用于查詢的表可多建索引,對于數(shù)據(jù)更新頻繁
41、的表則應少建索引。 3.2.5.4 刪除索引 建立索引是為了提高查詢速度,但隨著索引的增多,數(shù)據(jù)更新時,系統(tǒng)會花費許多時間來維護索引。這時,應刪除不必要的索引。 刪除索引的語句是DROP INDEX,其語法格式為: DROP INDEX 數(shù)據(jù)表名.索引名 例3.20 刪除表SC的索引SCI。 DROP INDEX SC.SCI,57,實例3: 現(xiàn)有關(guān)系模式如下: 部門(部門編號,部門名稱,電話) 員工(員工編號,姓名,性別,部門編號,職務) 項目(項目編號,項目名稱,預算) 施工(員工編號,項目編號,工時) 1.創(chuàng)建部門表,部門編號數(shù)據(jù)類型為CHAR(10)且為主鍵,部門名稱數(shù)據(jù)類型為CHAR
42、(50),電話數(shù)據(jù)類型為CHAR(11); 2.創(chuàng)建員工表,員工編號數(shù)據(jù)類型為CHAR(10)且為主鍵,姓名數(shù)據(jù)類型為CHAR(20),性別數(shù)據(jù)類型為CHAR(2),部門編號數(shù)據(jù)類型為CHAR(10)且為外鍵,職務數(shù)據(jù)類型為VARCHAR(20); 3.創(chuàng)建項目表,項目編號數(shù)據(jù)類型為CHAR(10)且為主鍵,項目名稱數(shù)據(jù)類型為CHAR(20),預算數(shù)據(jù)類型為INT; 4.創(chuàng)建施工表,員工編號數(shù)據(jù)類型為CHAR(10),項目標號數(shù)據(jù)類型為CHAR(10),(員工編號,項目標號)為主鍵,工時數(shù)據(jù)類型為FLOAT;,58,3.3 SQL數(shù)據(jù)查詢,3.3.1 SELECT命令的格式與基本使用 數(shù)據(jù)查詢
43、是數(shù)據(jù)庫中最常見的操作。 SQL語言提供SELECT語句,通過查詢操作可得到所需的信息。 SELECT語句的一般格式為: SELECT列名,列名 FROM表名或視圖名,表名或視圖名 WHERE檢索條件 GROUP BY HAVING ORDER BY ASC|DESC;,59,SELECT語句的格式: SELECTALL|DISTINCTTOP N PERCENTWITH TIES 列名1 AS 別名1 , 列名2 AS 別名2 INTO 新表名 FROM 表名 1AS 表1別名 INNER|RIGHT|FULL|OUTEROUTERJOIN 表名2 AS 表2別名 ON 條件,60,查詢的
44、結(jié)果是仍是一個表。 SELECT語句的執(zhí)行過程是: 根據(jù)WHERE子句的檢索條件,從FROM子句指定的基本表或視圖中選取滿足條件的元組,再按照SELECT子句中指定的列,投影得到結(jié)果表。 如果有GROUP子句,則將查詢結(jié)果按照相同的值進行分組。 如果GROUP子句后有HAVING短語,則只輸出滿足HAVING條件的元組。 如果有ORDER子句,查詢結(jié)果還要按照的值進行排序。,61,例3.21 查詢?nèi)w學生的學號、姓名和年齡。 SELECT SNO, SN, AGE FROM S 例3.22 查詢學生的全部信息。 SELECT * FROM S 用 * 表示S表的全部列名,而不必逐一列出。 例3
45、.23 查詢選修了課程的學生號。 SELECT DISTINCT SNO FROM SC 查詢結(jié)果中的重復行被去掉 上述查詢均為不使用WHERE子句的無條件查詢,也稱作投影查詢。,62,另外,利用投影查詢可控制列名的順序,并可通過指定別名改變查詢結(jié)果的列標題的名字。 例3.24 查詢?nèi)w學生的姓名、學號和年齡。 SELECT SNAME NAME, SNO, AGE FROM S 其中,NAME為SNAME的別名,63,3.3.2條件查詢 當要在表中找出滿足某些條件的行時,則需使用WHERE子句指定查詢條件。 WHERE子句中,條件通常通過三部分來描述: 1 列名; 2 比較運算符; 3 列名
46、、常數(shù)。,表3.8 常用的比較運算符,64,3.3.2.1 比較大小 例3.25 查詢選修課程號為C1的學生的學號和成績。 SELECT SNO,SCORE FROM SC WHERE CNO=C1 例3.26 查詢成績高于85分的學生的學號、課程號和成績。 SELECT SNO,CNO,SCORE FROM SC WHERE SCORE85,65,3.3.2.2 多重條件查詢 當WHERE子句需要指定一個以上的查詢條件時,則需要使用邏輯運算符AND、OR和NOT將其連結(jié)成復合的邏輯表達式。 其優(yōu)先級由高到低為:NOT、AND、OR,用戶可以使用括號改變優(yōu)先級。 例3.27 查詢選修C1或C2
47、且分數(shù)大于等于85分學生的的學號、課程號和成績。 SELECT SNO,CNO,SCORE FROM SC WHERE(CNO=C1 OR CNO=C2) AND SCORE=85,66,3.3.2.3 確定范圍 例3.28 查詢工資在1000至1500之間的教師的教師號、姓名及職稱。 SELECT TNO,TN,PROF FROM T WHERE SAL BETWEEN 1000 AND 1500 等價于 SELECT TNO,TN,PROF FROM T WHERE SAL=1000 AND SAL<=1500,67,例3.29 查詢工資不在1000至1500之間的教師的教師號、姓名及職稱
48、。 SELECT TNO,TN,PROF FROM T WHERE SAL NOT BETWEEN 1000 AND 1500 3.2.2.4 確定集合 利用“IN”操作可以查詢屬性值屬于指定集合的元組。 例3.30 查詢選修C1或C2的學生的學號、課程號和成績。 SELECT SNO, CNO, SCORE FROM SC WHERE CNO IN(C1, C2) 此語句也可以使用邏輯運算符“OR”實現(xiàn)。,68,SELECT SNO, CNO, SCORE FROM SC WHERE CNO=C1 OR CNO= C2 利用“NOT IN”可以查詢指定集合外的元組。 例3.31 查詢沒有選修
49、C1,也沒有選修C2的學生的學號、課程號和成績。 SELECT SNO, CNO, SCORE FROM SC WHERE CNO NOT IN(C1, C2) 等價于: SELECT SNO, CNO, SCORE FROM SC WHERE CNO!=C1 AND CNO!= C2,69,3.3.2.5 部分匹配查詢 上例均屬于完全匹配查詢,當不知道完全精確的値時,用戶還可以使用LIKE或NOT LIKE進行部分匹配查詢(也稱模糊查詢)。 LIKE定義的一般格式為: LIKE 屬性名必須為字符型,字符串常量的字符可以包含如下兩個特殊符號: %:表示任意知長度的字符串; _:表示任意單個字符
50、。 例3.32 查詢所有姓張的教師的教師號和姓名。 SELECT TNO, TN FROM T WHERE TN LIKE 張%,70,例3.33 查詢姓名中第二個漢字是“力”的教師號和姓名。 SELECT TNO, TN FROM T WHERE TN LIKE _ _力% 注:一個漢字占兩個字符。 3.3.2.6空值查詢 某個字段沒有值稱之為具有空值(NULL)。 通常沒有為一個列輸入值時,該列的值就是空值。 空值不同于零和空格,它不占任何存儲空間。 例如,某些學生選課后沒有參加考試,有選課記錄,但沒有考試成績,考試成績?yōu)榭罩?,這與參加考試,成績?yōu)榱惴值牟煌?71,例3.34 查詢沒有考
51、試成績的學生的學號和相應的課程號。 SELECT SNO, CNO FROM SC WHERE SCORE IS NULL 注意:這里的空值條件為IS NULL,不能寫成SCORE=NULL。,72,3.2.2常用庫函數(shù)及統(tǒng)計匯總查詢 SQL提供了許多庫函數(shù),增強了基本檢索能力。 常用的庫函數(shù),如表3.2所示,73,例3.35 求學號為S1學生的總分和平均分。 SELECT SUM(SCORE) AS TotalScore, AVG(SCORE) AS AveScore FROM SC WHERE (SNO = S1) 注意:函數(shù)SUM和AVG只能對數(shù)值型字段進行計算。,74,例3.36 求選
52、修C1號課程的最高分、最低分及之間相差的分數(shù) SELECT MAX(SCORE) AS MaxScore, MIN(SCORE) AS MinScore, MAX(SCORE) - MIN(SCORE) AS Diff FROM SC WHERE (CNO = C1) 例3.37 求計算機系學生的總數(shù) SELECT COUNT(SNO) FROM S WHERE DEPT=計算機,75,例3.38 求學校中共有多少個系 SELECT COUNT(DISTINCT DEPT) AS DeptNum FROM S 注意:加入關(guān)鍵字DISTINCT后表示消去重復行,可計算字段“DEPT“不同值的數(shù)
53、目。 COUNT函數(shù)對空值不計算,但對零進行計算。 例3.39 統(tǒng)計有成績同學的人數(shù) SELECT COUNT (SCORE) FROM SC 上例中成績?yōu)榱愕耐瑢W計算在內(nèi),沒有成績(即為空值)的不計算。,76,例3.40 利用特殊函數(shù)COUNT(*)求計算機系學生的總數(shù) SELECT COUNT(*) FROM S WHERE DEPT=計算機 COUNT(*)用來統(tǒng)計元組的個數(shù) 不消除重復行,不允許使用DISTINCT關(guān)鍵字。,77,3.3.3 分組查詢 GROUP BY子句可以將查詢結(jié)果按屬性列或?qū)傩粤薪M合在行的方向上進行分組,每組在屬性列或?qū)傩粤薪M合上具有相同的值。 例3.42 查詢各
54、位教師的教師號及其任課的門數(shù)。 SELECT TNO,COUNT(*) AS C_NUM FROM TC GROUP BY TNO GROUP BY子句按TNO的值分組,所有具有相同TNO的元組為一組,對每一組使用函數(shù)COUNT進行計算,統(tǒng)計出各位教師任課的門數(shù)。,78,若在分組后還要按照一定的條件進行篩選,則需使用HAVING子句。 例3.43 查詢選修兩門以上課程的學生學號和選課門數(shù) SELECT SNO,COUNT(*) AS SC_NUM FROM SC GROUP BY SNO HAVING COUNT(*)=2 GROUP BY子句按SNO的值分組,所有具有相同SNO的元組為一組
55、,對每一組使用函數(shù)COUNT進行計算,統(tǒng)計出每位學生選課的門數(shù)。 HAVING子句去掉不滿足COUNT(*)=2的組。,79,當在一個SQL查詢中同時使用WHERE子句,GROUP BY 子句和HAVING子句時,其順序是WHEREGROUP BY HAVING。 WHERE與HAVING子句的根本區(qū)別在于作用對象不同。 WHERE子句作用于基本表或視圖,從中選擇滿足條件的元組; HAVING子句作用于組,選擇滿足條件的組,必須用于GROUP BY子句之后,但GROUP BY子句可沒有HAVING子句。,80,3.3.5 查詢的排序 當需要對查詢結(jié)果排序時,應該使用ORDER BY子句 ORD
56、ER BY子句必須出現(xiàn)在其他子句之后 排序方式可以指定,DESC為降序,ASC為升序,缺省時為升序 例3.44 查詢選修C1 的學生學號和成績,并按成績降序排列。 SELECT SNO, SCORE FROM SC WHERE CNO=C1 ORDER BY SCORE DESC,81,例3.45 查詢選修C2、C3、C4或C5課程的學號、課程號和成績,查詢結(jié)果按學號升序排列,學號相同再按成績降序排列。 SELECT SNO,CNO, SCORE FROM SC WHERE CNO IN (C2 ,C3, C4,C5) ORDER BY SNO,SCORE DESC 例3.46 求選課在三門
57、以上且各門課程均及格的學生的學號及其總成績,查詢結(jié)果按總成績降序列出。 SELECT SNO,SUM(SCORE) AS TotalScore FROM SC WHERE SCORE=60 GROUP BY SNO HAVING COUNT(*)=3 ORDER BY SUM(SCORE) DESC,82,此語句為分組排序,執(zhí)行過程如下: 1.(FROM)取出整個SC 2.(WHERE)篩選SCORE=60的元組 3.(GROUP BY)將選出的元組按SNO分組 4.(HAVING)篩選選課三門以上的分組 5.(SELECT)以剩下的組中提取學號和總成績 6.(ORDER BY)將選取結(jié)果排序
58、 ORDER BY SUM(SCORE) DESC 可以改寫成 ORDER BY 2 DESC 2 代表查詢結(jié)果的第二列。,83,3.3.6 數(shù)據(jù)表連接及連接查詢 數(shù)據(jù)表之間的聯(lián)系是通過表的字段值來體現(xiàn)的,這種字段稱為連接字段。 連接操作的目的就是通過加在連接字段的條件將多個表連接起來,以便從多個表中查詢數(shù)據(jù)。 前面的查詢都是針對一個表進行的,當查詢同時涉及兩個以上的表時,稱為連接查詢。 表的連接方法有兩種: 方法1:表之間滿足一定的條件的行進行連接,此時FROM子句中指明進行連接的表名,WHERE子句指明連接的列名及其連接條件。 方法2:利用關(guān)鍵字JOIN進行連接。,84,具體分為以下幾種:
59、 INNER JOIN :顯示符合條件的記錄,此為默認值; LEFT (OUTER) JOIN:顯示符合條件的數(shù)據(jù)行以及左邊表中不符合條件的數(shù)據(jù)行,此時右邊數(shù)據(jù)行會以NULL來顯示,此稱為左連接; RIGHT (OUTER) JOIN:顯示符合條件的數(shù)據(jù)行以及右邊表中不符合條件的數(shù)據(jù)行,此時左邊數(shù)據(jù)行會以NULL來顯示,此稱為右連接; FULL (OUTER) JOIN:顯示符合條件的數(shù)據(jù)行以及左邊表和右邊表中不符合條件的數(shù)據(jù)行,此時缺乏數(shù)據(jù)的數(shù)據(jù)行會以NULL來顯示; CROSS JOIN:會將一個表的每一筆數(shù)據(jù)和另一表的每筆數(shù)據(jù)匹配成新的數(shù)據(jù)行。 當將JOIN 關(guān)鍵詞放于FROM子句中時,
60、應有關(guān)鍵詞ON與之相對應,以表明連接的條件。,85,3.3.6.1 等值連接與非等值連接 例3.47 查詢劉偉老師所講授的課程。 方法1: SELECT T.TNO ,TN,CNO FROM T,TC WHERE (T.TNO = TC. TNO) AND (TN=劉偉) 這里,TN=劉偉為查詢條件,而T.TNO = TC.TNO 為連接條件,TNO為連接字段。連接條件的一般格式為: . . 其中,比較運算符主要有:、、、、、!。 當比較運算符為““時,稱為等值連接,其他情況為非等值連接。,86,引用列名TNO時要加上表名前綴,是因為兩個表中的列名相同,必須用表名前綴來確切說明所指列屬于哪個表
61、,以避免二義性。如果列名是唯一的,比如TN,就不必須加前綴。 上面的操作是將T表中的TNO 和TC表中的TNO相等的行連接,同時選取TN為“劉偉“的行,然后再在TN,CNO列上投影,這是連接、選取和投影的操作組合。 方法2: SELECT T.TNO,TN,CNO FROM T INNER JOIN TC ON T.TNO=TC.TNO AND T.TN=劉偉,87,方法3: SELECT R2.TNO,R2.TN, R1.CNO FROM (SELECT TNO,CNO FROM TC ) AS R1 INNER JOIN (SELECT TNO ,TN FROM T WHERE TN=劉偉
62、) AS R2 ON R1.TNO=R2.TNO,88,例3.48 查詢所有選課學生的學號、姓名、選課名稱及成績。 SELECT S.SNO,SN,CN,SCORE FROM S,C,SC WHERE S.SNO=SC.SNO AND SC.CNO=C.CNO 本例涉及三個表,WHERE子句中有兩個連接條件。當有兩個以上的表進行連接時,稱為多表連接。,89,3.3.6.2 自身連接 當一個表與其自已進行連接操作時,稱為表的自身連接。 例3.49 查詢所有比劉偉工資高的教師姓名、性別、工資和劉偉的工資。 要查詢的內(nèi)容均在同一表T中,可以將表T分別取兩個別名,一個是X,一個是Y。將X, Y 中滿足
63、比劉偉工資高的行連接起來。這實際上是同一表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=劉偉,90,方法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 JOIN (SELECT
64、 SAL FROM T WHERE TN=劉偉) AS R2 ON R1.SALR2.SAL,91,例3.50 檢索所有學生姓名,年齡和選課名稱。 方法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 INNER JOIN (SE
65、LECT SNO,CNO FROM SC) AS R2 ON R1.CNO=R2.CNO) AS R4 ON R3.SNO=R4.SNO,92,3.3.6.3 外連接 在上面的連接操作中,不滿足連接條件的元組不能作為查詢結(jié)果輸出。 如例3.48的查詢結(jié)果只包括有選課記錄的學生,而不會有吳麗同學的信息。若將例3.48改成: 例3.51 查詢所有學生的學號、姓名、選課名稱及成績。(沒有選課的同學的選課信息顯示為空)則應寫成如下的SQL語句。 SELECT S.SNO,SN,CN,SCORE FROM S LEFT OUTER JOIN SC ON S.SNO=SC.SNO LEFT OUTER J
66、OIN C ON C.CNO=SC.CNO 則查詢結(jié)果只包括所有的學生,沒有選課的吳麗同學的選課信息顯示為空。,93,3.3.7 子查詢 在WHERE子句中包含一個形如SELECT-FROM-WHERE的查詢塊,此查詢塊稱為子查詢或嵌套查詢,包含子查詢的語句稱為父查詢或外部查詢。 嵌套查詢可以將一系列簡單查詢構(gòu)成復雜查詢,增強查詢能力。 子查詢的嵌套層次最多可達到255層,以層層嵌套的方式構(gòu)造查詢充分體現(xiàn)了SQL“結(jié)構(gòu)化”的特點。 嵌套查詢在執(zhí)行時由里向外處理,每個子查詢是在上一級外部查詢處理之前完成,父查詢要用到子查詢的結(jié)果。,94,3.3.7.1 返回一個值的子查詢 當子查詢的返回值只有一個時,可以使用比較運算符(=, , =, <=, !=)將父查詢和子查詢連接起來。 例3.52 查詢與劉偉教師職稱相同的教師號、姓名。 SELECT TNO,TN FROM T WHERE PROF=(SELECT PROF FROM T WHERE TN=劉偉) 此查詢相當于分成兩個查詢塊來執(zhí)行。先執(zhí)行子查詢: SELECT PROF FROM T WHERE TN=劉偉,95,子查詢向主查詢只
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。