數(shù)據(jù)庫(kù)原理與應(yīng)用 課件 第3章 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL_第1頁(yè)
數(shù)據(jù)庫(kù)原理與應(yīng)用 課件 第3章 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL_第2頁(yè)
數(shù)據(jù)庫(kù)原理與應(yīng)用 課件 第3章 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL_第3頁(yè)
數(shù)據(jù)庫(kù)原理與應(yīng)用 課件 第3章 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL_第4頁(yè)
數(shù)據(jù)庫(kù)原理與應(yīng)用 課件 第3章 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL_第5頁(yè)
已閱讀5頁(yè),還剩152頁(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)介

第3章關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL主要內(nèi)容3.1SQL概述3.2數(shù)據(jù)定義3.3數(shù)據(jù)查詢3.4數(shù)據(jù)操縱3.5視圖3.6實(shí)驗(yàn)3.7本章小結(jié)3.1SQL概述第3章關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL3.1SQL概述3.1.1SQL簡(jiǎn)介結(jié)構(gòu)化查詢語(yǔ)言SQL(StructuredQueryLanguage)是一種用于和關(guān)系數(shù)據(jù)庫(kù)進(jìn)行交互通信的計(jì)算機(jī)語(yǔ)言,用于存取數(shù)據(jù)以及查詢、更新和管理關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)。同時(shí)它也是數(shù)據(jù)庫(kù)腳本文件的擴(kuò)展名。43.1SQL概述3.1.1SQL簡(jiǎn)介SQL語(yǔ)言的應(yīng)用更加廣泛,Oracle、Sybase、Informix、Ingres、DB2、SQLServer、Rdb等大型數(shù)據(jù)庫(kù)管理系統(tǒng)都實(shí)現(xiàn)了SQL語(yǔ)言;Dbase、Foxpro、Access等PC機(jī)數(shù)據(jù)庫(kù)管理系統(tǒng)部分實(shí)現(xiàn)了SQL語(yǔ)言;可以在HTML(HypertextMarkupLanguage,超文本標(biāo)記語(yǔ)言)中嵌入SQL語(yǔ)句,通過(guò)WWW訪問(wèn)數(shù)據(jù)庫(kù);在VC、VB、Delphi、PB中也可嵌入SQL語(yǔ)句。目前,很多數(shù)據(jù)庫(kù)產(chǎn)品都對(duì)SQL語(yǔ)句進(jìn)行再開(kāi)發(fā)與擴(kuò)展,如Oracle提供的PL/SQL(ProcedureLanguageandSQL)就是對(duì)SQL的一種擴(kuò)展。53.1SQL概述3.1.2SQL發(fā)展歷程SQL隨著數(shù)據(jù)庫(kù)技術(shù)的發(fā)展而不斷更新、豐富,SQL的發(fā)展歷程如下所示:(1)1970:E.F.Codd發(fā)表了關(guān)系數(shù)據(jù)庫(kù)理論(relationaldatabase

theory);(2)1974-79:IBM以Codd的理論為基礎(chǔ)開(kāi)發(fā)了“Sequel”,并重命名為

“結(jié)構(gòu)化查詢語(yǔ)言”;(3)1979:Oracle發(fā)布了商業(yè)版結(jié)構(gòu)化查詢語(yǔ)言;(4)1981-84:出現(xiàn)了其他商業(yè)版本,分別來(lái)自IBM(DB2),DataGeneral,

RelationalTechnology(INGRES);(5)1986:美國(guó)ANSI采用SQL作為關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)的標(biāo)準(zhǔn)語(yǔ)言,后為國(guó)

際標(biāo)準(zhǔn)化組織(ISO)采納為國(guó)際標(biāo)準(zhǔn)。63.1SQL概述3.1.2SQL發(fā)展歷程(6)1989:結(jié)構(gòu)化查詢語(yǔ)言/89增加了引用完整性(referentialintegrity);(7)1992:結(jié)構(gòu)化查詢語(yǔ)言/92被數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)生產(chǎn)商廣泛接受;(8)1997+:成為動(dòng)態(tài)網(wǎng)站(Dynamicwebcontent)的后臺(tái)支持;(9)2003:結(jié)構(gòu)化查詢語(yǔ)言/2003:包含了XML相關(guān)內(nèi)容,自動(dòng)生成列值(columnvalues);(10)2006:結(jié)構(gòu)化查詢語(yǔ)言/2006定義了結(jié)構(gòu)化查詢語(yǔ)言與XML(包含XQuery)的關(guān)聯(lián)應(yīng)用;(11)2006:Sun公司將以結(jié)構(gòu)化查詢語(yǔ)言基礎(chǔ)的數(shù)據(jù)庫(kù)管理系統(tǒng)嵌入JavaV6。73.1SQL概述3.1.3SQL特點(diǎn)SQL語(yǔ)言是一個(gè)綜合的、通用的、功能極強(qiáng)的、簡(jiǎn)學(xué)易用的語(yǔ)言,所以能夠被用戶和業(yè)界廣泛接受,并成為國(guó)際標(biāo)準(zhǔn)。其主要特點(diǎn)如下:1.綜合統(tǒng)一2.高度非過(guò)程化3.面向集合的操作方式4.以同一種語(yǔ)法結(jié)構(gòu)提供兩種使用方式5.語(yǔ)言簡(jiǎn)潔,易學(xué)易用83.2數(shù)據(jù)定義第3章關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL3.2數(shù)據(jù)定義通過(guò)SQL語(yǔ)言的數(shù)據(jù)定義功能,可以完成基本表、視圖、索引的創(chuàng)建、修改和刪除。但SQL不提倡修改視圖和索引的定義,如果想修改視圖和索引的定義,只能先將它們刪除,然后再重建。SQL常用的數(shù)據(jù)定義語(yǔ)句,如表3.2所示。103.2數(shù)據(jù)定義3.2.1基本數(shù)據(jù)類型1.?dāng)?shù)值型(1)INTEGER定義數(shù)據(jù)類型為整數(shù)類型,它的精度(總有效位)由執(zhí)行機(jī)構(gòu)

確定。INTEGER可簡(jiǎn)寫(xiě)成INT。(2)SMALLINT定義數(shù)據(jù)類型為短整數(shù)類型,它的精度由執(zhí)行機(jī)構(gòu)確定。(3)NUMERIC(p,s)定義數(shù)據(jù)類型為數(shù)值型,并給定精度p(總的有效位,

不包含符號(hào)位及小數(shù)點(diǎn))或標(biāo)度s(十進(jìn)制小數(shù)點(diǎn)右邊的位數(shù))。(4)FLOAT(p)定義數(shù)據(jù)類型為浮點(diǎn)數(shù)值型,p為指定的精度。(5)REAL定義數(shù)據(jù)類型為浮點(diǎn)數(shù)值型,它的精度由執(zhí)行機(jī)構(gòu)確定。(6)DOUBLEPRECISION定義數(shù)據(jù)類型為雙精度浮點(diǎn)類型,它的精度由執(zhí)行

機(jī)構(gòu)確定。113.2數(shù)據(jù)定義2.字符類型(1)CHAR(n)定義指定長(zhǎng)度的字符串,n為字符數(shù)的固定長(zhǎng)度。(2)VARCHAR(n)定義可變長(zhǎng)度的字符串,其最大長(zhǎng)度為n,n不可省略。3.位串型(1)BIT(n)定義數(shù)據(jù)類型為二進(jìn)制位串,其長(zhǎng)度為n。(2)BITVARYING(n)定義可變長(zhǎng)度的二進(jìn)制位串,其最大長(zhǎng)度為n,n不可省略。4.時(shí)間型(1)DATE用于定義日期,包含年、月、日,格式為YYYY-MM-DD。(2)TIME用于定義時(shí)間,包含時(shí)、分、秒,其格式為HH:MM:SS。123.2數(shù)據(jù)定義5.布爾型BOOLEAN定義布爾類型,其值可以是TRUE(真)、FALSE(假)。對(duì)于數(shù)值型數(shù)據(jù),可以執(zhí)行算術(shù)運(yùn)算和比較運(yùn)算,但對(duì)其他類型數(shù)據(jù),只可以執(zhí)行比較運(yùn)算,不能執(zhí)行算術(shù)運(yùn)算。我們?cè)谶@里只介紹了常用的一些數(shù)據(jù)類型,許多SQL產(chǎn)品還擴(kuò)充了其他一些數(shù)據(jù)類型,用戶在實(shí)際使用中應(yīng)查閱數(shù)據(jù)庫(kù)系統(tǒng)的參考手冊(cè)。133.2數(shù)據(jù)定義3.2.2約束條件在SQL語(yǔ)言中,約束是一些規(guī)則,約束在數(shù)據(jù)庫(kù)中不占存儲(chǔ)空間。根據(jù)約束所完成的功能不同,表達(dá)完整性約束的規(guī)則有主碼約束、外碼約束、屬性約束等幾類:1.主碼約束(PRIMARYKEY),也稱主鍵約束主碼約束體現(xiàn)了實(shí)體完整性。要求某一列的值既不能為空,也不能重復(fù)。2.外碼約束(FOREIGNKEY),也稱外鍵約束外碼約束體現(xiàn)參照完整性。外碼的取值或者為空或者參考父表的主碼。143.2數(shù)據(jù)定義3.屬性約束屬性約束體現(xiàn)了用戶定義的完整性。屬性約束主要限制某一屬性的取值范圍。屬性約束可分為以下幾類:(1)非空約束(NOTNULL):要求某一屬性的值不允許為空值。(2)唯一約束(UNIQUE):要求某一屬性的值不允許重復(fù)。(3)檢查約束(CHECK):CHECK約束可以對(duì)某一個(gè)屬性列的值加以限制。限制就是給某一列設(shè)定條件,只有滿足條件的值才允許插入?;颈淼耐暾约s束可定義為兩級(jí):表級(jí)約束和列級(jí)約束。表級(jí)約束可以約束表中的任意一列或多列,而列級(jí)約束只能約束其所在的某一列。153.2數(shù)據(jù)定義3.2.3基本表的定義表是數(shù)據(jù)庫(kù)中最基本的操作對(duì)象,是實(shí)際存放數(shù)據(jù)的地方。其他的數(shù)據(jù)庫(kù)對(duì)象的創(chuàng)建及各種操作都是圍繞表進(jìn)行的,可以將表看作含列和行的表單。SQL語(yǔ)言使用CREATETABLE語(yǔ)句定義基本表。其一般格式為:CREATETABLE<基本表名>(<列名><數(shù)據(jù)類型>[列級(jí)完整性約束][,<列名><數(shù)據(jù)類型>[列級(jí)完整性約束]]……[,表級(jí)完整性約束]);163.2數(shù)據(jù)定義說(shuō)明:(1)其中,“<>”中的內(nèi)容是必選項(xiàng),“[]”中的內(nèi)容是可選項(xiàng)。本書(shū)以下各章節(jié)也遵循這個(gè)規(guī)定。(2)<基本表名>:規(guī)定了所定義的基本表的名字,在一個(gè)用戶中不允許有兩個(gè)基本表的名字相同。<列名>:規(guī)定了該列(屬性)的名稱。一個(gè)表中不能有兩列的名字相同。(3)表名或列名命名規(guī)則:第一個(gè)字符必須是字母,后面可以跟字母、數(shù)字、三個(gè)特殊符號(hào)(_、$、#);表名或列名中不可以包含空格;表名和列名不區(qū)分大小寫(xiě),但顯示出來(lái)都是大寫(xiě);保留字不能用作表名或列名。(4)<數(shù)據(jù)類型>:規(guī)定了該列的數(shù)據(jù)類型。(5)<列級(jí)完整性約束>:是指對(duì)某一列設(shè)置的約束條件。(6)<表級(jí)完整性約束>:規(guī)定了關(guān)系主鍵、外鍵和用戶自定義完整性約束。173.2數(shù)據(jù)定義例題3.1創(chuàng)建一個(gè)學(xué)生表student,要求所有約束條件均為列級(jí)完整性約

束,學(xué)生表的結(jié)構(gòu)如表3.3所示。1819學(xué)生表student的創(chuàng)建語(yǔ)句如下:CREATETABLEstudent(snoCHAR(8)PRIMARYKEY,/*主碼約束*/snameVARCHAR2(10)UNIQUE,/*唯一約束*/sexCHAR(4)NOTNULL,/*非空約束*/ageINTCHECK(Age>16),/*檢查約束*/deptVARCHAR2(10));3.2數(shù)據(jù)定義例題3.2創(chuàng)建一個(gè)課程表course,要求所有約束條件均為列級(jí)完整性約束,課程表的結(jié)構(gòu)如表3.4所示。2021課程表course的創(chuàng)建語(yǔ)句如下:CREATETABLEcourse(cnoCHAR(8)PRIMARYKEY,/*主碼約束*/cnameVARCHAR2(10)NOTNULL,/*非空約束*/tnameVARCHAR2(10),cpnoCHAR(8)REFERENCEScourse(cno),/*外碼約束*/

creditNUMBER);3.2數(shù)據(jù)定義例題3.3創(chuàng)建一個(gè)選課表sc,要求所有約束條件均為表級(jí)完整性約束,選課表的結(jié)構(gòu)如表3.5所示。2223選課表sc的創(chuàng)建語(yǔ)句如下:CREATETABLEsc(snoCHAR(8),cnoCHAR(8),gradeNUMBER,PRIMARYKEY(sno,cno),/*主碼約束*/FOREIGNKEY(sno)REFERENCESstudent(sno),/*外碼約束*/FOREIGNKEY(cno)REFERENCEScourse(cno)/*外碼約束*/);3.2數(shù)據(jù)定義3.2.4基本表的修改隨著應(yīng)用環(huán)境和實(shí)際需求的變化,經(jīng)常需要修改基本表的結(jié)構(gòu),包括修改屬性列的數(shù)據(jù)類型及其精度、增加新的屬性列或刪除屬性列、增加新的約束條件或刪除原有的約束條件。SQL語(yǔ)言通過(guò)ALTERTABLE命令對(duì)基本表的結(jié)構(gòu)進(jìn)行修改。其一般格式為:ALTERTABLE<基本表名>[ADD<新列名><數(shù)據(jù)類型>[列級(jí)完整性約束]][DROPCOLUMN<列名>][MODIFY<列名><新的數(shù)據(jù)類型>][ADDCONSTRAINT<完整性約束>][DROPCONSTRAINT<完整性約束>];243.2數(shù)據(jù)定義說(shuō)明:(1)ADD:為一個(gè)基本表增加新的屬性列,但新的屬性列的值必須允許為空(除非有默認(rèn)值)。(2)DROPCOLUMN:刪除基本表中原有的一列。(3)MODIFY:修改基本表中原有屬性列的數(shù)據(jù)類型。(4)ADDCONSTRAINT和DROPCONSTRAINT分別表示添加完整性約束和刪除完整性約束。(5)以上的命令格式在實(shí)際的數(shù)據(jù)庫(kù)管理系統(tǒng)中可能有所不同,用戶在使用時(shí)應(yīng)參閱實(shí)際數(shù)據(jù)庫(kù)系統(tǒng)的參考手冊(cè)。253.2數(shù)據(jù)定義例題3.4向student表中增加一個(gè)身高“height”屬性列,數(shù)據(jù)類型為INT。ALTERTABLEstudentADDheightINT;新增加的屬性列總是表的最后一列。不論表中是否已經(jīng)有數(shù)據(jù),新增加的列值為空。所以新增加的屬性列不能有NOTNULL約束,否則就會(huì)產(chǎn)生矛盾。263.2數(shù)據(jù)定義例題3.5將student表中的“height”屬性列的數(shù)據(jù)類型改為REAL。ALTERTABLEstudentMODIFYheightREAL;修改原有的列定義有可能會(huì)破壞已有數(shù)據(jù),所以在修改時(shí)需要注意:可以增加列值的寬度及小數(shù)點(diǎn)的長(zhǎng)度,只有當(dāng)某列所有行的值為空或整張表是空時(shí),才能減少其列值寬度,或改變其列值的數(shù)據(jù)類型。273.2數(shù)據(jù)定義例題3.6給student表中“height”屬性列增加一個(gè)檢查約束,約束的名字為CHK_HEIGHT,要求學(xué)生的身高要超過(guò)140厘米才行。ALTERTABLEstudentADDCONSTRAINTCHK_HEIGHTCHECK(height>140);例題3.7刪除“height”屬性列上的CHECK約束。ALTERTABLEstudentDROPCONSTRAINTCHK_HEIGHT;例題3.8刪除student表中新增加的“height”屬性列。ALTERTABLEstudentDROPCOLUMNheight;283.2數(shù)據(jù)定義3.2.5基本表的刪除當(dāng)數(shù)據(jù)庫(kù)某個(gè)基本表不再使用時(shí),可以使用DROPTABLE語(yǔ)句刪除它。其一般格式為:DROPTABLE<表名>[CASCADECONSTRAINTS];293.2數(shù)據(jù)定義例題3.9刪除學(xué)生選課表sc。DROPTABLEsc;基本表定義一旦被刪除,表中的數(shù)據(jù)、此表上建立的索引和視圖都

將自動(dòng)被刪除掉。因此執(zhí)行刪除基本表的操作一定要格外小心。但

在有的系統(tǒng)(如Oracle)中,刪除基本表后建立在此表上的視圖定義

仍然保留在數(shù)據(jù)字典中,但是,當(dāng)用戶引用時(shí)就會(huì)報(bào)錯(cuò)。303.2數(shù)據(jù)定義3.2.6索引的定義和刪除索引是根據(jù)表中一列或若干列按照一定順序建立的列值與記錄行之間的對(duì)應(yīng)關(guān)系表。索引屬于物理存儲(chǔ)的路徑概念,而不是用戶使用的邏輯概念。建立在多個(gè)列上的索引被稱為復(fù)合索引。系統(tǒng)在存取數(shù)據(jù)時(shí)會(huì)自動(dòng)選擇合適的索引作為存取路徑,用戶不必也不能顯式地選擇索引。有兩種重要的索引:聚簇索引(clusteredindex)和非聚簇索引(non-clusteredindex)。313.2數(shù)據(jù)定義1.索引的定義在SQL語(yǔ)言中,建立索引使用CREATEINDEX語(yǔ)句,其一般格式為:CREATE[UNIQUE][CLUSTER]INDEX<索引名>ON<基本表名>(<列名>[<次序>],[,<列名>[<次序>]]…);說(shuō)明:①UNIQUE:規(guī)定此索引為唯一性索引。每一個(gè)索引值只對(duì)應(yīng)于表中唯一的記錄。②CLUSTER:規(guī)定此索引為聚簇索引。省略CLUSTER則表示創(chuàng)建的索引為非聚簇索引。③<次序>:建立索引時(shí)指定列名的索引表是ASC(升序)或DESC(降序)。若不指定,默認(rèn)為升序。323.2數(shù)據(jù)定義例題3.10為student,course,sc三張表建立索引。其中student表按學(xué)號(hào)sno升序建唯一索引,course表按課程號(hào)cno降序建唯一索引,sc表按學(xué)號(hào)sno升序和課程號(hào)cno降序建唯一索引。CREATEUNIQUEINDEXindex_stuONstudent(snoASC);CREATEUNIQUEINDEXindex_couONcourse(cnoDESC);CREATEUNIQUEINDEXindex_scONsc(snoASC,cnoDESC);333.2數(shù)據(jù)定義2.索引的刪除索引可以加快查詢速度,但如果數(shù)據(jù)的增、刪、改操作很頻繁,系統(tǒng)就會(huì)花許多時(shí)間來(lái)維護(hù)索引,導(dǎo)致系統(tǒng)開(kāi)銷增加。索引一經(jīng)建立,就由系統(tǒng)使用和維護(hù)它,不需用戶干預(yù)。建立索引是為了減少查詢操作的時(shí)間,但如果數(shù)據(jù)增、刪、改頻繁,系統(tǒng)會(huì)花費(fèi)許多時(shí)間來(lái)維護(hù)索引。過(guò)多的索引甚至?xí)?dǎo)致索引碎片,降低系統(tǒng)效率。因此不必要的索引應(yīng)該及時(shí)刪除。刪除索引的格式為:DROPINDEX<索引名>;343.2數(shù)據(jù)定義例題3.11刪除course表的index_cou索引。DROPINDEXindex_cou;刪除索引時(shí),系統(tǒng)會(huì)同時(shí)從數(shù)據(jù)字典中刪除有關(guān)該索引的描述。353.3數(shù)據(jù)查詢第3章關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL3.3數(shù)據(jù)查詢3.3.1SELECT語(yǔ)句格式SQL語(yǔ)言中最重要、最核心的操作就是數(shù)據(jù)查詢。關(guān)系代數(shù)的運(yùn)算在關(guān)系數(shù)據(jù)庫(kù)中主要由SQL數(shù)據(jù)查詢來(lái)體現(xiàn)。SQL語(yǔ)言提供SELECT語(yǔ)句進(jìn)行數(shù)據(jù)庫(kù)的查詢,該語(yǔ)句具有靈活的使用方式和豐富的功能。其基本格式為:SELECT[ALL|DISTINCT]<目標(biāo)列表達(dá)式>[,<目標(biāo)列表達(dá)式>]…FROM<表名或視圖名>[,<表名或視圖名>]…[WHERE<條件表達(dá)式>][GROUPBY<列名1>[HAVING<組條件表達(dá)式>]][ORDERBY<列名2>[ASC|DESC]];373.3數(shù)據(jù)查詢其中:(1)SELECT子句說(shuō)明要查詢的數(shù)據(jù)。ALL表示篩選出數(shù)據(jù)庫(kù)表中滿足條件的所有記錄,一般情況下省略不寫(xiě)。DISTINCT表示輸出結(jié)果中無(wú)重復(fù)記錄。(2)FROM子句說(shuō)明要查詢的數(shù)據(jù)來(lái)源??梢允菙?shù)據(jù)庫(kù)中的一個(gè)或多個(gè)表或視圖,各項(xiàng)之間用逗號(hào)分隔。(3)WHERE子句指定查詢條件。查詢條件中會(huì)涉及SQL函數(shù)和SQL操作符。(4)GROUPBY子句表示在查詢時(shí),可以按照某個(gè)或某些字段分組匯總,各分組選項(xiàng)之間用逗號(hào)分隔。HAVING子句必須跟隨GROUPBY一起使用,表示在分組匯總時(shí),可以根據(jù)組條件表達(dá)式篩選出滿足條件的組記錄。(5)ORDERBY子句表示在顯示結(jié)果時(shí),按照指定字段進(jìn)行排序。ASC表示升序,DESC表示降序,省略不寫(xiě)默認(rèn)情況下是ASC。383.3數(shù)據(jù)查詢下面我們以學(xué)生選課系統(tǒng)為例說(shuō)明SELECT語(yǔ)句的各種用法。學(xué)生選課系統(tǒng)中包含三張表:學(xué)生表:student(sno,sname,sex,age,dept),表中屬性列依次是學(xué)生學(xué)號(hào)、姓名、性別、年齡、學(xué)生所在的系別名稱。其中

sno為主碼,表中數(shù)據(jù)如圖3.1所示。課程表:course(cno,cname,tname,cpno,credit),表中屬性列依次是課程編號(hào)、課程名稱、授課教師名、先修課程號(hào)和學(xué)分。其中cno為主碼,表中數(shù)據(jù)如圖3.2所示。選課表:sc(sno,cno,grade),表中屬性列依次是學(xué)號(hào)、課程號(hào)和成績(jī)。其中屬性組合(sno,cno)為主碼,表中數(shù)據(jù)如圖3.3所示。394041423.3數(shù)據(jù)查詢3.3.2單表無(wú)條件查詢單表查詢是指查詢的數(shù)據(jù)只來(lái)自一張表,此時(shí),SELECT語(yǔ)句中的FROM子句只涉及一張表的查詢。1.選擇表中若干列選擇表中的全部列或部分列,這就是投影運(yùn)算。433.3數(shù)據(jù)查詢例題3.12查詢?nèi)w學(xué)生的學(xué)號(hào)、姓名和年齡。

SELECTsno,sname,ageFROMstudent; 結(jié)果如下:443.3數(shù)據(jù)查詢例題3.13查詢?nèi)空n程的課程名稱和授課教師名。SELECTcname,tname

FROMcourse;結(jié)果如下:453.3數(shù)據(jù)查詢(2)查詢?nèi)苛欣}3.14查詢?nèi)空n程的詳細(xì)記錄。SELECT*FROMcourse;結(jié)果如下:463.3數(shù)據(jù)查詢(3)查詢經(jīng)過(guò)計(jì)算的值例題3.15查詢?nèi)w學(xué)生的姓名、性別及其出生年份。SELECTsname,sex,2020-ageFROMstudent;結(jié)果如下:473.3數(shù)據(jù)查詢(4)指定別名來(lái)改變查詢結(jié)果的列標(biāo)題方法就是:在列名的后面加上一個(gè)空格或者是“as”,然后寫(xiě)上它的別名。在查詢結(jié)果顯示時(shí)就用別名代替列名了。例題3.16查詢?nèi)w學(xué)生的姓名、性別及其出生年份。SELECTsname,sex,2020-age出生年份FROMstudent;結(jié)果如下:483.3數(shù)據(jù)查詢2.選擇表中若干行選擇表中若干行,這就是選擇運(yùn)算。這里介紹無(wú)條件的選擇運(yùn)算,后面介紹有條件的選擇運(yùn)算,需要注意的是消除取值重復(fù)的行。例題3.17查詢所有選修了課程的學(xué)生學(xué)號(hào)。SELECTDISTINCTsnoFROMsc;結(jié)果如下:493.3數(shù)據(jù)查詢3.3.3單表有條件查詢單表查詢時(shí),若需滿足某些條件則可以通過(guò)WHERE子句來(lái)實(shí)現(xiàn)。使用WHERE子句時(shí),應(yīng)該注意以下幾點(diǎn):(1)如果該列數(shù)據(jù)類型為字符型,需要使用單引號(hào)把字符串括起來(lái)。

如:WHEREcname=‘java’,單引號(hào)內(nèi)的字符串大小寫(xiě)是有區(qū)

別的。(2)如果該列數(shù)據(jù)類型為日期型,需要使用單引號(hào)把日期括起來(lái)。(3)如果該列數(shù)據(jù)類型為數(shù)值型,則不必用單引號(hào)。

如:WHEREage>20。(4)在WHERE子句中可以使用列名或表達(dá)式,但不能使用它的別名。503.3數(shù)據(jù)查詢WHERE子句常用的查詢條件如表3.6所示。513.3數(shù)據(jù)查詢1.比較大小例題3.18查詢信息系全體學(xué)生的姓名。SELECTsnameFROMstudentWHEREdept=‘信息系’;結(jié)果如下:523.3數(shù)據(jù)查詢例題3.19查詢年齡超過(guò)20歲的學(xué)生姓名及其年齡。SELECTsname,ageFROMstudentWHEREage>20;結(jié)果如下:533.3數(shù)據(jù)查詢例題3.20查詢考試成績(jī)有不及格的學(xué)生的學(xué)號(hào)。SELECTDISTINCTsnoFROMscWHEREgrade<60;結(jié)果如下:語(yǔ)句中使用了DISTINCT關(guān)鍵字,目的是當(dāng)某一個(gè)學(xué)生有多門(mén)課程不及格時(shí),他的學(xué)號(hào)只顯示一次。543.3數(shù)據(jù)查詢2.確定范圍(謂詞BETWEENAND)例題3.21查詢年齡在16至20歲(包括16歲和20歲)之間的學(xué)生姓名和年齡。SELECTsname,ageFROMstudentWHEREageBETWEEN16AND20;結(jié)果如下:553.3數(shù)據(jù)查詢例題3.22查詢年齡不在16至20歲之間的學(xué)生姓名和年齡。SELECTsname,ageFROMstudentWHEREageNOTBETWEEN16AND20;結(jié)果如下:563.3數(shù)據(jù)查詢3.確定集合(謂詞IN)例題3.23查詢計(jì)算機(jī)系、信息系和管理系的學(xué)生姓名和性別。SELECTsname,sexFROMstudentWHEREdeptIN(‘計(jì)算機(jī)系’,‘信息系’,‘管理系’);結(jié)果如下:573.3數(shù)據(jù)查詢例題3.24查詢既不是計(jì)算機(jī)系、信息系,也不是管理系的學(xué)生姓名和性別。SELECTsname,sexFROMstudentWHEREdeptNOTIN(‘計(jì)算機(jī)系’,‘信息系’,‘管理系’);結(jié)果如下:583.3數(shù)據(jù)查詢4.字符匹配(謂詞LIKE)謂詞LIKE可以用來(lái)進(jìn)行字符串的匹配。基本格式為:

[NOT]LIKE‘<匹配串>’[ESCAPE‘<換碼字符>’]其含義是查找指定的屬性列值與<匹配串>相匹配的元組。<匹配串>可以是一個(gè)完整的字符串,也可以含有通配符%和__。其中:%(百分號(hào))代表任意長(zhǎng)度(長(zhǎng)度可以為0)的字符串。__(下橫線)代表任意單個(gè)字符。593.3數(shù)據(jù)查詢例題3.25查詢所有姓張的學(xué)生姓名、年齡和系別名稱。SELECTsname,age,deptFROMstudentWHEREsnameLIKE‘張%’;結(jié)果如下:如果換成NOTLIKE,表示不姓張的同學(xué)。如果用戶查詢的匹配字符串本身就含有%或_,這時(shí)就要使用ESCAPE‘<換碼字符>’短語(yǔ)對(duì)通配符進(jìn)行轉(zhuǎn)義。603.3數(shù)據(jù)查詢例題3.26查詢以“jsp”開(kāi)頭且倒數(shù)第2個(gè)字符為“g”的課程詳細(xì)信息SELECT*FROMcourseWHEREcnameLIKE‘jsp\_%g_’ESCAPE‘\’;結(jié)果如下:613.3數(shù)據(jù)查詢5.涉及空值的查詢例題3.27查詢選修了課程但沒(méi)有成績(jī)的學(xué)生學(xué)號(hào)和相應(yīng)的課程號(hào)。SELECTsno,cnoFROMscWHEREgradeISNULL;結(jié)果如下:注意:這里“IS”不能用等號(hào)(=)代替。623.3數(shù)據(jù)查詢例題3.28查詢選修了課程并且有成績(jī)的學(xué)生學(xué)號(hào)和相應(yīng)的課程號(hào)。SELECTsno,cnoFROMscWHEREgradeISNOTNULL;結(jié)果如下:633.3數(shù)據(jù)查詢6.多重條件查詢邏輯運(yùn)算符AND和OR可用來(lái)連接多個(gè)查詢條件。AND的優(yōu)先級(jí)高于OR,但用戶可以通過(guò)括號(hào)來(lái)改變優(yōu)先級(jí)。例題3.29查詢計(jì)算機(jī)系女同學(xué)的姓名和年齡。SELECTsname,ageFROMstudentWHEREdept=‘計(jì)算機(jī)系’ANDsex=‘女’;結(jié)果如下:643.3數(shù)據(jù)查詢例題3.30查詢管理系或年齡在20歲以下的學(xué)生姓名。SELECTsnameFROMstudentWHEREdept=‘管理系’ORage<20;結(jié)果如下:653.3數(shù)據(jù)查詢3.3.4聚集函數(shù)為了進(jìn)一步方便用戶,增強(qiáng)檢索功能,SQL提供了許多聚集函數(shù),主要有:(1)COUNT([DISTINCT|ALL]*)

統(tǒng)計(jì)元組個(gè)數(shù)

COUNT([DISTINCT|ALL]<列名>)統(tǒng)計(jì)某一列中值的個(gè)數(shù)(2)SUM([DISTINCT|ALL]<列名>)

計(jì)算一列值的總和(此列必須是數(shù)值型)(3)AVG([DISTINCT|ALL]<列名>)

計(jì)算一列值的平均值(此列必須是數(shù)值型)(4)MAX([DISTINCT|ALL]<列名>)

求一列值中的最大值(5)MIN([DISTINCT|ALL]<列名>)

求一列值中的最小值3.3數(shù)據(jù)查詢例題3.31查詢學(xué)生表中的總?cè)藬?shù)。SELECTCOUNT(*)FROMstudent;結(jié)果如下:673.3數(shù)據(jù)查詢例題3.32查詢選修了課程的學(xué)生人數(shù)。SELECTCOUNT(DISTINCTsno)FROM

sc;結(jié)果如下:由于存在一個(gè)同學(xué)選修多門(mén)課程的情況,為了避免重復(fù)計(jì)算學(xué)生人數(shù),所以必須加DISTINCT關(guān)鍵字,表示在統(tǒng)計(jì)人數(shù)時(shí),取消指定列中的重復(fù)值。683.3數(shù)據(jù)查詢例題3.33查詢選修c3課程的平均成績(jī)、最高成績(jī)和最低成績(jī)。SELECTAVG(grade),MAX(grade),MIN(grade)FROMscWHEREcno=‘c3’;結(jié)果如下:693.3數(shù)據(jù)查詢例題3.34查詢學(xué)號(hào)為10172001的學(xué)生選修課程的成績(jī)總和。SELECTSUM(grade)FROMscWHEREsno=‘10172001’;結(jié)果如下:703.3數(shù)據(jù)查詢3.3.5分組查詢和排序查詢1.對(duì)查詢結(jié)果分組在SELECT語(yǔ)句中可以使用GROUPBY子句將查詢結(jié)果按照某一列或多列的值分組,值相等的為一組,然后使用聚集函數(shù)返回每一個(gè)組的匯總信息。而且,還可以使用HAVING子句限制返回的結(jié)果集。713.3數(shù)據(jù)查詢例題3.35查詢選課表中每門(mén)課程的課程號(hào)及這門(mén)課程的選修人數(shù)。SELECTcno,COUNT(sno)FROM

scGROUPBYcno;結(jié)果如下:723.3數(shù)據(jù)查詢例題3.36查詢選修5門(mén)及其以上課程的學(xué)生學(xué)號(hào)。SELECTsnoFROMscGROUPBYsnoHAVINGCOUNT(cno)>=5;結(jié)果如下:733.3數(shù)據(jù)查詢2.對(duì)查詢結(jié)果進(jìn)行排序ORDERBY子句可指定按照一個(gè)或多個(gè)屬性列的升序(ASC)或者降序(DESC)重新排列查詢結(jié)果。省略不寫(xiě),默認(rèn)為升序排列。由于是控制輸出結(jié)果,因此ORDERBY子句只能用于最終的查詢結(jié)果。743.3數(shù)據(jù)查詢例題3.37查詢選修c3課程的學(xué)生學(xué)號(hào)及成績(jī),查詢結(jié)果按照成績(jī)的降序排列。SELECTsno,gradeFROMscWHEREcno=‘c3’ORDERBYgradeDESC;75結(jié)果如下:3.3數(shù)據(jù)查詢例題3.38查詢所有學(xué)生的基本信息,查詢結(jié)果按學(xué)生年齡的降序排列,年

齡相同時(shí)則按學(xué)號(hào)升序排列。SELECT*FROMstudentORDERBYageDESC,snoASC;76結(jié)果如下:3.3數(shù)據(jù)查詢3.3.6連接查詢連接查詢是指通過(guò)兩個(gè)或兩個(gè)以上的關(guān)系表或視圖的連接操作來(lái)實(shí)現(xiàn)的查詢。連接查詢是關(guān)系數(shù)據(jù)庫(kù)中最主要的查詢,包括等值連接、非等值連接、自然連接、自身連接、外連接和復(fù)合條件連接等。連接查詢中用來(lái)連接兩個(gè)表的條件稱為連接條件或連接謂詞,其格式為:[<表名1>.]<列名1><比較運(yùn)算符>[<表名2>.]<列名2>其中比較運(yùn)算符主要有:=、>、<、>=、<=、!=。773.3數(shù)據(jù)查詢3.3.6連接查詢此外連接謂詞還可以使用下面形式:[<表名1>.]<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名2>.]<列名3>連接條件中的列名稱為連接字段。連接條件中的各連接字段類型必須是可比的,但名字不必相同。783.3數(shù)據(jù)查詢1.等值連接當(dāng)連接運(yùn)算符為“=”時(shí),稱為等值連接。例題3.39查詢每個(gè)同學(xué)基本信息及其選修課程的情況。

SELECTstudent.*,sc.*FROMstudent,scWHEREstudent.sno=sc.sno;說(shuō)明:(1)student.sno=sc.sno是兩個(gè)關(guān)系表的連接條件,student表和sc表中的

記錄只有滿足這個(gè)條件才能連接。(2)在student表和sc表中存在相同的屬性名sno,因此存在屬性的二義性問(wèn)題。

SQL通過(guò)在屬性前面加上關(guān)系名及一個(gè)小圓點(diǎn)來(lái)解決這個(gè)問(wèn)題,表示該屬性

來(lái)自這個(gè)關(guān)系。79803.3數(shù)據(jù)查詢2.自然連接如果是按照兩個(gè)表中的相同屬性進(jìn)行等值連接,并且在結(jié)果中去掉了重復(fù)的屬性列,我們稱之為自然連接。例題3.40用自然連接來(lái)完成查詢每個(gè)同學(xué)基本信息及其選修課程的情況。SELECTstudent.sno,sname,sex,age,dept,cno,gradeFROMstudent,scWHEREstudent.sno=sc.sno;結(jié)果如下:81823.3數(shù)據(jù)查詢3.復(fù)合條件連接連接條件用于多個(gè)表之間的連接,限制條件用于限制所選取的記錄要滿足什么條件,這種連接稱為復(fù)合條件連接。例題3.41查詢選修課程號(hào)為c1,并且成績(jī)不及格的學(xué)生學(xué)號(hào)、姓名和系別名稱。SELECTstudent.sno,sname,deptFROMstudent,scWHEREstudent.sno=sc.sno/*連接條件*/

ANDcno=‘c1’/*限制條件*/

ANDgrade<60;/*限制條件*/結(jié)果如下:833.3數(shù)據(jù)查詢例題3.42查詢計(jì)算機(jī)系選修“maths”課程的學(xué)生姓名、授課教師名以及這門(mén)課程的成績(jī)。SELECTsname,tname,gradeFROMstudent,course,scWHEREstudent.sno=sc.sno

/*連接條件*/ANDo=o

/*連接條件*/ANDdept=‘計(jì)算機(jī)系’/*限制條件*/ANDcname=‘maths’;/*限制條件*/結(jié)果如下:843.3數(shù)據(jù)查詢

如果是多個(gè)表之間連接,那么WHERE子句中就有多個(gè)連接條件。n個(gè)表之間的連接至少有n-1個(gè)連接條件。853.3數(shù)據(jù)查詢4.自身連接連接操作不僅可以在兩個(gè)表之間進(jìn)行,也可以是一個(gè)表與其自身進(jìn)行連接,稱為表的自身連接。自身連接要求必須給表取別名,把它們當(dāng)作兩個(gè)不同的表來(lái)處理。例題3.43在sc表中查詢至少選修課程號(hào)為c3和c4的學(xué)生學(xué)號(hào)。SELECTx.snoFROMscx,scyWHEREx.sno=y.sno/*連接條件*/ANDo=‘c3’/*限制條件*/ANDo=‘c4’;/*限制條件*/結(jié)果如下:8687

上面例題中,連接條件用來(lái)實(shí)現(xiàn)每一條記錄是同一個(gè)學(xué)生的選課信息,限制條件用來(lái)實(shí)現(xiàn)選修的課程至少有c3和c4。3.3數(shù)據(jù)查詢5.外連接在通常的連接操作中,只有滿足連接條件的元組才能作為結(jié)果輸出。如例題3.39和例題3.40的結(jié)果中沒(méi)有10172006趙六學(xué)生的信息,原因在于他沒(méi)有選課,在SC表中沒(méi)有相應(yīng)的元組。如果想以student表為主體列出每個(gè)學(xué)生的基本情況及其選課情況,若某個(gè)學(xué)生沒(méi)有選課,只輸出學(xué)生的基本信息,其選課信息可以為空值,此時(shí)就需要使用外連接了。

外連接的表示方法為,在連接條件的某一邊加上操作符(+)(有的數(shù)據(jù)庫(kù)系統(tǒng)中用*)。(+)號(hào)放在連接條件中信息不完整的那一邊。外連接運(yùn)算符(+)出現(xiàn)在連接條件的右邊,則稱為左外連接;若出現(xiàn)在連接條件的左邊,則稱為右外連接。883.3數(shù)據(jù)查詢例題3.44以student表為主體列出每個(gè)學(xué)生的基本情況及其選課情況,若某個(gè)學(xué)生沒(méi)有選課,只輸出學(xué)生的基本信息,其選課信息為空值。SELECTstudent.sno,sname,sex,age,dept,cno,gradeFROMstudent,scWHEREstudent.sno=sc.sno(+);結(jié)果如下:89903.3數(shù)據(jù)查詢3.3.7嵌套查詢?cè)赟QL語(yǔ)言中,一個(gè)SELECT-FROM-WHERE語(yǔ)句稱為一個(gè)查詢塊。

將一個(gè)查詢塊嵌套在另一個(gè)查詢塊的WHERE子句或HAVING子

句的條件中的查詢稱為嵌套查詢。這也是涉及多表的查詢,

其中外層查詢稱為父查詢,內(nèi)層查詢稱為子查詢。使用子查詢的原則:(1)子查詢必須用括號(hào)括起來(lái)。(2)子查詢不能包含ORDERBY子句。(3)子查詢可以在許多SQL語(yǔ)句中使用,如SELECT、INSERT、UPDATE、DELETE語(yǔ)句中。913.3數(shù)據(jù)查詢1.不相關(guān)子查詢查詢條件不依賴于父查詢的子查詢稱為不相關(guān)子查詢。它的執(zhí)行過(guò)程為:先執(zhí)行子查詢,將子查詢的結(jié)果作為外層父查詢的條件,然后執(zhí)行父查詢。不相關(guān)子查詢的特點(diǎn):①先執(zhí)行子查詢,后執(zhí)行父查詢。②子查詢能夠獨(dú)立執(zhí)行,不依賴于外層父查詢。③子查詢只執(zhí)行一次。(1)帶有IN謂詞的子查詢當(dāng)子查詢的結(jié)果是一個(gè)集合時(shí),經(jīng)常使用帶IN謂詞的子查詢。923.3數(shù)據(jù)查詢例題3.45查詢選修課程號(hào)為c4的學(xué)生姓名。方法一:采用前面學(xué)習(xí)的多表連接查詢來(lái)完成。SELECTsnameFROMstudent,scWHEREstudent.sno=sc.snoANDcno=‘c4’;結(jié)果如下:933.3數(shù)據(jù)查詢方法二:采用子查詢來(lái)完成。SELECTsnameFROMstudentWHEREsnoIN(SELECTsnoFROMsc

WHEREcno=‘c4’);結(jié)果如下:943.3數(shù)據(jù)查詢例題3.46查詢既沒(méi)有選修課程號(hào)c3,也沒(méi)有選修課程號(hào)c4的學(xué)生學(xué)號(hào)。SELECTsnoFROMstudentWHEREsnoNOTIN(SELECTsnoFROMsc

WHEREcno=‘c3’)

ANDsnoNOTIN(SELECTsnoFROMscWHEREcno=‘c4’);結(jié)果如下:953.3數(shù)據(jù)查詢例題3.47查詢選修了課程名為“database”的學(xué)生學(xué)號(hào)和姓名。SELECTsno,snameFROMstudentWHEREsnoIN

(SELECTsnoFROMscWHEREcnoIN

(SELECTcnoFROMcourseWHEREcname=‘database’));結(jié)果如下:963.3數(shù)據(jù)查詢此題也可以采用多表連接方法來(lái)實(shí)現(xiàn)。SELECTstudent.sno,snameFROMstudent,sc,courseWHEREstudent.sno=sc.snoANDo=oANDcname=‘database’;結(jié)果如下:973.3數(shù)據(jù)查詢(2)帶有比較運(yùn)算符的子查詢帶有比較運(yùn)算符的子查詢是指父查詢與子查詢之間用比較運(yùn)算符進(jìn)行連接。只有當(dāng)內(nèi)層查詢返回的是單值時(shí),才可以用>、<、=、>=、<=、!=或<>等比較運(yùn)算符。983.3數(shù)據(jù)查詢例題3.48查詢與學(xué)號(hào)“10172007”學(xué)生在同一系別的學(xué)生學(xué)號(hào)、姓名和系別名稱。

SELECTsno,sname,deptFROMstudentWHEREdept=(SELECTdeptFROMstudent

WHEREsno=‘10172007’);結(jié)果如下:993.3

數(shù)據(jù)查詢也可以用前面學(xué)習(xí)的IN謂詞來(lái)實(shí)現(xiàn)。SELECTsno,sname,deptFROMstudentWHEREdeptIN(SELECTdeptFROMstudentWHEREsno=‘10172007’);結(jié)果如下:1003.3數(shù)據(jù)查詢(3)帶有ANY謂詞或ALL謂詞的子查詢使用ANY或ALL謂詞前必須同時(shí)使用比較運(yùn)算符,含義如表3.7所示。101注意:<>ALL等價(jià)于NOTIN;=ANY等價(jià)于IN;=ALL、<>ANY沒(méi)有意義。3.3數(shù)據(jù)查詢例題3.49查詢選修課程號(hào)為c4的學(xué)生姓名。(與例3.45相同,IN與=ANY等價(jià))SELECTsnameFROMstudentWHEREsno=ANY(SELECTsnoFROMsc

WHEREcno=‘c4’);結(jié)果如下:1023.3數(shù)據(jù)查詢例題3.50查詢比所有男同學(xué)年齡都大的女同學(xué)的學(xué)號(hào)、姓名和年齡。SELECTsno,sname,ageFROMstudentWHEREsex=‘女’ANDage>ALL(SELECTageFROMstudentWHEREsex=‘男’);結(jié)果如下:1033.3數(shù)據(jù)查詢用聚集函數(shù)實(shí)現(xiàn)子查詢通常比直接用ANY或ALL謂詞查詢效率高,ANY或ALL謂詞與聚集函數(shù)的對(duì)應(yīng)關(guān)系如表3.8所示。1043.3數(shù)據(jù)查詢例題3.51查詢其他系中比日語(yǔ)系某一學(xué)生年齡大的學(xué)生姓名和年齡。方法一:SELECTsname,ageFROMstudentWHEREdept<>‘日語(yǔ)系’ANDage>ANY(SELECTageFROMstudentWHEREdept=‘日語(yǔ)系’);結(jié)果如下:1053.3數(shù)據(jù)查詢方法二:SELECTsname,ageFROMstudentWHEREdept<>‘日語(yǔ)系’ANDage>(SELECTMIN(age)

FROMstudent

WHEREdept=‘日語(yǔ)系’);結(jié)果如下:1063.3數(shù)據(jù)查詢例題3.52查詢其他系中比日語(yǔ)系所有學(xué)生年齡都大的學(xué)生姓名和年齡。方法一:SELECTsname,ageFROMstudentWHEREage>ALL(SELECTageFROMstudentWHEREdept=‘日語(yǔ)系’);結(jié)果如下:1073.3數(shù)據(jù)查詢方法二:SELECTsname,ageFROMstudentWHEREage>(SELECTMAX(age)FROMstudentWHEREdept=‘日語(yǔ)系’);結(jié)果如下:1083.3數(shù)據(jù)查詢2.相關(guān)子查詢前面我們介紹的子查詢都是不相關(guān)子查詢,不相關(guān)子查詢比較簡(jiǎn)單,在整個(gè)過(guò)程中子查詢只執(zhí)行一次,并且把結(jié)果用于父查詢,即子查詢不依賴于外層父查詢。而更復(fù)雜的情況是子查詢要多次執(zhí)行,子查詢的查詢條件依賴于外層父查詢的某個(gè)屬性值,稱這類查詢?yōu)橄嚓P(guān)子查詢。相關(guān)子查詢的特點(diǎn):①先執(zhí)行父查詢,后執(zhí)行子查詢。②子查詢不能獨(dú)立運(yùn)行,子查詢的條件依賴外層父查詢中取的值。③子查詢多次運(yùn)行。1093.3數(shù)據(jù)查詢(1)帶有比較運(yùn)算符的相關(guān)子查詢例題3.53查詢所有課程成績(jī)均及格的學(xué)生學(xué)號(hào)和姓名。SELECTsno,snameFROMstudentWHERE60<=(SELECTMIN(grade)

FROMscWHEREstudent.sno=sc.sno);結(jié)果如下:1103.3數(shù)據(jù)查詢(2)有EXISTS謂詞的子查詢?cè)谙嚓P(guān)子查詢中經(jīng)常使用EXISTS謂詞。帶有EXISTS謂詞的子查詢不返回任何數(shù)據(jù),只產(chǎn)生邏輯真值“true”或邏輯假值“false”。

若內(nèi)層查詢結(jié)果非空,則外層的WHERE子句返回真值。

若內(nèi)層查詢結(jié)果為空,則外層的WHERE子句返回假值。由EXISTS引出的子查詢,其目標(biāo)列表達(dá)式通常都用*,因?yàn)閹XISTS的子查詢只返回真值或假值,給出列名無(wú)實(shí)際意義。與EXISTS謂詞相對(duì)應(yīng)的是NOTEXISTS謂詞。

若內(nèi)層查詢結(jié)果非空,則外層的WHERE子句返回假值。

若內(nèi)層查詢結(jié)果為空,則外層的WHERE子句返回真值。1113.3數(shù)據(jù)查詢例題3.54查詢選修課程號(hào)為c4的學(xué)生姓名。(與例3.45、例3.49相同)SELECTsnameFROMstudentWHEREEXISTS(SELECT*FROMscWHEREstudent.sno=sc.snoANDcno=‘c4’);結(jié)果如下:1123.3數(shù)據(jù)查詢例題3.55查詢沒(méi)有選修課程號(hào)為c4的學(xué)生姓名。SELECTsnameFROMstudentWHERENOTEXISTS(SELECT*FROMscWHEREstudent.sno=sc.snoANDcno=‘c4’);結(jié)果如下:1133.3數(shù)據(jù)查詢例題3.56查詢沒(méi)有選課的學(xué)生學(xué)號(hào)和姓名。SELECTsno,snameFROMstudentWHERENOTEXISTS(SELECT*FROMscWHEREstudent.sno=sc.sno);結(jié)果如下:1143.3數(shù)據(jù)查詢例題3.57查詢所有課程成績(jī)均大于80分的學(xué)生學(xué)號(hào)和姓名。SELECTsno,snameFROMstudentWHEREsnoIN

(SELECTsnoFROMscWHERENOTEXISTS

(SELECT*FROMscWHEREstudent.sno=sc.snoANDgrade<=80));結(jié)果如下:1153.3數(shù)據(jù)查詢3.3.8集合查詢?nèi)舭讯鄠€(gè)SELECT語(yǔ)句的結(jié)果合并為一個(gè)結(jié)果集,可用集合操作來(lái)完成。集合操作主要包括并操作UNION、交操作INTERSECT和差操作MINUS。參加集合操作的各個(gè)結(jié)果表的列數(shù)必須相同,對(duì)應(yīng)項(xiàng)的數(shù)據(jù)類型也必須相同。各個(gè)結(jié)果表中的列名可以不同。1163.3數(shù)據(jù)查詢1.并操作SQL語(yǔ)言使用并操作UNION把查詢的結(jié)果合并起來(lái),并且去掉重復(fù)的元組。例題3.58查詢計(jì)算機(jī)系和信息系的學(xué)生姓名的并集。SELECTsnameFROMstudentWHEREdept=‘計(jì)算機(jī)系’UNIONSELECTsnameFROMstudentWHEREdept=‘信息系’;結(jié)果如下:117上述集合查詢語(yǔ)句的結(jié)果等價(jià)于:SELECTsnameFROMstudentWHEREdept=‘計(jì)算機(jī)系’ORdept=‘信息系’;3.3數(shù)據(jù)查詢2.交操作SQL語(yǔ)言使用INTERSECT把同時(shí)出現(xiàn)在兩個(gè)查詢的結(jié)果取出,實(shí)現(xiàn)交操作,并且也會(huì)去掉重復(fù)的元組。例題3.59查詢管理系的學(xué)生和年齡大于20歲的學(xué)生的交集。SELECT*FROMstudentWHEREdept=‘管理系’INTERSECTSELECT*FROMstudentWHEREage>20;結(jié)果如下:118上述集合查詢語(yǔ)句的結(jié)果等價(jià)于:SELECT*FROMstudentWHEREdept=‘管理系’ANDage>20;2.交操作例題3.43在sc表中查詢至少選修課程號(hào)為c3和c4的學(xué)生學(xué)號(hào)。

SELECTx.snoFROMscx,scyWHEREx.sno=y.sno/*連接條件*/ANDo='c3'/*限制條件*/ANDo='c4';/*限制條件*/119scxscysnocnogradesnocnograde用集合查詢實(shí)現(xiàn)該查詢:SELECTsnoFROMscWHEREcno='c3'INTERSECTSELECTsnoFROMscWHEREcno='c4';

3.3數(shù)據(jù)查詢3.差操作SQL語(yǔ)言使用MINUS把出現(xiàn)在第一個(gè)查詢結(jié)果中,但不出現(xiàn)在第二個(gè)查詢結(jié)果中的元組取出,實(shí)現(xiàn)差操作。例題3.60查詢管理系的學(xué)生和年齡大于20歲的學(xué)生的差集。SELECT*FROMstudentWHEREdept=‘管理系’MINUSSELECT*FROMstudentWHEREage>20;結(jié)果如下:120上述集合查詢語(yǔ)句的結(jié)果等價(jià)于:SELECT*FROMstudentWHEREdept=‘管理系’ANDage<=20;3.4數(shù)據(jù)操縱第3章關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL3.4數(shù)據(jù)操縱3.4.1插入數(shù)據(jù)當(dāng)基本表建立以后,就可以使用INSERT語(yǔ)句向表中插入數(shù)據(jù)了。INSERT語(yǔ)句有兩種插入形式:插入單個(gè)元組和插入多個(gè)元組(插入子查詢結(jié)果)。1.插入單個(gè)元組向基本表中插入數(shù)據(jù)的語(yǔ)法格式如下:INSERTINTO<基本表名>[(<列名1>,<列名2>,…,<列名n>)]VALUES(<列值1>,<列值2>,…,<列值n>)其中,<基本表名>指定要插入元組的表的名字;<列名1>,<列名2>,…,<列名n>為要添加列值的列名序列;VALUES后則一一對(duì)應(yīng)要添加列的輸入值。1223.4數(shù)據(jù)操縱注意:(1)向表中插入數(shù)據(jù)之前,表的結(jié)構(gòu)必須已經(jīng)創(chuàng)建。(2)插入的數(shù)據(jù)及列名之間用逗號(hào)分開(kāi)。(3)在INSERT語(yǔ)句中列名是可以選擇指定的,如果沒(méi)有指定列名,則表示這些列按表中或視圖中列的順序和個(gè)數(shù)插入數(shù)據(jù)。(4)插入值的數(shù)據(jù)類型、個(gè)數(shù)、前后順序必須與表中屬性列的數(shù)據(jù)類型、個(gè)數(shù)、前后順序匹配。1233.4數(shù)據(jù)操縱例題3.61向?qū)W生表中插入一個(gè)新的學(xué)生記錄。方法一:省略所有列名

INSERTINTOstudentVALUES(‘10172011’,‘小明’,‘男’,20,‘計(jì)算機(jī)系’);方法二:指出所有列名

INSERTINTOstudent(sno,sname,sex,age,dept)

VALUES(‘10172011’,‘小明’,‘男’,20,‘計(jì)算機(jī)系’);兩種方法的作用是相同的。1243.4數(shù)據(jù)操縱例題3.62向?qū)W生表中指定的屬性列插入數(shù)據(jù)。

INSERTINTOstudent(sno,sname,sex)VALUES(‘10172012’,‘小強(qiáng)’,‘女’);其中,沒(méi)有插入數(shù)據(jù)的屬性列的值均為空值。1253.4數(shù)據(jù)操縱2.插入多個(gè)元組向基本表中插入數(shù)據(jù)的語(yǔ)法格式如下:INSERTINTO<基本表名>[(<列名1>,<列名2>,…,<列名n>)]子查詢;如果列名序列省略則子查詢所得到的數(shù)據(jù)列必須和要插入數(shù)據(jù)的基本表的數(shù)據(jù)列完全一致。如果列名序列給出則子查詢結(jié)果與列名序列要一一對(duì)應(yīng)。1263.4數(shù)據(jù)操縱例題3.63如果已經(jīng)創(chuàng)建了課程平均成績(jī)記錄表course_avg(cno,ave),其中ave表示每門(mén)課程的平均成績(jī),向course_avg表中插入每門(mén)課程的課程號(hào)及平均成績(jī)。INSERTINTOcourse_avg(cno,ave)SELECTcno,AVG(grade)FROMscGROUPBYcno;1273.4數(shù)據(jù)操縱3.4.2修改數(shù)據(jù)如果表中的數(shù)據(jù)出現(xiàn)錯(cuò)誤,可以利用UPDATE命令進(jìn)行修改。UPDATE語(yǔ)句用以修改滿足指定條件的元組信息。滿足指定條件的元組可以是一個(gè)元組,也可以是多個(gè)元組。UPDATE語(yǔ)句一般語(yǔ)法格式為:UPDATE<基本表名>SET<列名1>=<表達(dá)式>[,<列名2>=<表達(dá)式>]…[WHERE<條件>];其中,UPDATE關(guān)鍵字用于定位修改哪一張表,SET關(guān)鍵字用于定位修改這張表中的哪些屬性列,WHERE<條件>用于定位修改這些屬性列當(dāng)中的哪些行。1283.4數(shù)據(jù)操縱1.修改某一個(gè)元組的值例題3.64將maths課程的學(xué)分改為4學(xué)分。UPDATEcourseSETcredit=4WHEREcname=‘maths’;2.修改多個(gè)元組的值例題3.65將所有男同學(xué)的年齡增加2歲。UPDATEstudentSETage=age+2WHEREsex=‘男’;例題3.66將所有課程的學(xué)分減1。UPDATEcourseSETcredit=credit-1;1293.4數(shù)據(jù)操縱3.帶子查詢的更新在UPDATE語(yǔ)句中可以嵌套子查詢,用于構(gòu)造修改的條件。例題3.67將所有選修maths課程的學(xué)生成績(jī)改為0分。UPDATEscSETgrade=0WHEREcno=(SELECTcnoFROMcourseWHEREcname='maths');1303.4數(shù)據(jù)操縱3.4.3刪除數(shù)據(jù)如果不再需要學(xué)生選課系統(tǒng)中的某些數(shù)據(jù),此時(shí)應(yīng)該刪除這些數(shù)據(jù),以釋放其所占用的存儲(chǔ)空間。DELETE語(yǔ)句的一般語(yǔ)法格式為:DELETEFROM<表名>[WHERE<條件>];DELETE語(yǔ)句的功能是從指定表中刪除滿足WHERE<條件>的所有元組。DELETE語(yǔ)句只刪除表中的數(shù)據(jù),而不能刪除表的結(jié)構(gòu),所以表的定義仍然在數(shù)據(jù)字典中。如果省略WHERE<條件>,表示刪除表中全部的元組信息。1313.4數(shù)據(jù)操縱1.刪除某一個(gè)元組的值例題3.68刪除學(xué)號(hào)為“10172011”的學(xué)生記錄。DELETEFROMstudentWHEREsno=‘10172011’;2.刪除多個(gè)元組的值例題3.69刪除學(xué)號(hào)為“10172005”學(xué)生的選課記錄。DELETEFROMscWHEREsno=‘10172005’;每一個(gè)學(xué)生可能選修多門(mén)課程,所以DELETE語(yǔ)句會(huì)刪除這個(gè)學(xué)生的多條選課記錄。例題3.70刪除所有學(xué)生的選課記錄。DELETEFROMsc;1323.4數(shù)據(jù)操縱3.帶子查詢的刪除在DELETE語(yǔ)句中同樣可以嵌套子查詢,用于構(gòu)造刪除的條件。例題3.71刪除王五同學(xué)的選課記錄。DELETEFROMscWHEREsno=(SELECTsnoFROMstudentWHEREsname='王五');1333.5視圖第3章關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL3.5視圖視圖是從一個(gè)或幾個(gè)基本表(或視圖)導(dǎo)出的表,它與基本表不同,是一個(gè)虛表。視圖一經(jīng)定義,就可以和基本表一樣被查詢、被刪除,我們也可以在一個(gè)視圖之上再定義新的視圖,但對(duì)視圖的更新(增加、刪除、修改)操作則有一定的限制。視圖的特點(diǎn)如下:(1)視圖是從現(xiàn)有的一個(gè)或多個(gè)表中提取出來(lái)的,可以屏蔽表中的某些信息。(2)視圖是一個(gè)虛表,對(duì)視圖的操作實(shí)際上是對(duì)基本表的操作。(3)數(shù)據(jù)庫(kù)中只存放視圖的定義,不存放視圖對(duì)應(yīng)的數(shù)據(jù)。這些數(shù)據(jù)仍存放在原來(lái)的基本表中,所以基本表中的數(shù)據(jù)發(fā)生變化,從視圖中查詢的數(shù)據(jù)也就隨之改變了。(4)視圖可以簡(jiǎn)化用戶查詢操作,隱蔽表之間的連接。1353.5視圖3.5.1定義視圖1.建立視圖建立視圖的一般語(yǔ)法格式如下:CREATEVIEW<視圖名>[(<列名>[,<列名>]…)]AS(子查詢)[WITHCHECKOPTION][WITHREADONLY];1363.5視圖其中:(1)視圖中的列名序列要么全部指定,要么全部省略。當(dāng)列名序列省略時(shí),直

接使用子查詢SELECT子句里的各列名作為視圖列名。下列幾種情況不能省略列名序列:①多表連接時(shí)選出了幾個(gè)同名列作為視圖的字段;②視圖列名中有常數(shù)、聚集函數(shù)或列表達(dá)式;③需要用更合適的新列名作視圖列的列名。(2)WITHCHECKOPTION是可選項(xiàng),該選項(xiàng)表示對(duì)所建視圖進(jìn)行INSERT、

UPDATE和DELETE操作時(shí),系統(tǒng)需檢查該操作的數(shù)據(jù)是否滿足子查詢中

WHERE子句里限定的條件,若不滿足,則系統(tǒng)拒絕執(zhí)行。(3)WITHREADONLY是可選項(xiàng),該選項(xiàng)保證在視圖上不能進(jìn)行任何DML操作。1373.5視圖例題3.72建立計(jì)算機(jī)系學(xué)生的視圖,包括學(xué)號(hào)、姓名、性別和年齡。并要求進(jìn)行插入和修改操作時(shí)仍要保證此視圖中只有計(jì)算機(jī)系的學(xué)生。CREATEVIEWcs_studentASSELECTsno,sname,sex,ageFROMstudentWHEREdept=‘計(jì)算機(jī)系’WITHCHECKOPTION;1383.5視圖例題3.73建立計(jì)算機(jī)系學(xué)生的只讀視圖,包括學(xué)號(hào)、姓名、性別和年齡。CREATEVIEWcs_student_onlyASSELECTsno,sname,sex,ageFROMstudentWHEREdept=‘計(jì)算機(jī)系’WITHREADONLY;本例中,視圖cs_student_only一旦建立,就不允許在視圖上進(jìn)行任何DML操作。1393.5視圖例題3.74建立計(jì)算機(jī)系選修maths課程的學(xué)生視圖,包括學(xué)號(hào)、姓名和成績(jī)。CREATEVIEWcs_student_mathsASSELECTstudent.sno,sname,gradeFROMstudent,course,scWHEREstudent.

溫馨提示

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