




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第3章 SQL語言1本章概要 SQL是結(jié)構(gòu)化查詢語言(Structured Query Language)的縮寫,其功能包括數(shù)據(jù)查詢、數(shù)據(jù)操縱、數(shù)據(jù)定義和數(shù)據(jù)控制四個(gè)部分。SQL 語言簡潔、方便實(shí)用、功能齊全,已成為目前應(yīng)用最廣的關(guān)系數(shù)據(jù)庫語言。本章要求了解 SQL語言的特點(diǎn),掌握SQL語言的四大功能及使用方法,重點(diǎn)掌握其數(shù)據(jù)查詢功能及其使用。 23.1 SQL語言的基本概念與特點(diǎn) 實(shí)例1:大一新生報(bào)到時(shí)需要經(jīng)歷一系列的報(bào)到流程,其中包括建立學(xué)生信息數(shù)據(jù)庫,以下是學(xué)生信息數(shù)據(jù)庫建立的過程, 教務(wù)處從招生就業(yè)處獲得新生錄取數(shù)據(jù)教務(wù)處按專業(yè)整理新生名單,并根據(jù)專業(yè)設(shè)置及錄取人數(shù)制訂分班計(jì)劃教務(wù)處向
2、各系(院)發(fā)送新生名單,系(院)根據(jù)分班計(jì)劃進(jìn)行分班。教務(wù)處根據(jù)系(院)報(bào)送的分班名單整理新生數(shù)據(jù),分派學(xué)號(hào),編制初步的新生名冊并導(dǎo)入教學(xué)管理系統(tǒng)。新生報(bào)到后,系(院)核對報(bào)到的新生名單教務(wù)處根據(jù)報(bào)到名單整理新生數(shù)據(jù),建立數(shù)據(jù)庫,統(tǒng)計(jì)各項(xiàng)新生數(shù)據(jù)上報(bào)教育廳新生數(shù)據(jù)并在教育部學(xué)籍學(xué)歷管理平臺(tái)進(jìn)行新生學(xué)籍注冊教務(wù)處編制正式的新生名冊并發(fā)送到各系(院)及相關(guān)部門這里,我們假設(shè)建立的是一個(gè)關(guān)系數(shù)據(jù)庫,新生數(shù)據(jù)即是一個(gè)二維表,那么學(xué)生表的結(jié)構(gòu)是什么?包含什么內(nèi)容?33.1 SQL語言的基本概念與特點(diǎn) 3.1.1 SQL語言的發(fā)展及標(biāo)準(zhǔn)化3.1.1.1 SQL語言發(fā)展史 SQL語言是當(dāng)前最為成功、應(yīng)用最為
3、廣泛的關(guān)系數(shù)據(jù)庫語言,其發(fā)展主要經(jīng)歷了以下幾個(gè)階段:1974年由CHAMBERLIN和BOYEE提出,當(dāng)時(shí)稱為SEQUEL(STUCTURED ENGLISH QUERY LANGUAGE);IBM公司對其進(jìn)行了修改,并用于其SYSTEM R關(guān)系數(shù)據(jù)庫系統(tǒng)中;1981年 IBM推出其商用關(guān)系關(guān)系數(shù)據(jù)庫SQL/DS,并將其名字改為SQL,由于SQL語言功能強(qiáng)大,簡潔易用,因此得到了廣泛的使用; 今天廣泛應(yīng)用于各種大型數(shù)據(jù)庫,如SYBASE、INFORMIX、 ORACLE、DB2、INGRES等,也用于各種小型數(shù)據(jù)庫,如FOXPRO、ACCESS。43.1.1.2 SQL語言標(biāo)準(zhǔn)化 隨著關(guān)系數(shù)據(jù)
4、庫系統(tǒng)和SQL語言應(yīng)用的日益廣泛,SQL語言的標(biāo)準(zhǔn)化工作也在緊張革進(jìn)行著,十多年來已制訂了多個(gè)SQL標(biāo)準(zhǔn);1. 1982年,美國國家標(biāo)準(zhǔn)化局(AMERICAN NATIONAL STANDARD INSTITUTE,簡稱ANSI)開始制定SQL標(biāo)準(zhǔn);2. 1986年,美國國家標(biāo)準(zhǔn)化協(xié)會(huì)公布了SQL語言的第一個(gè)標(biāo)準(zhǔn)SQL86;3. 1987年,國際標(biāo)準(zhǔn)化組織(ISO)通過了SQL86標(biāo)準(zhǔn);4. 1989年,國際標(biāo)準(zhǔn)化組織(ISO)對SQL86進(jìn)行了補(bǔ)充,推出了SQL89標(biāo)準(zhǔn);5. 1992年,ISO又推出了SQL92標(biāo)準(zhǔn),也稱為SQL2;6.SQL/99:Core level跟其他8種相應(yīng)的le
5、vel,包括遞歸查詢,程序跟流程控制,基本的對象(object)支持包括oids;7.SQL/2003:包含了XML相關(guān)內(nèi)容,自動(dòng)生成列值(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將成為“新的HTML;9.SQL/2006:定義了SQL與XML(包含XQuery)的關(guān)聯(lián)應(yīng)用;10.2006:Sun公司將以SQL基礎(chǔ)的數(shù)據(jù)庫管理系統(tǒng)嵌入Java V6;11.2007 :SQL Server 2008
6、(Katmi)在過去的SQL2005基礎(chǔ)上增強(qiáng)了它的安全性,主要在:簡單的數(shù)據(jù)加密,外鍵管理,增強(qiáng)了審查,改進(jìn)了數(shù)據(jù)庫鏡像,加強(qiáng)了可支持性。 53.1.2 SQL語言的基本概念首先介紹兩個(gè)基本概念:基本表和視圖?;颈恚˙ASE TABLE):是獨(dú)立存在的表,不是由其它的表導(dǎo)出的表。一個(gè)關(guān)系對應(yīng)一個(gè)基本表,一個(gè)或多個(gè)基本表對應(yīng)一個(gè)存儲(chǔ)文件。視圖(VIEW):是一個(gè)虛擬的表,是從一個(gè)或幾個(gè)基本表導(dǎo)出的表。它本身不獨(dú)立存在于數(shù)據(jù)庫中,數(shù)據(jù)庫中只存放視圖的定義而不存放視圖對應(yīng)的數(shù)據(jù),這些數(shù)據(jù)仍存放在導(dǎo)出視圖的基本表中。當(dāng)基本表中的數(shù)據(jù)發(fā)生變化時(shí),從視圖中查詢出來的數(shù)據(jù)也隨之改變。6例如:學(xué)生數(shù)據(jù)庫中
7、有學(xué)生基本情況表STUDENT(SNO,SNAME,SSEX,SAGE,SDEPT),此表為基本表,對應(yīng)一個(gè)存儲(chǔ)文件。可以在其基礎(chǔ)上定義一個(gè)男生基本情況表STUDENT_MALE(SNO,SNAME,SAGE,SDEPT),它是從STUDENT中選擇SSEX=男的各個(gè)行,然后在SNO,SNAME,SAGE,SDEPT上投影得到的。在數(shù)據(jù)庫中只存有STUDENT_MALE的定義,而STUDENT_MALE的記錄不重復(fù)存儲(chǔ)。在用戶看來,視圖是通過不同路徑去看一個(gè)實(shí)際表,就象一個(gè)窗口一樣,我們通過窗戶去看外面的高樓,可以看到高樓的不同部分,而透過視圖可以看到數(shù)據(jù)庫中自己感興趣的內(nèi)容。7SQL視圖1視
8、圖2基本表1基本表2基本表3基本表4存儲(chǔ)文件1存儲(chǔ)文件2外模式模式內(nèi)模式圖3.1 SQL語言支持的關(guān)系數(shù)據(jù)庫的三級邏輯結(jié)構(gòu) SQL語言支持?jǐn)?shù)據(jù)庫的三級模式結(jié)構(gòu),如圖3.1所示。其中外模式對應(yīng)于視圖和部分基本表,模式對應(yīng)于基本表,內(nèi)模式對應(yīng)于存儲(chǔ)文件。 83.1.3 SQL語言的主要特點(diǎn)1.綜合統(tǒng)一。 SQL語言具有:數(shù)據(jù)查詢(QUERY);數(shù)據(jù)定義(DEFINITION)數(shù)據(jù)操縱(MANIPULATION);數(shù)據(jù)控制(CONTROL) 四種語言一體化的功能。2.高度非過程化 即用戶只要提出“干什么”即可,不必管具體操作過程,也不必了解數(shù)據(jù)的存取路徑,只要指明所需的數(shù)據(jù)即可。3.面向集合的操作方
9、式 SQL語言是一種面向集合的語言,每個(gè)命令的操作對象是一個(gè)或多個(gè)關(guān)系,結(jié)果也是一個(gè)關(guān)系。4.以同一種語法結(jié)構(gòu)提供兩種使用方式 SQL語言既是自含式語言,又是嵌入式語言??瑟?dú)立使用,也可嵌入到宿主語言中。自含式語言可以獨(dú)立使用交互命令,適用于終端用戶、應(yīng)用程序員和DBA;嵌入式語言使其嵌入在高級語言中使用,供應(yīng)用程序員開發(fā)應(yīng)用程序。9主要特點(diǎn)(5)語言簡潔、易學(xué)易用:核心功能只有8個(gè)動(dòng)詞,語法簡單,接近英語103.2 SQL數(shù)據(jù)定義 SQL語言使用數(shù)據(jù)定義語言(DATA DEFINITION LANGUAGE,簡稱DDL)實(shí)現(xiàn)其數(shù)據(jù)定義功能,可對數(shù)據(jù)庫用戶、基本表、視圖、索引進(jìn)行定義和撤消。表
10、 SQL的數(shù)據(jù)定義語句 操作對象操 作 方 式創(chuàng) 建刪 除修 改模 式CREATE SCHEMADROP SCHEMA表CREATE TABLEDROP TABLEALTER TABLE視 圖CREATE VIEWDROP VIEW索 引CREATE INDEXDROP INDEX113.2 SQL數(shù)據(jù)定義 3.2.1 字段數(shù)據(jù)類型當(dāng)用SQL語句定義表時(shí),需要為表中的每一個(gè)字段設(shè)置一個(gè)數(shù)據(jù)類型,用來指定字段所存放的數(shù)據(jù)是整數(shù)、字符串、貨幣或是其它類型的數(shù)據(jù)。SQL SERVER 的數(shù)據(jù)類型有很多種,分為以下9類:1. 整數(shù)數(shù)據(jù)類型:依整數(shù)數(shù)值的范圍大小,有BIT, INT , SMALLINT
11、, TINYINT四種。2. 精確數(shù)值類型:用來定義可帶小數(shù)部分的數(shù)字,有NUMERIC和DECIMAL兩種。二者相同,但建議使用DECIMAL。如:123.0、8000.56123. 近似浮點(diǎn)數(shù)值數(shù)據(jù)類型:當(dāng)數(shù)值的位數(shù)太多時(shí),可用此數(shù)據(jù)類型來取其近似值,用FLOAT和REAL兩種。如:1.23E+104. 日期時(shí)間數(shù)據(jù)類型:用來表示日期與時(shí)間,依時(shí)間范圍與精確程度可分為DATETIME與SMALLDATETIME兩種。如:1998-06-08 15:30:005. 字符串?dāng)?shù)據(jù)類型:用來表示字符串的字段。包括:CHAR, VARCHAR, TEXT三種,如:“數(shù)據(jù)庫”6. UNICODE字符串
12、數(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ù)類型:用來定義二進(jìn)制碼的數(shù)據(jù)。有:BINARY, VARBINARY,IMAGE 三種,通常用十六進(jìn)制表示:如:OX5F3C138. 貨幣數(shù)據(jù)類型:用來定義與貨幣有關(guān)的數(shù)據(jù),分為MONEY 與SMALLMONEY兩種,如:123.00009. 標(biāo)記數(shù)據(jù)類型:有UNIQUEIDENTIFIER ,TIMESTAMP兩種,此數(shù)據(jù)類型通常系統(tǒng)自動(dòng)產(chǎn)生,而不是用戶輸入的,TIMESTAMP記錄數(shù)據(jù)
13、更新的時(shí)間戳印,而UNIQUEIDENTIFIER用來識(shí)別每一筆數(shù)據(jù)的唯一性。各種數(shù)據(jù)類型的有關(guān)規(guī)定如下表: 數(shù)據(jù)類型數(shù)據(jù)內(nèi)容與范圍占用的字節(jié) BIT0, 1, NULL實(shí)際使用1BIT,但會(huì)占用1BYTE,若一個(gè)數(shù)據(jù)中有數(shù)個(gè)BIT字段,則可共占1個(gè)BYTE14INT-231到231-14BYTESSMALLINT-215至215-12BYTESTINYINT0至2551BYTESNUMERIC-1038-1至1038-11-9位數(shù)使用5BYTES10-19位數(shù)使用9BYTES20-28位數(shù)使用13BYTES29-38位數(shù)使用17BYTESDECIMAL-1038-1至1038-15-17BY
14、TES因長度而異,與NUMERIC相同F(xiàn)LOAT-1.79E+306至1.79E+308, 最多可表示53位數(shù)8BYTESREAL -3.40E+38到3.40E+38,最多可表示24位數(shù)4BYTES15DATETIME1753/1/1至9999/12/318BYTESSMALLDATETIME1900/1/1至2079/6/64BYTESCHAR1-8000個(gè)字符1個(gè)字符占1B,尾端空白字符保留VARCHAR1-8000個(gè)字符1個(gè)字符占1B,尾端空白字符刪除。TEXT231-1個(gè)字符1個(gè)字符占2B,最大可存儲(chǔ)2GBNCHAR1-4000個(gè)字符1個(gè)字符占2B,尾端空白字符保留NVARCHAR1
15、-4000個(gè)字符1個(gè)字符占2B,尾端空白字符刪除16NTEXT230-1個(gè)字符1個(gè)字符占2B,最大可存儲(chǔ)2GBBINARY1-8000個(gè)字符在存儲(chǔ)時(shí),SQL SERVER會(huì)另外增加4B,尾 端空白字符會(huì)保留VARBINARY1-8000個(gè)字符在存儲(chǔ)時(shí),SQL SERVER會(huì)另外增加4B,尾 端空白字符會(huì)刪除IMAGE231-1個(gè)字符最大可存儲(chǔ)2GBMONEY-263-263-18BSMALLMONEY-231-231-14BTIMESTAMP16進(jìn)制8BUNIQUEIDENTIFIER全局唯一標(biāo)識(shí)符(GUID)可用NEWID()函數(shù)生成一個(gè)該種類型的字段值。173.2.2 定義、修改和撤消數(shù)據(jù)
16、庫的用戶3.2.2.1 建立數(shù)據(jù)庫用戶數(shù)據(jù)庫用戶是指能夠登錄到數(shù)據(jù)庫,并能夠?qū)?shù)據(jù)庫進(jìn)行存取操作的用戶。當(dāng)SQL SERVER系統(tǒng)安裝完畢后,數(shù)據(jù)庫管理員就可以通過CREATE USER語句建立其他數(shù)據(jù)庫用戶了。語法格式為:CREATE USER IDENTIFIED BY 指定數(shù)據(jù)庫用戶的帳號(hào)名字,即用戶標(biāo)識(shí)符,指用戶登錄到數(shù)據(jù)庫系統(tǒng)時(shí)使用的口令,這里的用戶名和口令可以與用戶登錄到操作系統(tǒng)時(shí)所使用的用戶名和口令不同。18例3.1 建立一個(gè)新用戶,其名稱為ZHANGSAN,登錄口令為123。 CREATE USER ZHANGSAN IDENTIFIED BY 1233.2.2.2 更改數(shù)據(jù)庫
17、用戶的口令數(shù)據(jù)庫用戶最初的口令是由數(shù)據(jù)庫管理員指定的,數(shù)據(jù)庫用戶可以用ALTER USER命令來更改它,ALTER USER語句的基本語法格式為:ALTER USER IDENTIFIED BY 例3.2 將用戶ZHANGSAN的口令改為456。ALTER USER ZHANGSAN IDENTIFIED BY 456193.2.2.3 刪除用戶隨著數(shù)據(jù)庫應(yīng)用的發(fā)展和變化,數(shù)據(jù)庫的用戶也會(huì)發(fā)生變化。如果某些數(shù)據(jù)庫用戶不再需要使用數(shù)據(jù)庫,數(shù)據(jù)庫管理員就可以使用DROP USER把該用戶刪掉,DROP USER 語句的基本語法格式為:DROP USER 例3.3 刪除用戶ZHANGSANDROP
18、USER ZHANGSAN注意:刪除數(shù)據(jù)庫用戶之前應(yīng)首先刪除該用戶建立的數(shù)據(jù)庫對象,包括基本表、視圖、索引等,否則系統(tǒng)將不允許刪除這個(gè)用戶。203.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ù)庫的基本組成單位,它物理地存儲(chǔ)于數(shù)據(jù)庫的存儲(chǔ)文件中。1. 創(chuàng)建一個(gè)數(shù)據(jù)表時(shí)主要包括以下幾個(gè)組成部分:(1)字段名(列名):字段名可長達(dá)128個(gè)字符。字段名可包含中文、英文字母、下劃線、#號(hào)、貨幣符號(hào)(¥)及AT符號(hào)()。同一表中不許有重名列;(2)字段數(shù)據(jù)類型:見表3.2;(3)字段的長度、精度和小數(shù)位數(shù);21字段的長度:指
19、字段所能容納的最大數(shù)據(jù)量,但對不同的數(shù)據(jù)類型來說,長度對字段的意義可能有些不同。對字符串與UNICODE數(shù)據(jù)類型而言,長度代表字段所能容納的字符的數(shù)目,因此它會(huì)限制用戶所能輸入的文本長度。對數(shù)值類的數(shù)據(jù)類型而言,長度則代表字段使用多少個(gè)字節(jié)來存放數(shù)字。對BINARY、VARBINARY、IMAGE數(shù)據(jù)類型而言,長度代表字段所能容納的字節(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ù)。22經(jīng)常以如下所示的格式來表
20、示數(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ù)類型,其長度固定是4,精度固定是10,小數(shù)位數(shù)則固定是0,這表示字段將能存放10位數(shù)沒有小數(shù)點(diǎn)的整數(shù)。存儲(chǔ)大小則是4個(gè)字節(jié)。(4)NULL值與DEFAULT值DEFAULT值表示某一字段的默認(rèn)值,當(dāng)沒有輸入數(shù)據(jù)時(shí),則使用此默認(rèn)的值。232. 創(chuàng)建數(shù)據(jù)表
21、的SQL語法格式在SQL語言中,使用語句CREATE TABLE創(chuàng)建數(shù)據(jù)表,其基本語法格式為:CREATE TABLE (,|)是合法標(biāo)識(shí)符,最多可有128個(gè)字符,如S,SC,C,不允許重名。:DEFAULT DEFAULT:若是某字段設(shè)置有默認(rèn)值,當(dāng)該字段未被輸入數(shù)據(jù)時(shí),則以該默認(rèn)值自動(dòng)填入該字段。24例3.4 建立一學(xué)生表CREATE TABLE S(SNO CHAR(8) ,SN VARCHAR(20),AGE INT,SEX CHAR(2) DEFAULT 男 ,DEPT VARCHAR(20);執(zhí)行該語句后,便產(chǎn)生了學(xué)生基本表的表框架,此表為一個(gè)空表。其中,SEX列的缺省值為“男”。
22、 25實(shí)例2: 設(shè)某商業(yè)集團(tuán)數(shù)據(jù)庫中有三個(gè)實(shí)體集。一是“倉庫”實(shí)體集,屬性有倉庫號(hào)、倉庫名和地址等;二是“商店”實(shí)體集,屬性有商店號(hào)、商店名、地址等;三是“商品”實(shí)體集,屬性有商品號(hào)、商品名、單價(jià)。 1.創(chuàng)建倉庫表,商店表,商品表。 26實(shí)例2: 設(shè)某商業(yè)集團(tuán)數(shù)據(jù)庫中有三個(gè)實(shí)體集。一是“倉庫”實(shí)體集,屬性有倉庫號(hào)、倉庫名和地址等;二是“商店”實(shí)體集,屬性有商店號(hào)、商店名、地址等;三是“商品”實(shí)體集,屬性有商品號(hào)、商品名、單價(jià)。 設(shè)倉庫與商品之間存在“庫存”聯(lián)系,每個(gè)倉庫可存儲(chǔ)若干種商品,每種商品存儲(chǔ)在若干倉庫中,每個(gè)倉庫每存儲(chǔ)一種商品有個(gè)日期及存儲(chǔ)量,它的關(guān)系模式是:庫存(倉庫號(hào),商品號(hào),日期
23、,庫存量); 1.使用SQL創(chuàng)建倉庫表,商店表,商品表以及庫存表。2.要求倉庫表中倉庫號(hào)為主鍵,倉庫地址唯一。 商店表中商店號(hào)為主鍵,商店名不能為空值。 商品表中商品號(hào)為主鍵,單價(jià)大于0。 273. 定義完整性約束在SQL SERVER中,對于基本表的約束分為列約束和表約束。列約束是對某一個(gè)特定列的約束,包含在列定義中,直接跟在該列的其他定義之后,用空格分隔,不必指定列名;表約束與列定義相互獨(dú)立,不包括在列定義中,通常用于對多個(gè)列一起進(jìn)行約束,與列定義用,分隔,定義表約束時(shí)必須指出要約束的那些列的名稱。完整性約束的基本語法格式為: CONSTRAINT 約束名:約束不指定名稱時(shí),系統(tǒng)會(huì)給定一個(gè)
24、名稱。28約束類型:在定義完整性約束時(shí)必須指定完整性約束的類型。在SQL SERVER中可以定義五種類型的完整性約束,下面分別加以介紹:(1)NULL/NOT NULL是否允許該字段的值為NULL。NULL值不是0也不是空白,更不是填入字符串“NULL”,而是表示“不知道”、“不確定”或“沒有數(shù)據(jù)”的意思。當(dāng)某一字段的值一定要輸入才有意義的時(shí)候,則可以設(shè)置為NOT NULL。如主鍵列就不允許出現(xiàn)空值,否則就失去了唯一標(biāo)識(shí)一條記錄的作用只能用于定義列約束,其語法格式如下:CONSTRAINT NULL|NOT NULL 29例3.5 建立一個(gè)S表,對SNO字段進(jìn)行NOT NULL約束。CREAT
25、E TABLE S(SNO CHAR(10) CONSTRAINT S_CONS NOT NULL,SN VARCHAR(20),AGE INT,SEX CHAR(2) DEFAULT 男 ,DEPT VARCHAR(20);當(dāng)SNO為空時(shí),系統(tǒng)給出錯(cuò)誤信息,無NOT NULL約束時(shí),系統(tǒng)缺省為NULL。其中S_CONS為指定的約束名稱,當(dāng)約束名稱省略時(shí),系統(tǒng)自動(dòng)產(chǎn)生一個(gè)名字。如下列功能同上,只是省略約束名稱。 30CREATE TABLE S(SNO CHAR(10) NOT NULL ,SN VARCHAR(20),AGE INT,SEX CHAR(2) DEFAULT 男 ,DEPT V
26、ARCHAR(20); 31(2)UNIQUE約束UNIQUE約束用于指明基本表在某一列或多個(gè)列的組合上的取值必須唯一。定義了UNIQUE約束的那些列稱為唯一鍵,系統(tǒng)自動(dòng)為唯一鍵建立唯一索引,從而保證了唯一鍵的唯一性。唯一鍵允許為空,但系統(tǒng)為保證其唯一性,最多只可以出現(xiàn)一個(gè)NULL值。UNIQUE既可用于列約束,也可用于表約束。UNIQUE用于定義列約束時(shí),其語法格式如下:CONSTRAINT UNIQUE例3.6 建立一個(gè)S表,定義SN為唯一鍵。CREATE TABLE S(SNO CHAR(6),SN CHAR(8) CONSTRAINT SN_UNIQ UNIQUE,SEX CHAR(2
27、),AGE NUMERIC(2);32其中SN_UNIQ為指定的約束名稱,約束名稱可以省略,如下例:CREATE TABLE S(SNO CHAR(6),SN CHAR(8) UNIQUE,SEX CHAR(2),AGE NUMERIC(2);UNIQUE用于定義表約束時(shí),其語法格式如下: CONSTRAINT UNIQUE(,)33例3.7 建立一個(gè)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建立唯一索引,確保同一性別
28、的學(xué)生沒有重名。(3)PRIMARY KEY約束PRIMARY KEY約束用于定義基本表的主鍵,起唯一標(biāo)識(shí)作用,其值不能為NULL,也不能重復(fù),以此來保證實(shí)體的完整性。 34PRIMARY KEY與UNIQUE約束類似,通過建立唯一索引來保證基本表在主鍵列取值的唯一性,但它們之間存在著很大的區(qū)別:在一個(gè)基本表中只能定義一個(gè)PRIMARY KEY約束,但可定義多個(gè)UNIQUE約束;對于指定為PRIMARY KEY的一個(gè)列或多個(gè)列的組合,其中任何一個(gè)列都不能出現(xiàn)空值,而對于UNIQUE所約束的唯一鍵,則允許為空。注意:不能為同一個(gè)列或一組列既定義UNIQUE約束,又定義PRIMARY KEY約束。
29、PRIMARY KEY既可用于列約束,也可用于表約束。PRIMARY KEY用于定義列約束時(shí),其語法格式如下:CONSTRAINT PRIMARY KEY35例3.8 建立一個(gè)S表,定義SNO為S的主鍵CREATE TABLE S(SNO CHAR(5) NOT NULL CONSTRAINT S_PRIM PRIMARY KEY,SN CHAR(8),AGE NUMERIC(2);PRIMARY KEY用于定義表約束時(shí),即將某些列的組合定義為主鍵,其語法格式如下: CONSTRAINT S PRIMARY KEY ()36例3.9 建立一個(gè)SC表,定義SNO+CNO為SC的主鍵CREATE
30、TABLE SC(SNO CHAR(5) NOT NULL,CNO CHAR(5) NOT NULL,SCORE NUMERIC(3),CONSTRAINT SC_PRIM PRIMARY KEY(SNO,CNO);37(4)FOREIGN KEY約束FOREIGN KEY約束指定某一個(gè)列或一組列作為外部鍵,其中,包含外部鍵的表稱為從表,包含外部鍵所引用的主鍵或唯一鍵的表稱主表。系統(tǒng)保證從表在外部鍵上的取值要么是主表中某一個(gè)主鍵值或唯一鍵值,要么取空值。以此保證兩個(gè)表之間的連接,確保了實(shí)體的參照完整性。FOREIGN KEY既可用于列約束,也可用于表約束,其語法格式為:CONSTRAINT F
31、OREIGN KEY REFERENCES ()38例3.10 建立一個(gè)SC表,定義SNO,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);39(5)CHECK約束CHECK約束用來檢查字段值所允許的
32、范圍,如,一個(gè)字段只能輸入整數(shù),而且限定在0-100的整數(shù),以此來保證域的完整性。CHECK既可用于列約束,也可用于表約束,其語法格式為:CONSTRAINT CHECK ()例3.10 建立一個(gè)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);40例3.11 建立包含完整性定義的學(xué)生表CREATE TABLE S(SNO CHAR(6) CONSTRAINT S_PRIM
33、PRIMARY KEY,SN CHAR(8) CONSTRAINT SN_CONS NOT NULL,AGE NUMERIC(2) CONSTRAINT AGE_CONS NOT NULLCONSTRAINT AGE_CHK CHECK (AGE BETWEEN 15 AND 50),SEX CHAR(2) DEFAULT 男,DEPT CHAR(10) CONSTRAINT DEPT_CONS NOT NULL);41實(shí)例2: 設(shè)某商業(yè)集團(tuán)數(shù)據(jù)庫中有三個(gè)實(shí)體集。一是“倉庫”實(shí)體集,屬性有倉庫號(hào)、倉庫名和地址等;二是“商店”實(shí)體集,屬性有商店號(hào)、商店名、地址等;三是“商品”實(shí)體集,屬性有商品號(hào)
34、、商品名、單價(jià)。 設(shè)倉庫與商品之間存在“庫存”聯(lián)系,每個(gè)倉庫可存儲(chǔ)若干種商品,每種商品存儲(chǔ)在若干倉庫中,每個(gè)倉庫每存儲(chǔ)一種商品有個(gè)日期及存儲(chǔ)量,它的關(guān)系模式是:庫存(倉庫號(hào),商品號(hào),日期,庫存量); 1.使用SQL創(chuàng)建倉庫表,商店表,商品表以及庫存表。2.要求倉庫表中倉庫號(hào)為主鍵,倉庫地址唯一。 商店表中商店號(hào)為主鍵,商店名不能為空值。 商品表中商品號(hào)為主鍵,單價(jià)大于0。 423.2.3.2 修改基本表由于應(yīng)用環(huán)境和應(yīng)用需求的變化,經(jīng)常需要修改基本表的結(jié)構(gòu),比如,增加新列和完整性約束、修改原有的列定義和完整性約束等。SQL語言使用ALTER TABLE命令來完成這一功能,有如下三種修改方式:語
35、句格式 ALTER TABLE ALTER COLUMN ADD 完整性約束 DROP | ;:要修改的基本表ALTER COLUMN子句:用于修改列ADD子句:增加新列和新的完整性約束條件DROP子句:刪除指定列或完整性約束條件43ADD方式用于增加新列和完整性約束,定義方式同CREATE TABLE語句中的定義方式相同,其語法格式為:ALTER TABLE ADD | 例3.12 在S表中增加一個(gè)班號(hào)列和住址列。ALTER TABLE S ADDCLASS_NO CHAR(6),ADDRESS CHAR(40)44注意:使用此方式增加的新列自動(dòng)填充NULL值,所以不能為增加的新列指定NOT
36、 NULL約束 。例3.13 在SC表中增加完整性約束定義,使SCORE在0-100之間。ALTER TABLE SC ADD CONSTRAINT SCORE_CHK CHECK(SCORE BETWEEN 0 AND 100)452. ALTER 方式用于修改某些列,其語法格式為:ALTER TABLEALTER COLUMN NULL|NOT NULL例3.14 把S表中的SNO列加寬到8位字符寬度ALTER TABLE S ALTER COLUMNSNO CHAR(8)46注意:使用此方式有如下一些限制:不能改變列名;不能將含有空值的列的定義修改為NOT NULL約束;若列中已有數(shù)據(jù),
37、則不能減少該列的寬度,也不能改變其數(shù)據(jù)類型;只能修改NULL|NOT NULL約束,其它類型的約束在修改之前必須先刪除,然后再重新添加修改過的約束定義。 47例3.15 刪除S表中的AGE_CHK約束ALTER TABLE SDROP CONSTRAINT AGE_CHK3.2.3.3 改變基本表的名字使用RENAME命令,可以改變基本表的名字,其語法格式為:RENAME TO 例3.16 將S表的名字更改為STUDENTRENAME S TO STUDENT483.DROP方式刪除完整性約束定義,其語法格式為:ALTER TABLEDROP CONSTRAINT 49實(shí)例2: 設(shè)某商業(yè)集團(tuán)數(shù)
38、據(jù)庫中有三個(gè)實(shí)體集。一是“倉庫”實(shí)體集,屬性有倉庫號(hào)、倉庫名和地址等;二是“商店”實(shí)體集,屬性有商店號(hào)、商店名、地址等;三是“商品”實(shí)體集,屬性有商品號(hào)、商品名、單價(jià)。 設(shè)倉庫與商品之間存在“庫存”聯(lián)系,每個(gè)倉庫可存儲(chǔ)若干種商品,每種商品存儲(chǔ)在若干倉庫中,每個(gè)倉庫每存儲(chǔ)一種商品有個(gè)日期及存儲(chǔ)量,它的關(guān)系模式是:庫存(倉庫號(hào),商品號(hào),日期,庫存量); 1.修改商品表,添加產(chǎn)地屬性。2. 為庫存量添加完整性約束條件使庫存量值大于等于0。3.刪除商品表中商品地址唯一的完整性約束條件 503.2.3.4 刪除基本表當(dāng)某個(gè)基本表無用時(shí),可將其刪除。刪除后,該表中的數(shù)據(jù)和在此表上所建的索引都被刪除,而建立
39、在該表上的視圖不會(huì)隨之刪除,系統(tǒng)將繼續(xù)保留其定義,但已無法使用。如果重新恢復(fù)該表,這些視圖可重新使用。刪除表的語法格式:DROP TABLE 例3.17 刪除表STUDENTUSE STUDENT DROP TABLE STUDENT注意:只能刪除自己建立的表,不能刪除其他用戶所建的表。513.2.5 設(shè)計(jì)、創(chuàng)建和維護(hù)索引3.2.5.1 索引的作用在日常生活中我們會(huì)經(jīng)常遇到索引,例如圖書目錄、詞典索引等。借助索引,人們會(huì)很快地找到需要的東西。索引是數(shù)據(jù)庫隨機(jī)檢索的常用手段,它實(shí)際上就是記錄的關(guān)鍵字與其相應(yīng)地址的對應(yīng)表。例如,當(dāng)我們要在本書中查找有關(guān)“SQL查詢”的內(nèi)容時(shí),應(yīng)該先通過目錄找到“S
40、QL查詢”所對應(yīng)的頁碼,然后從該頁碼中找出所要的信息。這種方法比直接翻閱書的內(nèi)容要快。如果把數(shù)據(jù)庫表比作一本書,則表的索引就如書的目錄一樣,通過索引可大大提高查詢速度。此外,在SQL SERVER中,行的唯一性也是通過建立唯一索引來維護(hù)的。 索引的作用可歸納為:1. 加快查詢速度;2. 保證行的唯一性。523.2.5.2 索引的分類1. 按照索引記錄的存放位置可分為聚集索引與非聚集索引聚集索引:按照索引的字段排列記錄,并且依照排好的順序?qū)⒂涗洿鎯?chǔ)在表中。非聚集索引:按照索引的字段排列記錄,但是排列的結(jié)果并不會(huì)存儲(chǔ)在表中,而是另外存儲(chǔ)。2. 唯一索引的概念唯一索引表示表中每一個(gè)索引值只對應(yīng)唯一的
41、數(shù)據(jù)記錄,這與表的PRIMARY KEY的特性類似,因此唯一性索引常用于PRIMARY KEY的字段上,以區(qū)別每一筆記錄。當(dāng)表中有被設(shè)置為UNIQUE的字段時(shí),SQL SERVER會(huì)自動(dòng)建立一個(gè)非聚集的唯一性索引。而當(dāng)表中有PRIMARY KEY的字段時(shí),SQL SERVER會(huì)在PRIMARY KEY字段建立一個(gè)聚集索引。3. 復(fù)合索引的概念復(fù)合索引是將兩個(gè)字段或多個(gè)字段組合起來建立的索引,而單獨(dú)的字段允許有重復(fù)的值。533.2.5.3 建立索引建立索引的語句是CREATE INDEX,其語法格式為:CREATE UNIQUE CLUSTER INDEX ON ( 次序 , 次序)UNIQUE
42、表明建立唯一索引。CLUSTER表示建立聚集索引。次序用來指定索引值的排列順序,可為ASC(升序)或DESC(降序),缺省值為ASC。例3.18 為表SC在SNO和CNO上建立唯一索引。USE STUDENTCREATE UNIQUE INDEX SCI ON SC(SNO,CNO)54執(zhí)行此命令后,為SC表建立一個(gè)索引名為SCI的唯一索引,此索引為SNO和CNO兩列的復(fù)合索引,即對SC表中的行先按SNO的遞增順序索引,對于相同的SNO,又按CNO的遞增順序索引。由于有UNIQUE的限制,所以該索引在(SNO,CNO)組合列的排序上具有唯一性,不存在重復(fù)值。例3.19 為教師表T在TN上建立聚
43、集索引。CREATE CLUSTER INDEX TI ON T(TN)執(zhí)行此命令后,為T表建立一個(gè)索引名為TI的聚集索引,T表中的記錄將按照TN值的升序存放。55注意:1. 改變表中的數(shù)據(jù)(如增加或刪除記錄)時(shí),索引將自動(dòng)更新。索引建立后,在查詢使用該列時(shí),系統(tǒng)將自動(dòng)使用索引進(jìn)行查詢。 2. 索引數(shù)目無限制,但索引越多,更新數(shù)據(jù)的速度越慢。對于僅用于查詢的表可多建索引,對于數(shù)據(jù)更新頻繁的表則應(yīng)少建索引。3.2.5.4 刪除索引建立索引是為了提高查詢速度,但隨著索引的增多,數(shù)據(jù)更新時(shí),系統(tǒng)會(huì)花費(fèi)許多時(shí)間來維護(hù)索引。這時(shí),應(yīng)刪除不必要的索引。刪除索引的語句是DROP INDEX,其語法格式為:D
44、ROP INDEX 數(shù)據(jù)表名.索引名例3.20 刪除表SC的索引SCI。DROP INDEX SC.SCI56實(shí)例3:現(xiàn)有關(guān)系模式如下:部門(部門編號(hào),部門名稱,電話)員工(員工編號(hào),姓名,性別,部門編號(hào),職務(wù))項(xiàng)目(項(xiàng)目編號(hào),項(xiàng)目名稱,預(yù)算)施工(員工編號(hào),項(xiàng)目編號(hào),工時(shí))1.創(chuàng)建部門表,部門編號(hào)數(shù)據(jù)類型為CHAR(10)且為主鍵,部門名稱數(shù)據(jù)類型為CHAR(50),電話數(shù)據(jù)類型為CHAR(11);2.創(chuàng)建員工表,員工編號(hào)數(shù)據(jù)類型為CHAR(10)且為主鍵,姓名數(shù)據(jù)類型為CHAR(20),性別數(shù)據(jù)類型為CHAR(2),部門編號(hào)數(shù)據(jù)類型為CHAR(10)且為外鍵,職務(wù)數(shù)據(jù)類型為VARCHAR(
45、20);3.創(chuàng)建項(xiàng)目表,項(xiàng)目編號(hào)數(shù)據(jù)類型為CHAR(10)且為主鍵,項(xiàng)目名稱數(shù)據(jù)類型為CHAR(20),預(yù)算數(shù)據(jù)類型為INT;4.創(chuàng)建施工表,員工編號(hào)數(shù)據(jù)類型為CHAR(10),項(xiàng)目標(biāo)號(hào)數(shù)據(jù)類型為CHAR(10),(員工編號(hào),項(xiàng)目標(biāo)號(hào))為主鍵,工時(shí)數(shù)據(jù)類型為FLOAT;573.3 SQL數(shù)據(jù)查詢3.3.1 SELECT命令的格式與基本使用數(shù)據(jù)查詢是數(shù)據(jù)庫中最常見的操作。SQL語言提供SELECT語句,通過查詢操作可得到所需的信息。SELECT語句的一般格式為:SELECT列名,列名FROM表名或視圖名,表名或視圖名WHERE檢索條件GROUP BY HAVING ORDER BY ASC|DE
46、SC;58SELECT語句的格式:SELECTALL|DISTINCTTOP N PERCENTWITH TIES列名1 AS 別名1, 列名2 AS 別名2INTO 新表名FROM 表名 1AS 表1別名INNER|RIGHT|FULL|OUTEROUTERJOIN 表名2 AS 表2別名ON 條件59查詢的結(jié)果是仍是一個(gè)表。SELECT語句的執(zhí)行過程是:根據(jù)WHERE子句的檢索條件,從FROM子句指定的基本表或視圖中選取滿足條件的元組,再按照SELECT子句中指定的列,投影得到結(jié)果表。如果有GROUP子句,則將查詢結(jié)果按照相同的值進(jìn)行分組。如果GROUP子句后有HAVING短語,則只輸出滿
47、足HAVING條件的元組。如果有ORDER子句,查詢結(jié)果還要按照的值進(jìn)行排序。60例3.21 查詢?nèi)w學(xué)生的學(xué)號(hào)、姓名和年齡。SELECT SNO, SN, AGE FROM S例3.22 查詢學(xué)生的全部信息。SELECT * FROM S用 * 表示S表的全部列名,而不必逐一列出。 例3.23 查詢選修了課程的學(xué)生號(hào)。SELECT DISTINCT SNO FROM SC查詢結(jié)果中的重復(fù)行被去掉上述查詢均為不使用WHERE子句的無條件查詢,也稱作投影查詢。61另外,利用投影查詢可控制列名的順序,并可通過指定別名改變查詢結(jié)果的列標(biāo)題的名字。例3.24 查詢?nèi)w學(xué)生的姓名、學(xué)號(hào)和年齡。SELEC
48、T SNAME NAME, SNO, AGE FROM S其中,NAME為SNAME的別名 623.3.2條件查詢當(dāng)要在表中找出滿足某些條件的行時(shí),則需使用WHERE子句指定查詢條件。WHERE子句中,條件通常通過三部分來描述:1 列名;2 比較運(yùn)算符;3 列名、常數(shù)。 運(yùn)算符含義=, , =, 85643.3.2.2 多重條件查詢當(dāng)WHERE子句需要指定一個(gè)以上的查詢條件時(shí),則需要使用邏輯運(yùn)算符AND、OR和NOT將其連結(jié)成復(fù)合的邏輯表達(dá)式。其優(yōu)先級由高到低為:NOT、AND、OR,用戶可以使用括號(hào)改變優(yōu)先級。例3.27 查詢選修C1或C2且分?jǐn)?shù)大于等于85分學(xué)生的的學(xué)號(hào)、課程號(hào)和成績。SE
49、LECT SNO,CNO,SCOREFROM SCWHERE(CNO=C1 OR CNO=C2) AND SCORE=85 653.3.2.3 確定范圍例3.28 查詢工資在1000至1500之間的教師的教師號(hào)、姓名及職稱。SELECT TNO,TN,PROFFROM TWHERE SAL BETWEEN 1000 AND 1500等價(jià)于SELECT TNO,TN,PROFFROM TWHERE SAL=1000 AND SAL=150066例3.29 查詢工資不在1000至1500之間的教師的教師號(hào)、姓名及職稱。SELECT TNO,TN,PROFFROM TWHERE SAL NOT BE
50、TWEEN 1000 AND 15003.2.2.4 確定集合利用“IN”操作可以查詢屬性值屬于指定集合的元組。例3.30 查詢選修C1或C2的學(xué)生的學(xué)號(hào)、課程號(hào)和成績。SELECT SNO, CNO, SCORE FROM SC WHERE CNO IN(C1, C2)此語句也可以使用邏輯運(yùn)算符“OR”實(shí)現(xiàn)。67SELECT SNO, CNO, SCORE FROM SC WHERE CNO=C1 OR CNO= C2利用“NOT IN”可以查詢指定集合外的元組。 例3.31 查詢沒有選修C1,也沒有選修C2的學(xué)生的學(xué)號(hào)、課程號(hào)和成績。SELECT SNO, CNO, SCORE FROM
51、SC WHERE CNO NOT IN(C1, C2)等價(jià)于:SELECT SNO, CNO, SCORE FROM SC WHERE CNO!=C1 AND CNO!= C2683.3.2.5 部分匹配查詢上例均屬于完全匹配查詢,當(dāng)不知道完全精確的値時(shí),用戶還可以使用LIKE或NOT LIKE進(jìn)行部分匹配查詢(也稱模糊查詢)。LIKE定義的一般格式為: LIKE 屬性名必須為字符型,字符串常量的字符可以包含如下兩個(gè)特殊符號(hào):%:表示任意知長度的字符串;_:表示任意單個(gè)字符。 例3.32 查詢所有姓張的教師的教師號(hào)和姓名。SELECT TNO, TN FROM TWHERE TN LIKE 張
52、%69例3.33 查詢姓名中第二個(gè)漢字是“力”的教師號(hào)和姓名。SELECT TNO, TN FROM TWHERE TN LIKE _ _力%注:一個(gè)漢字占兩個(gè)字符。3.3.2.6空值查詢某個(gè)字段沒有值稱之為具有空值(NULL)。通常沒有為一個(gè)列輸入值時(shí),該列的值就是空值??罩挡煌诹愫涂崭?,它不占任何存儲(chǔ)空間。例如,某些學(xué)生選課后沒有參加考試,有選課記錄,但沒有考試成績,考試成績?yōu)榭罩?,這與參加考試,成績?yōu)榱惴值牟煌?70例3.34 查詢沒有考試成績的學(xué)生的學(xué)號(hào)和相應(yīng)的課程號(hào)。SELECT SNO, CNOFROM SCWHERE SCORE IS NULL注意:這里的空值條件為IS NU
53、LL,不能寫成SCORE=NULL。713.2.2常用庫函數(shù)及統(tǒng)計(jì)匯總查詢SQL提供了許多庫函數(shù),增強(qiáng)了基本檢索能力。常用的庫函數(shù),如表3.2所示函數(shù)名稱功能AVG按列計(jì)算平均值SUM按列計(jì)算值的總和MAX求一列中的最大值MIN求一列中的最小值COUNT按列值計(jì)個(gè)數(shù)72例3.35 求學(xué)號(hào)為S1學(xué)生的總分和平均分。SELECT SUM(SCORE) AS TotalScore, AVG(SCORE) AS AveScoreFROM SCWHERE (SNO = S1) 注意:函數(shù)SUM和AVG只能對數(shù)值型字段進(jìn)行計(jì)算。73例3.36 求選修C1號(hào)課程的最高分、最低分及之間相差的分?jǐn)?shù)SELECT
54、MAX(SCORE) AS MaxScore, MIN(SCORE) AS MinScore, MAX(SCORE) - MIN(SCORE) AS DiffFROM SCWHERE (CNO = C1) 例3.37 求計(jì)算機(jī)系學(xué)生的總數(shù)SELECT COUNT(SNO) FROM SWHERE DEPT=計(jì)算機(jī)74例3.38 求學(xué)校中共有多少個(gè)系SELECT COUNT(DISTINCT DEPT) AS DeptNum FROM S注意:加入關(guān)鍵字DISTINCT后表示消去重復(fù)行,可計(jì)算字段“DEPT“不同值的數(shù)目。COUNT函數(shù)對空值不計(jì)算,但對零進(jìn)行計(jì)算。例3.39 統(tǒng)計(jì)有成績同學(xué)的人
55、數(shù)SELECT COUNT (SCORE) FROM SC上例中成績?yōu)榱愕耐瑢W(xué)計(jì)算在內(nèi),沒有成績(即為空值)的不計(jì)算。 75例3.40 利用特殊函數(shù)COUNT(*)求計(jì)算機(jī)系學(xué)生的總數(shù)SELECT COUNT(*) FROM SWHERE DEPT=計(jì)算機(jī)COUNT(*)用來統(tǒng)計(jì)元組的個(gè)數(shù)不消除重復(fù)行,不允許使用DISTINCT關(guān)鍵字。763.3.3 分組查詢GROUP BY子句可以將查詢結(jié)果按屬性列或?qū)傩粤薪M合在行的方向上進(jìn)行分組,每組在屬性列或?qū)傩粤薪M合上具有相同的值。例3.42 查詢各位教師的教師號(hào)及其任課的門數(shù)。SELECT TNO,COUNT(*) AS C_NUMFROM TCGR
56、OUP BY TNO GROUP BY子句按TNO的值分組,所有具有相同TNO的元組為一組,對每一組使用函數(shù)COUNT進(jìn)行計(jì)算,統(tǒng)計(jì)出各位教師任課的門數(shù)。 77若在分組后還要按照一定的條件進(jìn)行篩選,則需使用HAVING子句。 例3.43 查詢選修兩門以上課程的學(xué)生學(xué)號(hào)和選課門數(shù)SELECT SNO,COUNT(*) AS SC_NUM FROM SCGROUP BY SNO HAVING COUNT(*)=2 GROUP BY子句按SNO的值分組,所有具有相同SNO的元組為一組,對每一組使用函數(shù)COUNT進(jìn)行計(jì)算,統(tǒng)計(jì)出每位學(xué)生選課的門數(shù)。HAVING子句去掉不滿足COUNT(*)=2的組。7
57、8當(dāng)在一個(gè)SQL查詢中同時(shí)使用WHERE子句,GROUP BY 子句和HAVING子句時(shí),其順序是WHEREGROUP BY HAVING。WHERE與HAVING子句的根本區(qū)別在于作用對象不同。WHERE子句作用于基本表或視圖,從中選擇滿足條件的元組;HAVING子句作用于組,選擇滿足條件的組,必須用于GROUP BY子句之后,但GROUP BY子句可沒有HAVING子句。793.3.5 查詢的排序當(dāng)需要對查詢結(jié)果排序時(shí),應(yīng)該使用ORDER BY子句ORDER BY子句必須出現(xiàn)在其他子句之后排序方式可以指定,DESC為降序,ASC為升序,缺省時(shí)為升序例3.44 查詢選修C1 的學(xué)生學(xué)號(hào)和成績
58、,并按成績降序排列。SELECT SNO, SCOREFROM SCWHERE CNO=C1ORDER BY SCORE DESC 80例3.45 查詢選修C2、C3、C4或C5課程的學(xué)號(hào)、課程號(hào)和成績,查詢結(jié)果按學(xué)號(hào)升序排列,學(xué)號(hào)相同再按成績降序排列。SELECT SNO,CNO, SCORE FROM SCWHERE CNO IN (C2 ,C3, C4,C5)ORDER BY SNO,SCORE DESC 例3.46 求選課在三門以上且各門課程均及格的學(xué)生的學(xué)號(hào)及其總成績,查詢結(jié)果按總成績降序列出。SELECT SNO,SUM(SCORE) AS TotalScore FROM SCWH
59、ERE SCORE=60GROUP BY SNOHAVING COUNT(*)=3ORDER BY SUM(SCORE) DESC81此語句為分組排序,執(zhí)行過程如下:1.(FROM)取出整個(gè)SC2.(WHERE)篩選SCORE=60的元組3.(GROUP BY)將選出的元組按SNO分組4.(HAVING)篩選選課三門以上的分組5.(SELECT)以剩下的組中提取學(xué)號(hào)和總成績6.(ORDER BY)將選取結(jié)果排序ORDER BY SUM(SCORE) DESC 可以改寫成ORDER BY 2 DESC2 代表查詢結(jié)果的第二列。 823.3.6 數(shù)據(jù)表連接及連接查詢數(shù)據(jù)表之間的聯(lián)系是通過表的字段值
60、來體現(xiàn)的,這種字段稱為連接字段。連接操作的目的就是通過加在連接字段的條件將多個(gè)表連接起來,以便從多個(gè)表中查詢數(shù)據(jù)。前面的查詢都是針對一個(gè)表進(jìn)行的,當(dāng)查詢同時(shí)涉及兩個(gè)以上的表時(shí),稱為連接查詢。表的連接方法有兩種:方法1:表之間滿足一定的條件的行進(jìn)行連接,此時(shí)FROM子句中指明進(jìn)行連接的表名,WHERE子句指明連接的列名及其連接條件。方法2:利用關(guān)鍵字JOIN進(jìn)行連接。83具體分為以下幾種:INNER JOIN :顯示符合條件的記錄,此為默認(rèn)值;LEFT (OUTER) JOIN:顯示符合條件的數(shù)據(jù)行以及左邊表中不符合條件的數(shù)據(jù)行,此時(shí)右邊數(shù)據(jù)行會(huì)以NULL來顯示,此稱為左連接;RIGHT (OU
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房地產(chǎn)承包經(jīng)營合同書
- 供應(yīng)鏈質(zhì)量管理實(shí)務(wù)操作指南
- 2025年市場營銷學(xué)課件:理論與中國市場
- 三農(nóng)村公共服務(wù)均等化與便捷化實(shí)施方案
- 網(wǎng)絡(luò)安全應(yīng)急響應(yīng)處理手冊
- 集成開發(fā)環(huán)境使用說明書
- 實(shí)習(xí)員工勞務(wù)合同
- 法律服務(wù)保密協(xié)議書
- 地產(chǎn)行業(yè)投資項(xiàng)目表
- 動(dòng)態(tài)字體大小調(diào)整實(shí)現(xiàn)辦法
- 貴州人民版五年級勞動(dòng)下冊全冊教案
- 2024年高考英語易錯(cuò)題 閱讀理解:推理判斷題4大陷阱(教師版新高考專用)
- 醫(yī)院環(huán)境衛(wèi)生學(xué)監(jiān)測和院感控制課件
- 《力與形變》教學(xué)課件(一)
- 湖北省2024年村干部定向考試真題
- 部編版三年級語文下冊期中試卷及參考答案
- JT-T-1199.1-2018綠色交通設(shè)施評估技術(shù)要求第1部分:綠色公路
- 酒店能耗分析報(bào)告
- 桃花紅杏花紅混聲合唱簡譜
- DL-T995-2016繼電保護(hù)和電網(wǎng)安全自動(dòng)裝置檢驗(yàn)規(guī)程
- 2024年蘇州農(nóng)業(yè)職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫含答案
評論
0/150
提交評論