數(shù)據(jù)庫原理與應(yīng)用 課件 第3章 關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL_第1頁
數(shù)據(jù)庫原理與應(yīng)用 課件 第3章 關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL_第2頁
數(shù)據(jù)庫原理與應(yīng)用 課件 第3章 關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL_第3頁
數(shù)據(jù)庫原理與應(yīng)用 課件 第3章 關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL_第4頁
數(shù)據(jù)庫原理與應(yīng)用 課件 第3章 關(guān)系數(shù)據(jù)庫標(biāo)準(zhǔn)語言SQL_第5頁
已閱讀5頁,還剩152頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

如:WHEREage>20。(4)在WHERE子句中可以使用列名或表達式,但不能使用它的別名。503.3數(shù)據(jù)查詢WHERE子句常用的查詢條件如表3.6所示。513.3數(shù)據(jù)查詢1.比較大小例題3.18查詢信息系全體學(xué)生的姓名。SELECTsnameFROMstudentWHEREdept=‘信息系’;結(jié)果如下:523.3數(shù)據(jù)查詢例題3.19查詢年齡超過20歲的學(xué)生姓名及其年齡。SELECTsname,ageFROMstudentWHEREage>20;結(jié)果如下:533.3數(shù)據(jù)查詢例題3.20查詢考試成績有不及格的學(xué)生的學(xué)號。SELECTDISTINCTsnoFROMscWHEREgrade<60;結(jié)果如下:語句中使用了DISTINCT關(guān)鍵字,目的是當(dāng)某一個學(xué)生有多門課程不及格時,他的學(xué)號只顯示一次。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查詢計算機系、信息系和管理系的學(xué)生姓名和性別。SELECTsname,sexFROMstudentWHEREdeptIN(‘計算機系’,‘信息系’,‘管理系’);結(jié)果如下:573.3數(shù)據(jù)查詢例題3.24查詢既不是計算機系、信息系,也不是管理系的學(xué)生姓名和性別。SELECTsname,sexFROMstudentWHEREdeptNOTIN(‘計算機系’,‘信息系’,‘管理系’);結(jié)果如下:583.3數(shù)據(jù)查詢4.字符匹配(謂詞LIKE)謂詞LIKE可以用來進行字符串的匹配?;靖袷綖椋?/p>

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

統(tǒng)計元組個數(shù)

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

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

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

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

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

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

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

SQL通過在屬性前面加上關(guān)系名及一個小圓點來解決這個問題,表示該屬性

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

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

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

/*連接條件*/ANDo=o

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

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

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

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

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

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

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

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

WHEREcno=‘c3’)

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

(SELECTsnoFROMscWHEREcnoIN

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

SELECTsno,sname,deptFROMstudentWHEREdept=(SELECTdeptFROMstudent

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

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

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

FROMstudent

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

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

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

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

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

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

(SELECTsnoFROMscWHERENOTEXISTS

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

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

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

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

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

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

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

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

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

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論