結(jié)構(gòu)化查詢語(yǔ)言SQL_第1頁(yè)
結(jié)構(gòu)化查詢語(yǔ)言SQL_第2頁(yè)
結(jié)構(gòu)化查詢語(yǔ)言SQL_第3頁(yè)
結(jié)構(gòu)化查詢語(yǔ)言SQL_第4頁(yè)
結(jié)構(gòu)化查詢語(yǔ)言SQL_第5頁(yè)
已閱讀5頁(yè),還剩294頁(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)介

第三章結(jié)構(gòu)化查詢語(yǔ)言SQL

(關(guān)系數(shù)據(jù)標(biāo)準(zhǔn)語(yǔ)言)3.1SQL概述3.2數(shù)據(jù)定義3.3查詢3.4數(shù)據(jù)更新3.5視圖3.6數(shù)據(jù)控制3.7嵌入式SQL3.8ACCESS應(yīng)用組件3.1SQL概述3.1.1SQL的特點(diǎn)3.1.2SQL語(yǔ)言的基本概念3.1SQL概述

SQL語(yǔ)言是:1974年由Boyce和Chamberlin提出的。1975年至1979年IBM公司sanJoseResearchLaboratory研制的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)原形系統(tǒng)SystemR實(shí)現(xiàn)了這種語(yǔ)言。3.1SQL概述第一個(gè)SQL標(biāo)準(zhǔn)是1986年10月由美國(guó)國(guó)家標(biāo)準(zhǔn)局(AmericanNationalStandardinstitute,簡(jiǎn)稱ANSI)公布的,所以也稱該標(biāo)準(zhǔn)為SQL-----86。1989年國(guó)際標(biāo)準(zhǔn)化組織(InternationalOrganizationforStandardization,簡(jiǎn)稱ISO)標(biāo)準(zhǔn)(SQL-89)1992年又公布了SQL-92標(biāo)準(zhǔn)。目前新的SQL標(biāo)準(zhǔn):SQL33.1SQL概述結(jié)構(gòu)化查詢語(yǔ)言(structuredquerylanguage,簡(jiǎn)稱SQL)是一種介于關(guān)系代數(shù)與關(guān)系演算之間的語(yǔ)言,其功能包括查詢、操縱、定義和控制4個(gè)方面,是一個(gè)通用、功能極強(qiáng)的關(guān)系數(shù)據(jù)庫(kù)語(yǔ)言。目前已成為關(guān)系數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言大多數(shù)數(shù)據(jù)庫(kù)均用SQL作為共同的數(shù)據(jù)存取語(yǔ)言和標(biāo)準(zhǔn)接口,使不同數(shù)據(jù)庫(kù)系統(tǒng)之間的互操作有了共同的基礎(chǔ)。3.1.1SQL的特點(diǎn)1.綜合統(tǒng)一數(shù)據(jù)庫(kù)的主要功能是通過(guò)數(shù)據(jù)庫(kù)支持的數(shù)據(jù)語(yǔ)言來(lái)實(shí)現(xiàn)的。3.1.1SQL的特點(diǎn)非關(guān)系模型的數(shù)據(jù)語(yǔ)言一般都分為:*模式數(shù)據(jù)定義語(yǔ)言(schemadatadefinitionlanguage:DDL):用于定義模式、外模式、內(nèi)模式*數(shù)據(jù)存儲(chǔ)有關(guān)的描述語(yǔ)言(datastroragedescriptionlanguage,簡(jiǎn)稱DSDL):進(jìn)行數(shù)據(jù)的存取*數(shù)據(jù)操縱語(yǔ)言(datamanipulationlanguage,簡(jiǎn)稱DML)進(jìn)行數(shù)據(jù)的處置當(dāng)用戶數(shù)據(jù)庫(kù)投入運(yùn)行后,如果需要修改模式,必須停止現(xiàn)有數(shù)據(jù)庫(kù)的運(yùn)行,轉(zhuǎn)儲(chǔ)數(shù)據(jù),修改模式并編譯后再重裝數(shù)據(jù)庫(kù),因此很麻煩。3.1.1SQL的特點(diǎn)

于一體,風(fēng)格一致SQL語(yǔ)言集可以獨(dú)立完成數(shù)據(jù)庫(kù)生命周期中的全部活動(dòng),包括定義關(guān)系模式、錄入數(shù)據(jù)以建立數(shù)據(jù)庫(kù)、查詢、更新、維護(hù)、數(shù)據(jù)庫(kù)重構(gòu)、數(shù)據(jù)庫(kù)安全控制等一系列操作的要求,這就是為數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)開發(fā)提供了良好的環(huán)境。

3.1.1SQL的特點(diǎn)2.高度非過(guò)程化

只提“做什么”,不必指明“怎么做”——用戶無(wú)需了解存取路徑及物理地址——減輕用戶負(fù)擔(dān),提高效率。

3.面向集合的操作方式

不僅查找結(jié)果可以是集合,插入,刪除,更新也可以是元組,比非關(guān)系DBMS優(yōu)越。3.1.1SQL的特點(diǎn)4.以同一種語(yǔ)法結(jié)構(gòu)提供兩種使用方式5.語(yǔ)言簡(jiǎn)潔,易學(xué)易用SQL功能動(dòng)詞數(shù)據(jù)查詢SELECT數(shù)據(jù)定義CREATE,DROP,ALTER數(shù)據(jù)操縱INSERT,UPDATE,DELETE數(shù)據(jù)控制GRANT,REVOTE3.1.2SQL語(yǔ)言的基本概念SQL語(yǔ)言支持關(guān)系數(shù)據(jù)庫(kù)三級(jí)模式結(jié)構(gòu),如圖所示。其中外模式對(duì)于視圖(view)和部分基本表(basetable),模式對(duì)應(yīng)于基本表,內(nèi)模式對(duì)應(yīng)用存儲(chǔ)文件。SQL視圖1視圖2基本表1基本表2基本表3基本表4外模式模式存儲(chǔ)模式存儲(chǔ)文件1存儲(chǔ)文件23.1.2SQL語(yǔ)言的基本概念1.基本表是本身獨(dú)立存在的表,即實(shí)際存在DB中的表,而不是從其它表導(dǎo)出的。3.1.2SQL語(yǔ)言的基本概念特性:在關(guān)系數(shù)據(jù)庫(kù)中一個(gè)關(guān)系對(duì)應(yīng)一個(gè)表基本表可以有若干個(gè)索引一個(gè)基本表可以跨一個(gè)或若干個(gè)存儲(chǔ)文件一個(gè)存儲(chǔ)文件可以存儲(chǔ)一個(gè)或多個(gè)基本表一個(gè)存儲(chǔ)文件與外存儲(chǔ)器上的一個(gè)物理文件相對(duì)應(yīng)存儲(chǔ)文件和相關(guān)索引組成了關(guān)系的內(nèi)模式(存儲(chǔ)模式)基本表的集合組成關(guān)系模型,即全局概念模型。3.1.2SQL語(yǔ)言的基本概念2.視圖(View):從一個(gè)或幾個(gè)基本表或其它視圖導(dǎo)出來(lái)的表。特性:

視圖本身并不獨(dú)立存儲(chǔ)數(shù)據(jù),系統(tǒng)只保存視圖的定義從用戶的觀點(diǎn)出發(fā),基本表和視圖都是關(guān)系,用SQL一樣訪問(wèn),只是對(duì)視圖的修改受到一定限制

視圖可以當(dāng)作用戶按照應(yīng)用需要定義的外模式,即用戶的局部數(shù)據(jù)—邏輯結(jié)構(gòu)。

3.2數(shù)據(jù)定義3.2.1定義、刪除與修改基本表3.2.2建立與刪除索引

3.2.3ACCESS進(jìn)行數(shù)據(jù)定義3.2數(shù)據(jù)定義

關(guān)系數(shù)據(jù)庫(kù)的基本對(duì)象是表、視圖和索引。SQL的數(shù)據(jù)定義功能包括定義表、定義視圖和定義索引。索引是依附于基本表的,因此SQL通常不提供修改視圖定義和修改索引定義的操作。用戶如果想修改視圖定義或索引定義,只能先將它們刪除掉,然后再重建。不過(guò)有些關(guān)系數(shù)據(jù)庫(kù)產(chǎn)品如ORACLE允許直接修改視圖定義。3.2數(shù)據(jù)定義操作對(duì)象操作方式創(chuàng)建刪除修改表CREATETABLEDROPTABLEALTERTABLE視圖CTEATEVIEWDROPVIEW

索引CREATEINDEXDROPINDEX

表.SQL的數(shù)據(jù)定義語(yǔ)句

3.2.1定義、刪除與修改基本表

1.定義基本表SQL語(yǔ)言定義基本表格式如下:CREATETABLE<表名>

(<列名><數(shù)據(jù)類型>[列級(jí)完整性約束條件][,<列名><數(shù)據(jù)類型>[列級(jí)完整性約束條件]…][,<表級(jí)完整性約束條件>]);3.2.1定義、刪除與修改基本表例1.建立一個(gè)“學(xué)生”表student,它由學(xué)號(hào)Sno、姓名Sname、性別Ssex、年齡Sage、所在系Sdept五個(gè)屬性組成。其中學(xué)號(hào)不能為空,并且其值也唯一。student(Sno,Sname,Ssex,Sage,Sdept)CREATETABLEStudent(SnoCHAR(5)NOTNULLUNIQUE,/*列級(jí)完整性約束條件,Sno取值唯一,不取空值*/SnameCHAR(20),SsexCHAR(1),SageINT,SdeptCHAR(15));

3.2.1定義、刪除與修改基本表不同數(shù)據(jù)庫(kù)系統(tǒng)支持的數(shù)據(jù)類型不同。如IBMDB2支持的數(shù)據(jù)類型(常用):CHAR(n)字符INTEGER全字長(zhǎng)整數(shù)SMALLINT半字長(zhǎng)整數(shù)DECIMAL(x,y)十進(jìn)制數(shù)FLOAT(x,y)雙字長(zhǎng)浮點(diǎn)數(shù)Date日期3.2.1定義、刪除與修改基本表ACCESS數(shù)據(jù)類型:

設(shè)置數(shù)據(jù)類型大小文本(Text)(默認(rèn)值)文本或文本和數(shù)字的組合,或不需要計(jì)算的數(shù)字,例如電話號(hào)碼。最多為255個(gè)字符或長(zhǎng)度小于FieldSize屬性的設(shè)置值。MicrosoftAccess不會(huì)為文本字段中未使用的部分保留空間。備注(Memo)長(zhǎng)文本或文本和數(shù)字的組合。最多為65,535個(gè)字符(如果Memo字段是通過(guò)DAO來(lái)操作并且只有文本和數(shù)字[非二進(jìn)制數(shù)據(jù)]保存在其中,則Memo字段的大小受數(shù)據(jù)庫(kù)大小的限制)。3.2.1定義、刪除與修改基本表數(shù)字(Number)用于數(shù)學(xué)計(jì)算的數(shù)值數(shù)據(jù)。有關(guān)如何設(shè)置特定Number類型的詳細(xì)內(nèi)容,請(qǐng)參閱FieldSize屬性主題。1、2、4或8個(gè)字節(jié)(如果FieldSize屬性設(shè)置為ReplicationID,則為16個(gè)字節(jié))。日期/時(shí)間(Date)從100到9999年的日期與時(shí)間值8個(gè)字節(jié)貨幣(Current)貨幣值或用于數(shù)學(xué)計(jì)算的數(shù)值數(shù)據(jù),這里的數(shù)學(xué)計(jì)算的對(duì)象是帶有1到4位小數(shù)的數(shù)據(jù)。精確到小數(shù)點(diǎn)左邊15位和小數(shù)點(diǎn)右邊4位。8個(gè)字節(jié)3.2.1定義、刪除與修改基本表自動(dòng)編號(hào)(AutoNumber)當(dāng)向表中添加一條新記錄時(shí),由MicrosoftAccess指定的一個(gè)唯一的順序號(hào)(每次加1)或隨機(jī)數(shù)。AutoNumber字段不能更新。有關(guān)詳細(xì)內(nèi)容,請(qǐng)參閱NewValues屬性主題。4個(gè)字節(jié)(如果FieldSize屬性設(shè)置為ReplicationID則為16個(gè)字節(jié))。是/否(Boolean)Yes和No值,以及只包含兩者之一的字段(Yes/No、True/False或On/Off)。1位OLE對(duì)象(OLEObject)MicrosoftAccess表中鏈接或嵌入的對(duì)象(例如MicrosoftExcel電子表格、MicrosoftWord文檔、圖形、聲音或其他二進(jìn)制數(shù)據(jù))。最多為1G字節(jié)(受可用磁盤空間限制)。3.2.1定義、刪除與修改基本表以下列形式在ACCESS中定義表可以CREATETABLEStu(SnoCHAR(5)NOTNULLUNIQUEPRIMARYKEY,SnameCHAR(20)UNIQUE,SsexCHAR(1),SageINT,SdeptCHAR(15));3.2.1定義、刪除與修改基本表以下列形式在ACCESS中定義表也可以CREATETABLEStu(SnoTEXT(5)NOTNULLUNIQUEPRIMARYKEY,SnameTEXT(20)UNIQUE,SsexTEXT(1),SageNUMBER,SdeptTEXT(15));3.2.1定義、刪除與修改基本表2.修改基本表

隨著應(yīng)用環(huán)境和用需求的變化,有時(shí)需要修改已建立好的基本表,包括增加新列、增加新的完整性約束條件、修改原有的列定義或刪除已有的完整性約束條件等。3.2.1定義、刪除與修改基本表SQL語(yǔ)言用ALTERTABLE語(yǔ)句修改基本表,其一般格式為:

ALTERTABLE<表名>[ADD<新列名><數(shù)據(jù)類型>[完整性約束]][DROP<完整性約束名>][MODIFY<列名><數(shù)據(jù)類型>];3.2.1定義、刪除與修改基本表例2.向stuedent表增加“入學(xué)時(shí)間”(日期型)列。ALTERTABLEstuedentADDScomeDATE;如果原表中已有數(shù)據(jù),這些數(shù)據(jù)的新增列值均為空。3.2.1定義、刪除與修改基本表2.修改基本表例3.將年齡的數(shù)據(jù)類型改為半字長(zhǎng)型。ALTERTABLEstuedentMODIFYSageSMALLINT;修改原有列定義可能破壞已有數(shù)據(jù)。3.2.1定義、刪除與修改基本表2.修改基本表例4.刪除學(xué)生姓名必須取唯一值的約束。ALTERTABLEstudentDROPUNIQUE(Sname);SQL沒(méi)提供刪除列語(yǔ)句,用戶間接完成:建新表,刪舊表。3.2.1定義、刪除與修改基本表3.取消基本表

把表的定義,表中數(shù)據(jù),其上索引以及以該基本表為基礎(chǔ)所建立的所有視圖全部刪除,并釋放所占用的存儲(chǔ)空間。例5刪除Student表DROPTABLEstudent

3.2.2建立及刪除索引

建立索引是加快表的查詢速度的有效手段索引在概念上可當(dāng)作一個(gè)對(duì)照表,提供一種根據(jù)索引碼的值快速檢索數(shù)據(jù)記錄的方法。數(shù)據(jù)庫(kù)管理員或表的屬主負(fù)責(zé)建立及刪除索引。系統(tǒng)在存取數(shù)據(jù)時(shí)自動(dòng)選擇合適的索引作存取路徑,用戶不必也不能選擇索引。3.2.2建立及刪除索引1.索引類型1)

唯一索引(UNIQUE):要求所有數(shù)據(jù)行中任意兩行中的被索引列不能存在重復(fù)值(包括NULL)SQLSever實(shí)現(xiàn)方法3.2.2建立及刪除索引1)

唯一索引系統(tǒng)自動(dòng)維護(hù)

3.2.2建立及刪除索引2)

簇索引(CLUSTER)在簇索引中,行的物理存儲(chǔ)順序與索引順序完全相同每個(gè)表只允許建立一個(gè)簇索引,由于在建立簇索引時(shí)要改變表中數(shù)據(jù)行的物理順序,所以應(yīng)在其它非簇索引建立之前建立簇索引,以免引起SQLServer重新構(gòu)造非簇索引。

使用簇索引比非簇索引檢索要快

默認(rèn)情況SQLServer為PrimaryKey建立的是簇索引3.2.2建立及刪除索引3)

非簇索引非簇索引不改變行的物理存儲(chǔ)順序。用索引和指針指明。

4)

復(fù)合索引建兩列或多列的組合索引(最大16列)

3.2.2建立及刪除索引2.建立索引

Create[UNIQUE][CLUSTER|NONCLUSTER]INDEX<索引名>ON<表名>(<列名>[<次序>][,<列名>[<次序>]]……);次序:索引值的排列次序,可選ASC或DESCUNIQUE:唯一索引CLUSTER:簇索引NONCLUSTER:非簇索引3.2.2建立及刪除索引2.建立索引例6.在student表中按學(xué)號(hào)升序建唯一索引。CREATEUNIQUEINDEXStusnoONStudent(Sno);在student表中按學(xué)號(hào)升序和年齡降序建唯一索引。CREATEUNIQUEINDEXSt1ONStudent(SnoASC,SageDESC);3.2.2建立及刪除索引3.刪除索引

建立索引是為了減少查詢時(shí)間,但如果數(shù)據(jù)增加刪改頻繁,會(huì)增加系統(tǒng)維護(hù)時(shí)間??蓜h除不必要的索引DROPINDEX<索引名>例7.刪除student表中St1索引DROPINDEXSt13.2.3ACCESS進(jìn)行數(shù)據(jù)定義1.進(jìn)入數(shù)據(jù)定義1)新建查詢選設(shè)計(jì)視圖關(guān)閉顯示表菜單查詢SQL特定查詢數(shù)據(jù)定義

3.2.3ACCESS進(jìn)行數(shù)據(jù)定義3.2.3ACCESS進(jìn)行數(shù)據(jù)定義2)菜單插入查詢?cè)O(shè)計(jì)視圖菜單視圖SQL視圖

3.2.3ACCESS進(jìn)行數(shù)據(jù)定義1.輸入SQL定義建立表將例1-例5分別輸入例6、例7同2.運(yùn)行只能成功運(yùn)行一次!如有錯(cuò)誤,看說(shuō)明!3.2.3ACCESS進(jìn)行數(shù)據(jù)定義4.檢查結(jié)果1)檢查建表選擇對(duì)象“表”,檢查是否有所建表,選中表名,單擊右鍵,選設(shè)計(jì)視圖,檢查表結(jié)構(gòu)。2)檢查索引UNIQUE索引在設(shè)計(jì)視圖中體現(xiàn)為“關(guān)鍵字”,所以從視圖中觀察檢索引前后關(guān)鍵字標(biāo)識(shí)3.3查詢3.3.1單表查詢3.3.2連接查詢3.3.3嵌套查詢3.3.4集合查詢3.3.5小結(jié)

3.3查詢數(shù)據(jù)庫(kù)查詢是數(shù)據(jù)庫(kù)的核心操作。SQL語(yǔ)言提供了SELECT語(yǔ)句進(jìn)行數(shù)據(jù)庫(kù)的查詢,該語(yǔ)句具有靈活的使用方式和豐富的功能。其一般格式為:

SELECT[ALL/DISTINCT]<目標(biāo)列表表達(dá)式>[,<目標(biāo)列表達(dá)式>]…FROM<表名或視圖名>[,<表名或視圖名>]…[WHERE<條件表達(dá)式>][GROUPBY<列名1>[HAING<條件表達(dá)式>]][ORDERBY<列名2>[ASC/DESC]]3.3查詢Select查詢目標(biāo)屬性名From查詢目標(biāo)表名及where子句的條件中涉及的所有關(guān)系名Where查詢目標(biāo)必須滿足的條件

3.3查詢SQL基本查詢模塊:SELECT<表達(dá)式1>,<表達(dá)式2>,…<表達(dá)式n>FROM<關(guān)系1>,<關(guān)系2>,…,<關(guān)系m>WHERE〈條件表達(dá)式〉;3.3查詢例子數(shù)據(jù)庫(kù):“學(xué)生-課程”數(shù)據(jù)庫(kù)中包括三個(gè)表1.“學(xué)生”表Student由學(xué)號(hào)(Sno)、姓名(Sname)、性別(Ssex)年齡(Sage)、所在系(Sdept)5個(gè)屬性組成,可記為:Student(Sno,Snome,Ssex,Sage,Sdept)其中Sno為主碼3.3查詢2.“課程”表Course由課程號(hào)(Cno)、課程名(Cname)、先修課號(hào)(Cpno)、學(xué)分(Ccredit)4個(gè)屬性組成,可記為:Course(Cno,Cname,Cpno,Ccredit)其中Cno為主碼。3.3查詢3.“學(xué)生選課”表SC由學(xué)號(hào)(Sno)課程號(hào)(Cno)、成績(jī)(Grade)3個(gè)屬性組成,可記為:SC(Sno,Cno,Grade)其中(Sno,Cno)為主碼。3.3.1單表查詢(1.選擇表中的若干列)單表查詢是指僅涉及一個(gè)數(shù)據(jù)庫(kù)表的查詢,比如選擇一個(gè)表中的某些列值、選擇一個(gè)表中的某些特定行等。單表查詢是一種最簡(jiǎn)單的查詢操作。1.選擇表中的若干列選擇表中的全部列或部分列,這類運(yùn)算又稱為投影。其變化方式主要表現(xiàn)在SELECT子句的<目標(biāo)表達(dá)式>上。33.3.1單表查詢(1.選擇表中的若干列)1)查詢指定列通過(guò)在SELECT子句的<目標(biāo)列表達(dá)式>中指定要查詢的屬性,有選擇的列出感興趣的列。

例1查詢?nèi)w學(xué)生的學(xué)號(hào)與姓名SELECTSno,SnameFROMStudent

<目標(biāo)列表達(dá)式>中各個(gè)列的先后順序可以與表中的順序不一致。也就是說(shuō),用戶在查詢時(shí)可以根據(jù)應(yīng)用的需要改變列的顯示順序。3.3.1單表查詢(1.選擇表中的若干列)例2查詢?nèi)w學(xué)生的姓名、學(xué)號(hào)、所在系。SELECTSname,Sno,SdeptFROMStudent

這時(shí)結(jié)果表中的列的順序與基本表中不同,是按查詢要求,先列車姓名屬性,然后再列學(xué)號(hào)屬性和所在系屬性。3.3.1單表查詢(1.選擇表中的若干列)2)查詢?nèi)苛袑⒈碇械乃袑傩粤卸歼x出來(lái),可以有兩種方法。一種方法就是在SELECT關(guān)鍵字后面列出所有列名。如果列的顯示順序與其表中的順序相同,也可以簡(jiǎn)單地將<列目標(biāo)表達(dá)式>指定為*。

例3查詢?nèi)w學(xué)生地詳細(xì)記錄SELECT*FROMStudent;該SELECT語(yǔ)句實(shí)際上是無(wú)條件地把Student表全部信息都查詢出來(lái),所以也稱為全表查詢,這是最簡(jiǎn)單的一種查詢。3.3.1單表查詢(1.選擇表中的若干列)3)查詢經(jīng)過(guò)計(jì)算的值<目標(biāo)列表達(dá)式>可以是有關(guān)表達(dá)式,即可以將查詢出來(lái)的屬性列經(jīng)過(guò)一定的計(jì)算后列出結(jié)果。例4查詢?nèi)w學(xué)生的姓名及其出生年份SELECTSname,1996-SageFROMStudent3.3.1單表查詢(1.選擇表中的若干列)輸出的結(jié)果為:

Sname1996-Sage李勇1976劉晨1977王名1978張立1978

<目標(biāo)列表達(dá)式>不僅可以式算術(shù)表達(dá)式,還可以是字符串常量、函數(shù)等。3.3.1單表查詢(1.選擇表中的若干列)例5查詢?nèi)w學(xué)生的姓名、出生年份和所有系,要求用小些字母表示所有系名。SELECTSname,‘YearofBirth:’,1996-Sage,ISLOWER(Sdept)FROMStudent;結(jié)果為:

Sname‘YearofBirth:’1996-SageISLOWER(Sdept)

李勇YearofBirth:1976cs劉晨YearofBirth:1977if王名YearofBirth:1978ma張立YearofBirth:1978if3.3.1單表查詢(1.選擇表中的若干列)用戶可以通過(guò)指定別名來(lái)改變查詢結(jié)果的列標(biāo)題,例如,對(duì)于上例,可以如下定義列別名

SELECTSnameNAME,‘YearofBirth:’BIRTH,1996-SageBIRTHDAY,ISLWER(Sdept)DEPARTMENTFROMStudent;

結(jié)果為:NAMEBIRTHBIRTHDAYDEPARTMENT

李勇YearofBirth:1976cs劉晨YearofBirth:1977if王名YearofBirth:1978ma張立YearofBirth:1978if3.3.1單表查詢(2.選擇表中的若干元組)2.選擇表中的若干元組根據(jù)實(shí)際需要,從一個(gè)指定的表中選擇出所有元組的全部或部分列。如果只想選擇部分元組的全部或部分列,則還需要指定DISTINCT短語(yǔ)或指定WHERE子句

1)

消除取值重復(fù)的行兩個(gè)本來(lái)并不相同的元組,投影到指定的某列上后,可能完全變成相同的行了。3.3.1單表查詢(2.選擇表中的若干元組)例6查詢所有選修過(guò)課的學(xué)生的學(xué)號(hào)SELECTSnoFROMSC;假設(shè)SC表中有下列數(shù)據(jù)SnoCnoGrade95001192950012859500138895002290950023803.3.1單表查詢(2.選擇表中的若干元組)執(zhí)行上面的SELECT語(yǔ)句后,結(jié)果為:Sno9500195001950019500295002該查詢結(jié)果里包含了許多重復(fù)的行。3.3.1單表查詢(2.選擇表中的若干元組)如果想去掉結(jié)果表中的重復(fù)行,必須指定DISTINCT語(yǔ)句:

SELECTDISTINCTSnoFROMSC;執(zhí)行結(jié)果為:

Sno9500195002如果沒(méi)有指定DISTINCT短語(yǔ),則缺省為ALL,即要求結(jié)果表中保留取值重復(fù)的行3.3.1單表查詢(2.選擇表中的若干元組)2)查詢滿足條件的元組通過(guò)WHERE子句實(shí)現(xiàn)。WHERE子句常用的查詢條件如下表。查詢條件謂詞比較確定范圍確定集合字符匹配空值多重條件=,>,<,>=,<=,!=,<>,!>,!<,NOT+上述比較運(yùn)算符BETWEENAND,NOTBETWEENANDIN,NOTLIKELIKE,NOTLIKEISNULL,ISNOTNULLAND,OR3.3.1單表查詢(2.選擇表中的若干元組)比較大小(=,<,>,<=,>=,!=,<>)例7

查計(jì)算機(jī)系全體學(xué)生的名單SELECTSnameFROMStudentWHERESdept=‘CS’3.3.1單表查詢(2.選擇表中的若干元組)

例8

查所有年齡在20歲以下的學(xué)生姓名和及其年齡

SELECTSname,SageFROMStudentWHERESage<20;或SELECTSname,SageFROMStudentWHERENOTSage>=203.3.1單表查詢(2.選擇表中的若干元組)例9

查考試成績(jī)有不及格的學(xué)生的學(xué)號(hào)。

SELECTDISTINCTSnoFROMSCWHEREGrade<60

3.3.1單表查詢(2.選擇表中的若干元組)確定范圍

例10查詢年齡在20至23之間的學(xué)生的姓名、系別和年齡。

SELECTSname,Sdept,SageFROMStudentWHERESageBETWEEN20AND23

與BETWEEN…AND…相對(duì)的謂詞是NOTBETWEEN..AND…。

3.3.1單表查詢(2.選擇表中的若干元組)例11查詢年齡不在20至23之間的學(xué)生的姓名、系別和年齡。SELECTSname,Sdept,SageFROMStudentWHERESageNOTBETWEEN20AND233.3.1單表查詢(2.選擇表中的若干元組)確定集合謂詞IN可以用來(lái)查找屬性值屬于指定集合的元組。

例12查信息系(IS)、數(shù)學(xué)系(MA)和計(jì)算機(jī)科學(xué)系(CS)的學(xué)生的姓名和性別。SELECTSname,SsexFROMStudentWHERESdeptIN(‘IS’,’MA’,‘CS’)3.3.1單表查詢(2.選擇表中的若干元組)例13查既不是信息系(IS)、數(shù)學(xué)系(MA)和計(jì)算機(jī)科學(xué)系(CS)的學(xué)生的姓名和性別。SELECTSname,SsexFROMStudentWHERESdeptNOTIN(‘IS’,’MA’,‘CS’)3.3.1單表查詢(2.選擇表中的若干元組)字符匹配謂詞LIKE可以用來(lái)進(jìn)行字符串的匹配。其一般語(yǔ)法格式如下:[NOT]LIKE‘<匹配串>’[ESCAPE‘<換碼字符>’]其含義是查找指定的屬性列值與<匹配符>相匹配的元組。<匹配串>可以是一個(gè)完整的字符串,也可以含有通配符%和_。3.3.1單表查詢(2.選擇表中的若干元組)

%(百分號(hào)):代表任意長(zhǎng)度(長(zhǎng)度可以為0)的字符串。例如a%b表示以a開頭,以b結(jié)尾的任意長(zhǎng)度的字符串。acb,addgb,ab等都滿足該匹配串。

_(下橫線):代表任意單個(gè)字符例如a_b表示以a開頭,以b結(jié)尾的長(zhǎng)度為3的任意字符串。Acb,afd等滿足該匹配串。3.3.1單表查詢(2.選擇表中的若干元組)

例14查詢學(xué)號(hào)為95001的學(xué)生的詳細(xì)情況。

SELECT*FROMStudentWHERESnoLIKE‘95001’

該語(yǔ)句實(shí)際上與下面的語(yǔ)句完全等價(jià):

SELECT*FROMStudentWHERESno=‘95001’如果LIKE后面的匹配串中不含通配符,則可以用=(等于)運(yùn)算符取代LIKE謂詞,用?。?/p>

或<>(不等于)運(yùn)算符取代NOTLIKE謂詞3.3.1單表查詢(2.選擇表中的若干元組)例15查所有姓劉的學(xué)生、學(xué)號(hào)和性別

SELECTSname,Sno,SsexFROMStudentWHERESnameLIKE‘劉%’3.3.1單表查詢(2.選擇表中的若干元組)例16查姓“歐陽(yáng)”且全名為3個(gè)漢字的學(xué)生的姓名。

SELECTSnameFROMStudentWHERESnameLIKE‘歐陽(yáng)--’

注意,由于一個(gè)漢字占兩個(gè)字符的位置,所以匹配串歐陽(yáng)后面需要跟2個(gè)-。3.3.1單表查詢(2.選擇表中的若干元組)例17查名字中第二個(gè)為“陽(yáng)”字的學(xué)生的姓名和學(xué)號(hào)

SELECTSname,SnoFROMStudentWHERESnameLIKE‘--陽(yáng)%’;

例18查所有不姓劉的學(xué)生姓名SELECTSname,Sno,SsexFROMStudentWHERESnameNOTLIKE‘劉%’3.3.1單表查詢(2.選擇表中的若干元組)如果用戶要查詢的匹配字符串本身就含有%或-,比如要查名字為DB-Design的課程的學(xué)分,應(yīng)如何實(shí)現(xiàn)呢?這就是要使用ESCAPE‘<換碼字符>’短語(yǔ)對(duì)通配符進(jìn)行轉(zhuǎn)義了。3.3.1單表查詢(2.選擇表中的若干元組)

例19查DB-Design課程的課程號(hào)和學(xué)分SELECTCno,CcreditFROMCourseWHERECnameLIKE‘DB\-Design’ESCAPE‘\’ESCAPE‘\’短語(yǔ)表示\為換碼字符,這樣匹配串中緊跟在\后面的字符“-”不再具有通配符的含義,而是取其本身含義,被轉(zhuǎn)義為普通的“-”字符。3.3.1單表查詢(2.選擇表中的若干元組)例20查以“DB-”開頭,且倒數(shù)第三個(gè)字符為i的課程的詳細(xì)情況

SELECT*FROMCourseWHERECnameLIKE‘DB\-%I--’ESCAPE’\’注意這里的匹配字符串‘DB\-%i-‘.第一個(gè)-前面有換碼字符\,所以它被轉(zhuǎn)義為普通的-字符。而%、第2個(gè)-和第3個(gè)-前面均沒(méi)有換碼字符\,所以它們?nèi)宰鳛橥ㄅ浞?.3.1單表查詢(2.選擇表中的若干元組)其執(zhí)行結(jié)果為:

CNOCNAMECCREDIT

8DB-DESIGN410DB-Programing213DB-DBMSDesign43.3.1單表查詢(2.選擇表中的若干元組)涉及空值的查詢謂詞ISNULL和ISNOTNULL可用來(lái)查詢空值和非空值

例21某些學(xué)生選修某門課程后沒(méi)有參加考試,所以有選課記錄,但沒(méi)有考試成績(jī),下面來(lái)查一下缺少成績(jī)的學(xué)生的學(xué)號(hào)和相應(yīng)的課程號(hào)。

SELECTSno,CnoFROMSCWHEREGradeISNULL3.3.1單表查詢(2.選擇表中的若干元組)例22查所有有成績(jī)的記錄的學(xué)生和課程號(hào)

SELECTSno,CnoFROMSCWHEREGradeISNOTNULL3.3.1單表查詢(2.選擇表中的若干元組)多重條件查詢邏輯運(yùn)算符AND和OR可用來(lái)聯(lián)結(jié)多個(gè)查詢條件。如果這兩個(gè)運(yùn)算同時(shí)出現(xiàn)在同一個(gè)WHERE條件子句中,則AND的優(yōu)先級(jí)高于OR,但用戶可以用括號(hào)改變優(yōu)先級(jí)。

3.3.1單表查詢(2.選擇表中的若干元組)例23查CS系年齡在20歲以下的學(xué)生姓名。

SELECTSnameFROMStudentWHERESdept=’CS’ANDSage<20;例12中的IN謂詞實(shí)際上是多個(gè)OR運(yùn)算符的縮寫,因此,例12中的查詢也可以用OR運(yùn)算符寫成如下等價(jià)形式:

SELECTSnameFROMStudentWHERESdept=’IS’ORSdept=‘MA’ORSdept=’CS’3.3.1單表查詢(3.對(duì)查詢結(jié)果排序)3.對(duì)查詢結(jié)果排序

如果沒(méi)有指定查詢結(jié)果的顯示順序,DBMS將按其最方便的順序(通常是元組在表中的先后順序)輸出結(jié)果。用戶也可以用ORDERBY子句指定按照一個(gè)或多個(gè)屬性列的升序(ASC)或降序(DESC)重新排列查詢結(jié)果,其中升序ASC為缺省值。

3.3.1單表查詢(3.對(duì)查詢結(jié)果排序)例24查詢選修了3號(hào)課程的學(xué)生的學(xué)號(hào)及其成績(jī),查詢結(jié)果按分?jǐn)?shù)的降序排列。SELECTSno,GradeFROMSCWHERECno=’1’ORDERBYGradeDESC3.3.1單表查詢(3.對(duì)查詢結(jié)果排序)例25查詢?nèi)w學(xué)生情況,查詢結(jié)果按所在系升序排列,對(duì)同一系中的學(xué)生按年齡降序排列。

SELECT*FROMStudentORDERBYSdept,StageDESC;3.3.1單表查詢(4.使用集函數(shù))4.使用集函數(shù)COUNT([DISTINCT/ALL]*)統(tǒng)計(jì)元組個(gè)數(shù)COUNT([DISTINCT/ALL]<列名>)統(tǒng)計(jì)一列中值的個(gè)數(shù)SUM([DISTINCT/ALL]<列名>)計(jì)算一列值的總和(此列必須是數(shù)值型)AVG([DISTINCT/ALL]<列名>)計(jì)算一列值的平均值(數(shù)值型)MAX([DISTINCT/ALL]<列名>)求一列值中最大值MIN([DISTINCT/ALL]<列名>)求一列值中最小值3.3.1單表查詢(4.使用集函數(shù))如果指定DISTINCT短語(yǔ),則表示在計(jì)算時(shí)要取消指定列中重復(fù)值。如果不指定DISTINCT短語(yǔ)或指定ALL短語(yǔ),則表示不取消重復(fù)值。例26查詢學(xué)生總?cè)藬?shù)SELECTCOUNT(*)FROMStudent

例27查詢選修了課程的學(xué)生人數(shù)SELECTCOUNT(DISTINCTSno)FROMSC;3.3.1單表查詢(4.使用集函數(shù))例28計(jì)算1號(hào)課程的學(xué)生平均成績(jī)。SELECTAVG(Grade)FROMSCWHERECno=’1’;

例29查詢學(xué)習(xí)1號(hào)課程的學(xué)生最高分?jǐn)?shù)SELECTMAX(Grade)FROMSCWHERECno=‘1’3.3.1單表查詢(5.對(duì)查詢結(jié)果分組)5.對(duì)查詢結(jié)果分組GROUPBY子句可以將查詢結(jié)果表的各行按一列或多列取值相等的原則進(jìn)行分組。對(duì)查詢結(jié)果分組的目的是為了細(xì)化集函數(shù)的作用對(duì)象。如果未對(duì)查詢結(jié)果分組,集函數(shù)將作用于整個(gè)查詢結(jié)果,即整個(gè)查詢結(jié)果只有一個(gè)函數(shù)值,如上面的例26,例27,例28,例29。否則,集函數(shù)將作用于每一個(gè)組,即每一個(gè)組都有一個(gè)函數(shù)值。

3.3.1單表查詢(5.對(duì)查詢結(jié)果分組)例30查詢各個(gè)課程號(hào)與相應(yīng)的選課人數(shù)。(查詢選修每門課的人數(shù))SELECTCno,COUNT(Sno)FROMSCGROUPBYCno;

該SELECT語(yǔ)句對(duì)SC表按Cno的取值進(jìn)行分組,所有具有相同Cno值的元組為一組,然后對(duì)每一組作用集函數(shù)COUNT以求的該組的學(xué)生人數(shù)。3.3.1單表查詢(5.對(duì)查詢結(jié)果分組)查詢結(jié)果為:CnoCOUNT(Sno)1222

343

444335483.3.1單表查詢(5.對(duì)查詢結(jié)果分組)如果分組后還要求按一定的條件對(duì)這些組進(jìn)行篩選,最終只輸出滿足指定條件的組,則可以使用HAVING短語(yǔ)指定篩選條件。例31查詢選修了3門以上課程的學(xué)生的學(xué)號(hào)SELECTSnoFROMSCGROUPBYSnoHAVINGCOUNT(*)>33.3.1單表查詢(5.對(duì)查詢結(jié)果分組)例31查詢信息系選修了3門以上課程的學(xué)生的學(xué)號(hào)(為簡(jiǎn)單起見,這里假設(shè)SC表中有一列Dept)SELECTSnoFROMSC WHEREDept=’IS’GROUPBYSnoHAVINGCOUNT(*)>33.3.1單表查詢(5.對(duì)查詢結(jié)果分組)WHERE子句與HAVING短句的根本區(qū)別在于作用對(duì)象不同。WHERE子句作用于基本表或視圖,從中選擇滿足條件的元組。HAVING短句作用于組,從中選擇滿足條件的組。

HAVING短句常跟在GROUPBY之后,條件中必須包含庫(kù)函數(shù),否則條件可直接放到WHERE中。3.3.1單表查詢(5.對(duì)查詢結(jié)果分組)WHERE一定在HAVING之前執(zhí)行例如:查詢信息系選修了3門以上課程的學(xué)生的學(xué)號(hào)(假設(shè)SC表中有一列DEPT)SELECTSnoFROMSCWHEREDEPT=‘IS’GROUPBYSnoHAVINGCOUNT(*)>33.3.1單表查詢(5.對(duì)查詢結(jié)果分組)執(zhí)行順序:1.先選擇適合WHERE條件的元組2.對(duì)選出的元組進(jìn)行分組3.去除不適合HAVING條件的分組注意!在有分組的查詢中,只有分組的項(xiàng)和內(nèi)置函數(shù)可以出現(xiàn)在select后面3.3.2連接查詢(1.等值與非等值)連接查詢:若一個(gè)查詢同時(shí)涉及兩個(gè)以上的表,則稱之為連接查詢。連接查詢實(shí)際上是關(guān)系數(shù)據(jù)庫(kù)中最主要的查詢連接查詢包括:等值連接查詢、非等值連接查詢、自身連接查詢、外連接查詢和復(fù)合條件連接查詢。1.等值與非等值連接查詢連接條件或連接謂詞:用來(lái)連接兩個(gè)表的條件稱為連接條件或連接謂詞。

3.3.2連接查詢(1.等值與非等值)連接條件或連接謂詞的一般格式為:

[<表名1>.]<列名1><比較運(yùn)算符>[<表名2>.]<列名2>其中比較運(yùn)算符主要有:=、>、<、>=、<=、?。酱送猓B接謂詞詞還可以使用下面形式:[<表名1>.<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名2>.]<列名3>

當(dāng)連接運(yùn)算符為=時(shí),稱為等值連接。使用其它運(yùn)算符稱為非等值連接。3.3.2連接查詢(1.等值與非等值)連接字段:連接謂詞中的列名稱為連接字段。連接條件中的各連接字段類型必須是可比的,但不必是相同的。例如,可以都是字符型,或都是日期型;也可以一個(gè)是整型,另一個(gè)是實(shí)型,整型和實(shí)型都是數(shù)值型,因此是可比的。但若一個(gè)是字符型,另一個(gè)是整數(shù)型就不允許了,因?yàn)樗鼈兪遣豢杀鹊念愋汀?.3.2連接查詢(1.等值與非等值)DBMS執(zhí)行連接操作的過(guò)程是:首先在表1中找到第一個(gè)元組,然后從頭開始順序掃描或按索引掃描表2,查找滿足連接條件的元組,每找到一個(gè)元組,就將表1中的第一個(gè)元組于該元組拼接起來(lái),形成結(jié)果表中的一個(gè)元組。表2全部掃描完畢后,再到表1中找第二個(gè)元組,然后再?gòu)念^開始順序掃描或按索引掃描表2,查找滿足連接條件的元組,每找到一個(gè)元組,就將表1中的第二個(gè)元組于該元組拼接起來(lái),形成結(jié)果表中的一個(gè)元組。重復(fù)上述操作,直到表1全部元組都處理完畢為止。3.3.2連接查詢(1.等值與非等值)例32查詢每個(gè)學(xué)生及其選修課程的情況3.3.2連接查詢(1.等值與非等值)例32解:SELECTStudent.*,sc.*FROMStudent,SCWHEREStudent.sno=sc.sno3.3.2連接查詢(1.等值與非等值)

SnoSnameSsexSageSdept95001李勇男20CS95002劉晨女19IS95003王名女18MA95004張立男18ISSnoCnoGrade9500119295001285950013889500229095002380Student.SnoSnameSsexSageSdeptSC.SnoCnoGrade95001李勇男20CS9500119295001李勇男20CS9500128595001李勇男20CS9500138895002劉晨女19IS9500229095002劉晨女19IS95002380Student表

SC表

查詢的執(zhí)行結(jié)果為:3.3.2連接查詢(1.等值與非等值)SELECT要查詢的目標(biāo)列名FROM目標(biāo)列涉及的表+條件列涉及的表WHER顯式條件+隱式條件隱式條件即表間關(guān)聯(lián)條件若無(wú)關(guān)聯(lián)條件則連接結(jié)果為表的笛卡爾積連接查詢(1.等值與非等值)表CUSTOMER和JOB現(xiàn)有值:連接查詢(1.等值與非等值)SELECTCUSTOMER.*,JOB.*FROMCUSTOMER,JOB連接查詢(1.等值與非等值)SELECTCUSTOMER.*,JOB.*FROMCUSTOMER.*,JOBWHERECUSTOMER.CUSTOMER_ID=JOB.CUSTOMER_ID3.3.2連接查詢(1.等值與非等值)自然連接:如果是按照兩個(gè)表中的相同屬性進(jìn)行等值連接。且目標(biāo)中去掉了重復(fù)的屬性列,但保留了所有不重復(fù)的屬性列,則稱之為自然連接。

例33自然連接Student和SC表

3.3.2連接查詢(1.等值與非等值)例33解:SELECTStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFROMStudent,SCWHEREStudent.Sno=SC.Sno;3.3.2連接查詢(1.等值與非等值)Student.SnoSnameSsexSageSdeptSC.SnoCnoGrade95001李勇男20CS9500119295001李勇男20CS9500128595001李勇男20CS9500138895002劉晨女19IS9500229095002劉晨女19IS95002380查詢的執(zhí)行結(jié)果為

3.3.2連接查詢(4.復(fù)合連接

)最常用的就是復(fù)合條件連接查詢(所以提前講)多表連接查詢的WHERE語(yǔ)句中,有兩種類型的條件,一為顯式條件,一為隱式(或叫做表間關(guān)聯(lián)條件),如例35中,SC.Cno=‘2’ANDSC.Grade>90為顯式條件Student.Sno=SC.Sno為隱式(或叫做表間關(guān)聯(lián)條件)條件3.3.2連接查詢(4.復(fù)合連接

)4.復(fù)合條件連接復(fù)合條件連接:WHERE子句中有多個(gè)條件的連接操作,稱為復(fù)合條件連接。

例35查詢選修2號(hào)課程且成績(jī)?cè)?0分以上的所有學(xué)生姓名。3.3.2連接查詢(4.復(fù)合連接

)例35解SELECTStudent.Sno,SnameFROMStudent,SCWHEREStudent.Sno=SC.SnoANDSC.Cno=‘2’ANDSC.Grade>903.3.2連接查詢(4.復(fù)合連接

)例36查詢每個(gè)學(xué)生選修的課程名及其成績(jī)。3.3.2連接查詢(4.復(fù)合連接

)例36解:SELECTStudent.Sno,Sname,Course.Cname,SC.GradeFROMStudent,SC,CourseWHEREStudent.Sno=SC.SnoANDSC.Cno=Course.Cno3.3.2連接查詢(4.復(fù)合連接

)考慮數(shù)據(jù)庫(kù)三個(gè)表:圖書管理關(guān)系數(shù)據(jù)模型:圖書(總編號(hào),分類號(hào),書名,作者,出版單位,單價(jià))讀者(借書證號(hào),姓名,性別,單位,職稱,地址)借閱(借書證號(hào),總編號(hào),借閱日期,備注)

3.3.2連接查詢(4.復(fù)合連接

)由于SQL是高度非過(guò)程化的,用戶只要在FROM子句中指出關(guān)系名稱,在WHERE子句中寫明連接條件即可,聯(lián)接運(yùn)算由系統(tǒng)去完成并實(shí)現(xiàn)優(yōu)化。例J1:查找所有借閱了圖書的讀者姓名及所在單位。3.3.2連接查詢(4.復(fù)合連接

)J1解:SELECTDISTINCT姓名,單位FROM讀者,借閱WHERE讀者.借書證號(hào)=借閱.借書證號(hào)*讀者,借閱二表均有借書證號(hào)域,為避免混淆,用表名.域名表示域名;*本例無(wú)顯式條件,只有表關(guān)聯(lián)條件3.3.2連接查詢(4.復(fù)合連接

)例J2:查找李晶所借的所有圖書的書名及借閱日期。3.3.2連接查詢(4.復(fù)合連接

)J2解:SELECT姓名,“所借圖書:”,書名,借閱日期FROM圖書,讀者,借閱WHERE姓名=‘李晶’AND讀者.借書證號(hào)=借閱.借書證號(hào)AND借閱.總編號(hào)=圖書.總編號(hào)

*查詢涉及到三個(gè)關(guān)系的自然連接,用戶只需用外關(guān)鍵字指出連接條件,WHERE后兩行既是;第一行是顯式條件3.3.2連接查詢(4.復(fù)合連接

)例J3:查詢價(jià)格在20元以上的已借出的圖書,結(jié)果按單價(jià)降序排列。3.3.2連接查詢(4.復(fù)合連接

)J3解:SELECT*FROM圖書,借閱WHERE借閱.總編號(hào)=圖書.總編號(hào)AND單價(jià)>=20ORDERBY單價(jià)DESC3.3.2連接查詢(4.復(fù)合連接

)例J4.分別找出各個(gè)單位當(dāng)前借閱圖書的讀者人次。3.3.2連接查詢(4.復(fù)合連接

)例J4解:SELECT單位,‘借書人數(shù):’,COUNT(借書證號(hào))FROM借閱,讀者WHERE讀者.借書證號(hào)=借閱.借書證號(hào)GROUPBY單位3.3.2連接查詢(4.復(fù)合連接

)例J5.找出藏書中各出版單位的冊(cè)數(shù)、價(jià)值總額,并按總價(jià)降序,總價(jià)相同者按冊(cè)數(shù)排序。3.3.2連接查詢(4.復(fù)合連接

)例J5解:SELECT出版單位,‘冊(cè)數(shù):’,COUNT(*),‘總價(jià):’,SUM(單價(jià))FROM圖書GROUPBY出版單位ORDERBYSUM(單價(jià)),COUNT(*)DESC3.3.2連接查詢(4.復(fù)合連接

)例J6.找出當(dāng)前至少借閱了5本圖書的讀者及所在單位。3.3.2連接查詢(4.復(fù)合連接

)例J6解(CUO):SELECT姓名,單位FROM讀者,借閱WHERE讀者.借書證號(hào)=借閱.借書證號(hào)GROUPBY借書證號(hào)HAVINGCOUNT(*)>=53.3.2連接查詢(4.復(fù)合連接

)例J6解:SELECT姓名,單位FROM讀者WHERE借書證號(hào)IN(SELECT借書證號(hào)FROM借閱GROUPBY借書證號(hào)HAVINGCOUNT(*)>=5)3.3.2連接查詢(4.復(fù)合連接

)例J7.分別找出借書人數(shù)超過(guò)10個(gè)人的單位及人數(shù)。3.3.2連接查詢(4.復(fù)合連接

)例J7解:SELECT單位,‘借書人數(shù):’,COUNT(DISTINCT借書證號(hào))FROM借閱,讀者WHERE讀者.借書證號(hào)=借閱.借書證號(hào)GROUPBY單位HAVINGCOUNT(DISTINCT借書證號(hào)>103.3.2連接查詢(2.自身連接

)2.自身連接

連接操作不僅可以在兩個(gè)表之間進(jìn)行,也可以是一個(gè)表與其自己進(jìn)行連接,這種連接稱為表的自身連接。例:查詢與“李小波”年齡相等的學(xué)生姓名。(如果查詢年齡等于18的學(xué)生姓名,會(huì)查,18是固定條件,現(xiàn)在條件是查詢結(jié)果,并且是出于同一個(gè)表的查詢,這樣需對(duì)student表查兩遍,一遍是查出“李小波”的年齡,一遍是用“李小波”的年齡作條件,兩次對(duì)同一表的查詢是有關(guān)聯(lián)的--自身連接)3.3.2連接查詢(2.自身連接

)SELECTs1.SnameFROMStudents1,Students2

s1作為最后s2作為查條件表,即結(jié)果出處表查出李小波年齡WHEREs1.Sage=s2.SageANDs2.Sname=‘李小波’3.3.2連接查詢(2.自身連接

)例:查詢同時(shí)選修了c1和c2兩門課的學(xué)生學(xué)號(hào)。(分析:選修了c1和c2兩門課程的學(xué)生在SC表中有兩條記錄,可以分兩次查出,這兩條記錄必須滿足姓名相等才符合題要求)3.3.2連接查詢(2.自身連接

)解答1:SELECTSnoFROMSCWHERECno=‘c1’ORCno=‘c2’解答2:SELECTsc1.SnoFROMSCsc1,SCsc2WHEREsc1.Cno=‘c1’ANDsc2.Cno=‘c2’ANDsc1.Sno=sc2.Sno?哪對(duì)哪錯(cuò)?S1、s2叫作SC的別名3.3.2連接查詢(2.自身連接

)例34查詢每一門課的間接先修課(即先修課的先修課)

分析:CnoCpno1557現(xiàn)在已知1,要找7,即對(duì)所有的Cno去查Cpno的Cpno,第二個(gè)條件以Cpno作Cno3.3.2連接查詢(2.自身連接

)為清楚起見,我們可以把Course表想成是兩個(gè)完全一樣的表,一個(gè)是FIRST表,另一個(gè)是SECOND表。

CnoCnameCpnoCcredit1數(shù)據(jù)庫(kù)542數(shù)學(xué)23信息系統(tǒng)144操作系統(tǒng)635數(shù)據(jù)結(jié)構(gòu)746數(shù)據(jù)處理27PASCAL語(yǔ)言64FIRST表(Course表)

SECOND表(Course表)

CnoCnameCpnoCcredit1數(shù)據(jù)庫(kù)542數(shù)學(xué)23信息系統(tǒng)144操作系統(tǒng)635數(shù)據(jù)結(jié)構(gòu)746數(shù)據(jù)處理27PASCAL語(yǔ)言643.3.2連接查詢(2.自身連接

)解答:SELECTFIRST.Cno,SECOND.CpnoFROMCourseFIRST,CourseSECONDWHEREFIRST.Cpno=SECOND.Cno;

結(jié)果表示如下:CnoCpno1

73

5563.3.2連接查詢(3.外連接

)3.外連接

在通常的聯(lián)接操作中,只有滿足聯(lián)接條件的元組才能作為結(jié)果輸出例如:查詢每個(gè)學(xué)生及其選修課程的情況SelectStudent.Sno,Sname,Cno,GradeFromStudent,SCWhereStudent.Sno=SC.Sno3.3.2連接查詢(3.外連接

)SnoSnameSsexSageSdept95001李勇男20CS95002劉晨女19IS95003王名女18MA95004張立男18ISSnoCnoGrade9500119295001285950013889500229095002380StudentSCSnoSnameCnoGrade95001李勇19295001李勇28595001李勇38895002劉晨29095002劉晨380結(jié)果

注意!在此查詢結(jié)果中沒(méi)有關(guān)于95003和95004兩個(gè)學(xué)生的信息,原因在于他們沒(méi)有選課,在SC表中沒(méi)有相應(yīng)的元組。

3.3.2連接查詢(3.外連接

)有時(shí)我們想以Student表為主體列出每個(gè)學(xué)生的基本情況及其選課情況,若某個(gè)學(xué)生沒(méi)有選課,則只輸出其基本情況,其選課信息為空值即可——使用外聯(lián)接(OuterJoin)

外聯(lián)接運(yùn)算符通常為“*”,也用“+”

例:查詢學(xué)生選課情況

SelectSno,Sname,Cno,GradeFromStudent.SCWhereStudent.Sno=SC.Sno(*)3.3.2連接查詢(3.外連接

)外聯(lián)接就好象是為*號(hào)指定的表增加一個(gè)“萬(wàn)能”的行,這個(gè)行全部由空值組成,它可以和另一個(gè)表中(Student)所有不能與SC表其他行聯(lián)接的元組進(jìn)行聯(lián)接,即與Student表中95003和95004元組聯(lián)接,由于這個(gè)“萬(wàn)能”行的各列全部是空值,因此在聯(lián)接結(jié)果中,95003和95004兩行中來(lái)自SC表中的屬性值全部是空值。SnoSnameCnoGrade95001李勇19295001李勇28595001李勇38895002劉昆29095002劉昆38095003王名95004張立結(jié)果

3.3.2連接查詢(3.外連接

)Student.SnoSnameSsexSageSdeptSC.SnoCnoGrade95001李勇男20CS 9500119295001 李勇男20CS 9500128595001 李勇男20CS 9500138895002 劉晨女19IS 9500229095002 劉晨女19IS 9500238095003 王名女18MA95004 張立男18IS如果可以改寫例33:

SELECTStudent.SnoSname,Ssex,Sage,Sdept,Cno,GradeFROMStudent,SCWHEREStudent.Sno=SC.Sno(*)外連接符*出現(xiàn)在連接運(yùn)算符的右邊,所以也稱其為右外連接。相應(yīng)地,如果外連接符出項(xiàng)在連接運(yùn)算符地左邊,則稱為左外連接。

3.3.3嵌套查詢?cè)赟QL語(yǔ)言中,一個(gè)SELECT-FROM-WHERE語(yǔ)句稱為一個(gè)查詢塊。將一個(gè)查詢塊嵌套在另一個(gè)查詢塊的WHERE子句或HAVING短語(yǔ)的條件中的查詢稱為嵌套查詢或子查詢。例如

SELECTSnameFROMStudentWHERESnoIN(SELECTSnoFROMSCWHERECno=‘2’);3.3.3嵌套查詢(1.帶有IN謂詞)1.帶有IN謂詞的子查詢

帶有IN謂詞的子查詢是指父查詢與子查詢之間用IN進(jìn)行連接,判斷某個(gè)屬性列值是否在子查詢的結(jié)果中。例37查詢與“劉晨”在同一個(gè)系學(xué)習(xí)的學(xué)生。(自身連接也可完成)3.3.3嵌套查詢(1.帶有IN謂詞)分析:1)確定“劉晨”所在系名(子查詢)

2)查找所有在IS系學(xué)習(xí)的學(xué)生

SELECTSno,Sname,SdeptFROMStudentWHERESdeptIN(SELECTSdeptFROMStudentWHERESname=“劉晨”);

3.3.3嵌套

溫馨提示

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