關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言-SQL課件_第1頁(yè)
關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言-SQL課件_第2頁(yè)
關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言-SQL課件_第3頁(yè)
關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言-SQL課件_第4頁(yè)
關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言-SQL課件_第5頁(yè)
已閱讀5頁(yè),還剩133頁(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ǔ)言-SQL9/20/20231周口師范學(xué)院計(jì)算機(jī)科學(xué)系第3章關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言-SQL8/6/20231周口師在數(shù)據(jù)庫(kù)系統(tǒng)中,數(shù)據(jù)查詢是最常用的操作。SQL是目前使用最廣泛的數(shù)據(jù)庫(kù)語(yǔ)言。利用SQL可以通過(guò)功能強(qiáng)大而又簡(jiǎn)捷的查詢語(yǔ)言與數(shù)據(jù)庫(kù)打交道,從數(shù)據(jù)庫(kù)中得到想要的數(shù)據(jù)。SQL語(yǔ)句主要被用于進(jìn)行數(shù)據(jù)庫(kù)的查詢、定義、操縱和控制幾個(gè)方面,是一種功能齊全的數(shù)據(jù)庫(kù)語(yǔ)言。SQL的數(shù)據(jù)定義是指對(duì)關(guān)系模式一級(jí)的定義。數(shù)據(jù)操縱是指對(duì)關(guān)系中的具體數(shù)據(jù)進(jìn)行增、刪、改等更新操作。數(shù)據(jù)控制是指對(duì)數(shù)據(jù)訪問(wèn)權(quán)限的授予與取消。9/20/20232周口師范學(xué)院計(jì)算機(jī)科學(xué)系在數(shù)據(jù)庫(kù)系統(tǒng)中,數(shù)據(jù)查詢是最常用的操作。SQL是目前使用最廣3.1SQL語(yǔ)言基本知識(shí)3.1.1SQL的發(fā)展史1974年IBM圣約瑟實(shí)驗(yàn)室的Boyce和Chamberlin為關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)System-R設(shè)計(jì)的一種查詢語(yǔ)言,當(dāng)時(shí)稱為SEQUEL語(yǔ)言(StructuredEnglishQueryLanguage),后簡(jiǎn)稱為SQL。1981年IBM推出關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)SQL/DS后,SQL得到了廣泛應(yīng)用。1986年美國(guó)國(guó)家標(biāo)準(zhǔn)協(xié)會(huì)(ANSI)公布了第一個(gè)SQL標(biāo)準(zhǔn)-SQL86。1987年,ISO通過(guò)SQL86標(biāo)準(zhǔn)。9/20/20233周口師范學(xué)院計(jì)算機(jī)科學(xué)系3.1SQL語(yǔ)言基本知識(shí)8/6/20233周口師范學(xué)院1989年,ISO制定SQL89標(biāo)準(zhǔn),SQL89標(biāo)準(zhǔn)在SQL86基礎(chǔ)上增補(bǔ)了完整性描述。1990年,我國(guó)制定等同SQL89的國(guó)家標(biāo)準(zhǔn)。1992年,ISO制定SQL92標(biāo)準(zhǔn),即SQL2。1999年,ANSI制定SQL3標(biāo)準(zhǔn)。SQL成為國(guó)際標(biāo)準(zhǔn)后,對(duì)數(shù)據(jù)庫(kù)以外的領(lǐng)域產(chǎn)生了很大的影響,有不少軟件產(chǎn)品將SQL語(yǔ)言的數(shù)據(jù)查詢功能與圖形功能、軟件工程工具、軟件開(kāi)發(fā)工具、人工智能程序結(jié)合起來(lái)。SQL已成為數(shù)據(jù)庫(kù)領(lǐng)域中一個(gè)主流語(yǔ)言。9/20/20234周口師范學(xué)院計(jì)算機(jī)科學(xué)系1989年,ISO制定SQL89標(biāo)準(zhǔn),SQL89標(biāo)準(zhǔn)在SQL在許多軟件產(chǎn)品中,軟件廠商都對(duì)SQL的基本命令集進(jìn)行了擴(kuò)充,將其擴(kuò)展成嵌入式SQL語(yǔ)言。SQLServer2000中使用Transact-SQL語(yǔ)言與數(shù)據(jù)庫(kù)服務(wù)器打交道。

9/20/20235周口師范學(xué)院計(jì)算機(jī)科學(xué)系在許多軟件產(chǎn)品中,軟件廠商都對(duì)SQL的基本命令集進(jìn)行了擴(kuò)充,3.1.2SQL的特點(diǎn)SQL具有如下特點(diǎn):1.綜合統(tǒng)一。2.高度非過(guò)程化。3.面向集合的操作方式。4.以同一種語(yǔ)法結(jié)構(gòu)提供兩種使用方式5.語(yǔ)言簡(jiǎn)捷、易學(xué)易用。

SQL語(yǔ)言功能極強(qiáng),但由于設(shè)計(jì)巧妙,語(yǔ)言十分簡(jiǎn)捷,完成核心功能只用了9個(gè)動(dòng)詞,如下表示,SQL語(yǔ)言接近英語(yǔ)口語(yǔ),因此容易學(xué)習(xí),容易使用。9/20/20236周口師范學(xué)院計(jì)算機(jī)科學(xué)系3.1.2SQL的特點(diǎn)8/6/20236周口師范學(xué)院計(jì)SQL的功能動(dòng)詞數(shù)據(jù)查詢SELECT數(shù)據(jù)定義CREATE,DROP,ALTER數(shù)據(jù)操縱INSERT,UPDATE,DELETE數(shù)據(jù)控制GRANT,REVOKESQL語(yǔ)言的動(dòng)詞9/20/20237周口師范學(xué)院計(jì)算機(jī)科學(xué)系SQL的功能動(dòng)詞數(shù)據(jù)查詢SELECT數(shù)據(jù)定義CREATE,SQL語(yǔ)言支持關(guān)系數(shù)據(jù)庫(kù)三級(jí)模式結(jié)構(gòu),如下圖示。其中外模式對(duì)應(yīng)于視圖和部分基本表,模式對(duì)應(yīng)于基本表,內(nèi)模式對(duì)應(yīng)于存儲(chǔ)文件?;颈硎潜旧愍?dú)立存在的表,在SQL中一個(gè)關(guān)系就對(duì)應(yīng)一個(gè)表。一個(gè)(或多個(gè))基本表對(duì)應(yīng)一個(gè)存儲(chǔ)文件。一個(gè)表可以帶若干個(gè)索引,索引也存放在存儲(chǔ)文件中。存儲(chǔ)文件的邏輯結(jié)構(gòu)組成了關(guān)系數(shù)據(jù)庫(kù)的內(nèi)模式,存儲(chǔ)文件的物理結(jié)構(gòu)是任意的,對(duì)用戶是透明的。視圖是從一個(gè)或幾個(gè)基本表導(dǎo)出的表。它本身不獨(dú)立存儲(chǔ)在數(shù)據(jù)庫(kù)中,是一個(gè)虛表。即數(shù)據(jù)庫(kù)中只存放視圖的定義而不存放視圖對(duì)應(yīng)的數(shù)據(jù)。9/20/20238周口師范學(xué)院計(jì)算機(jī)科學(xué)系SQL語(yǔ)言支持關(guān)系數(shù)據(jù)庫(kù)三級(jí)模式結(jié)構(gòu),如下圖示。其中外模式對(duì)外模式內(nèi)模式模式9/20/20239周口師范學(xué)院計(jì)算機(jī)科學(xué)系外模式內(nèi)模式模式8/6/20239周口師范學(xué)院計(jì)算機(jī)科學(xué)系3.1.3SQL的分類1、數(shù)據(jù)定義語(yǔ)言(DDL:DataDefinitionLanguage)創(chuàng)建、修改或刪除數(shù)據(jù)庫(kù)中各種對(duì)象,包括表、視圖、索引等。2、查詢語(yǔ)言(QL:QueryLanguage)按照指定的組合、條件表達(dá)式或排序檢索已存在的數(shù)據(jù)庫(kù)中的數(shù)據(jù),但并不改變數(shù)據(jù)庫(kù)中數(shù)據(jù)。3、數(shù)據(jù)操縱語(yǔ)言(DML:DataManipulationLanguage)對(duì)已經(jīng)存在的數(shù)據(jù)庫(kù)進(jìn)行記錄的插入、刪除、修改等操作9/20/202310周口師范學(xué)院計(jì)算機(jī)科學(xué)系3.1.3SQL的分類8/6/202310周口師范學(xué)院4、數(shù)據(jù)控制語(yǔ)言(DCL:DataControlLanguage)用來(lái)授予或收回訪問(wèn)數(shù)據(jù)庫(kù)的某種特權(quán)、控制數(shù)據(jù)操縱事務(wù)的發(fā)生時(shí)間及效果、對(duì)數(shù)據(jù)庫(kù)進(jìn)行監(jiān)視注意:在書(shū)寫(xiě)各種SQL命令時(shí),命令中所涉及的標(biāo)點(diǎn)符號(hào),如括號(hào)、逗號(hào)、分號(hào)、圓點(diǎn)(英文句號(hào))等都應(yīng)是英文半角,如果寫(xiě)成中文全角符號(hào),則會(huì)在執(zhí)行命令時(shí)出錯(cuò)。

9/20/202311周口師范學(xué)院計(jì)算機(jī)科學(xué)系4、數(shù)據(jù)控制語(yǔ)言(DCL:DataControlLang3.2數(shù)據(jù)定義數(shù)據(jù)定義命令用于建立數(shù)據(jù)庫(kù)和建立、修改、刪除基本表。表CREATETABLEDROPTABLEALTERTABLE視圖CREATEVIEWDROPVIEW索引CREATEINDEXDROPINDEX操作對(duì)象操作方式創(chuàng)建刪除修改SQL的數(shù)據(jù)定義語(yǔ)句9/20/202312周口師范學(xué)院計(jì)算機(jī)科學(xué)系3.2數(shù)據(jù)定義表CREATETABLEDROPTA3.2.1定義、刪除與修改基本表一、定義基本表建立數(shù)據(jù)庫(kù)最重要的一步就是定義一些基本表。SQL語(yǔ)言使用CREATETABLE語(yǔ)句定義基本表,其一般格式如下:CREATETABLE<表名>(<列名><數(shù)據(jù)類型>[列級(jí)完整性約束條件][<列名><數(shù)據(jù)類型>[列級(jí)完整性約束條件]]…[表級(jí)完整性約束條件]);其中<表名>是所要定義的基本表的名字,它可以由一個(gè)或多個(gè)屬性(列)組成。9/20/202313周口師范學(xué)院計(jì)算機(jī)科學(xué)系3.2.1定義、刪除與修改基本表8/6/202313周建表的同時(shí)通常還可以定義與該表有關(guān)的完整性約束條件。這些完整性約束條件被存入系統(tǒng)的數(shù)據(jù)字典中,當(dāng)用戶操作表中數(shù)據(jù)時(shí)由DBMS自動(dòng)檢查該操作是否違背這些完整性約束條件。如果完整性約束條件涉及到該表的多個(gè)屬性列,則必須定義在表級(jí)上,否則既可以定義在列級(jí)上也可以定義在表級(jí)上9/20/202314周口師范學(xué)院計(jì)算機(jī)科學(xué)系建表的同時(shí)通常還可以定義與該表有關(guān)的完整性約束條件。這些完整例1建立一個(gè)“學(xué)生”表Student,它由學(xué)號(hào)Sno,姓名Sname,性別Ssex,年齡Sdept、所在系Sdept五個(gè)屬性組成。其中學(xué)號(hào)不能為空,值是唯一的,并且姓名取值也唯一。CREATETABLEStudent(SnoCHAR(5)NOTNULLUNIQUE,SnameCHAR(20)UNIQUE,SsexCHAR(1),SageINT,SdeptCHAR(15));其中:NOTNULL指的是該列的值不能為空值,UNIQUE指的是該列的值唯一。9/20/202315周口師范學(xué)院計(jì)算機(jī)科學(xué)系例1建立一個(gè)“學(xué)生”表Student,它由學(xué)號(hào)Sno,姓名SnoSnameSsexSageSdeptStudent9/20/202316周口師范學(xué)院計(jì)算機(jī)科學(xué)系SnoSnameSsexSageSdeptStudent8/例2:建立如下表所示學(xué)生基本情況表的命令是:createtablejbqk(numberchar(8)notnull,namechar(8)notnull,sexchar(2)notnull,Birthdaydatetime,departmentchar(12));numbernamesexBirthdaydepartmentjbqk9/20/202317周口師范學(xué)院計(jì)算機(jī)科學(xué)系例2:建立如下表所示學(xué)生基本情況表的命令是:numberna數(shù)據(jù)類型說(shuō)明符備注整數(shù)INT字長(zhǎng)32位短整數(shù)SMALLINT字長(zhǎng)16位十進(jìn)制數(shù)DEC(m,n)m為總十進(jìn)制位數(shù),n為小數(shù)位數(shù)浮點(diǎn)數(shù)FLOAT一般指雙精度浮點(diǎn)數(shù)64位定長(zhǎng)字符串CHAR(n)變長(zhǎng)字符串VARCHAR(n)位串BIT(n)二進(jìn)制位串,長(zhǎng)度為n.變長(zhǎng)位串BITARYINT(n)日期DATE日期加時(shí)間DATESTAMP9/20/202318周口師范學(xué)院計(jì)算機(jī)科學(xué)系數(shù)據(jù)類型說(shuō)明符備注整數(shù)INT字長(zhǎng)32位短整數(shù)SMALLINT建立課程表的命令是:createtablecourse(c_numberchar(4)notnull,c_namechar(20)notnull,perioddecimal(3,0),t_numberchar(4)notnull);建立教師表(teacher)的命令是::createtableteacher(t_numberchar(4)notnull,t_namechar(8),titlechar(10));建立選課表(sle_course)的命令是::Createtablesle_course(s_numberchar(8)notnull,c_numberchar(4),scoredecimal(3,0));9/20/202319周口師范學(xué)院計(jì)算機(jī)科學(xué)系建立課程表的命令是:8/6/202319周口師范學(xué)院計(jì)算機(jī)科二、修改基本表隨著應(yīng)用環(huán)境和應(yīng)用需求的變化,有時(shí)需要修改已建立好的基本表,SQL語(yǔ)言使用ALTERTABLE語(yǔ)句定義基本表,其一般格式如下:ALTERTABLE<表名>[ADD<新列名><數(shù)據(jù)類型>[列級(jí)完整性約束條件]][DROP<完整性約束名>][MODIFY<列名><數(shù)據(jù)類型>];9/20/202320周口師范學(xué)院計(jì)算機(jī)科學(xué)系二、修改基本表8/6/202320周口師范學(xué)院計(jì)算機(jī)科學(xué)系例1:向Student表中增加“入學(xué)時(shí)間”列,其數(shù)據(jù)類型為日期型。ALTERTABLEStudentADDScomeDATE;不論基本表中原來(lái)是否已有數(shù)據(jù),新增加的列一律為空值。例2:將Student表中年齡的數(shù)據(jù)類型改為短整型ALTERTABLEStudentMODIFYSageSMALLINT;9/20/202321周口師范學(xué)院計(jì)算機(jī)科學(xué)系例1:向Student表中增加“入學(xué)時(shí)間”列,其數(shù)據(jù)類型為日例3將Student表中學(xué)生姓名必須取唯一值的約束刪除ALTERTABLEStudentDROPUNIQUE(Sname);SQL沒(méi)有提供刪除屬性列的語(yǔ)句,用戶只能間接實(shí)現(xiàn)這一功能,即先把表中要保留的列及其內(nèi)容復(fù)制到一個(gè)新表中,然后刪除原表,再將新表重命名為原表名。

9/20/202322周口師范學(xué)院計(jì)算機(jī)科學(xué)系例3將Student表中學(xué)生姓名必須取唯一值的約束刪除三、

數(shù)據(jù)表的刪除DROPTABLE<表名>;例4:刪除Student表,使用如下命令格式:DROPTABLEStudent;注意:

基本表定義一旦刪除,表中的數(shù)據(jù)、此表上建立的索引和視圖都將自動(dòng)被刪除掉。因此執(zhí)行刪除基本表的操作一定要格外小心。9/20/202323周口師范學(xué)院計(jì)算機(jī)科學(xué)系三、數(shù)據(jù)表的刪除8/6/202323周口師范學(xué)院計(jì)算機(jī)3.2.2索引的建立與刪除索引是對(duì)數(shù)據(jù)庫(kù)表中一個(gè)或多個(gè)列的值進(jìn)行排序的結(jié)構(gòu)。可以利用索引快速訪問(wèn)數(shù)據(jù)庫(kù)表中的特定信息。一、建立索引語(yǔ)句CREATE[UNIQUE][CLUSTER]INDEX<索引名>ON<基本表名>(列名[次序][,列名[次序]]…);說(shuō)明:索引可以建立在一列和多列之上,索引順序可以是ASC(升序)或DESC(降序),缺省值是ASC(升序)。UNIQUE表示每一個(gè)索引值對(duì)應(yīng)唯一的數(shù)據(jù)記錄。9/20/202324周口師范學(xué)院計(jì)算機(jī)科學(xué)系3.2.2索引的建立與刪除8/6/202324周口師范UNIQUE表明此索引的每一個(gè)索引值只對(duì)應(yīng)唯一的數(shù)據(jù)記錄。CLUSTER表示要建立的索引是聚簇索引。所謂聚簇索引是指索引項(xiàng)的順序與表中記錄的物理順序一致的索引組織。例如,執(zhí)行下面的索引語(yǔ)句:CREATECLUSTERINDEXStusnameONStudent(Sname);將會(huì)在Student表的Sname列上建立一個(gè)聚簇索引,而且Student表中的記錄將按照Sname值的升序存放。9/20/202325周口師范學(xué)院計(jì)算機(jī)科學(xué)系UNIQUE表明此索引的每一個(gè)索引值只對(duì)應(yīng)唯一的數(shù)據(jù)記錄。8用戶可以在最常查詢的列上建立聚簇索引以提高查詢效率。顯然在一個(gè)基本表上最多只能建立一個(gè)聚簇索引。建立聚簇索引后,更新索引列數(shù)據(jù)時(shí),往往導(dǎo)致表中記錄的物理順序的變更,代價(jià)較大,因此對(duì)于經(jīng)常更新的列不宜建立聚簇索引。9/20/202326周口師范學(xué)院計(jì)算機(jī)科學(xué)系用戶可以在最常查詢的列上建立聚簇索引以提高查詢效率。顯然在一例1:為學(xué)生數(shù)據(jù)庫(kù)中的Student,Course,SC三個(gè)表建立索引,其中,Student表按學(xué)號(hào)升序建唯一索引,Course表按課程號(hào)升序建唯一索引,SC表按學(xué)號(hào)升序和課程號(hào)降序建唯一索引。CREATEUNIQUEINDEXStusnoONStudent(Sno);CREATEUNIQUEINDEXCoucnoONCourse(Cno);CREATEUNIQUEINDEXSCnoONSC(SnoASC,CnoDESC);9/20/202327周口師范學(xué)院計(jì)算機(jī)科學(xué)系例1:為學(xué)生數(shù)據(jù)庫(kù)中的Student,Course,SC三個(gè)學(xué)號(hào)Sno姓名Sname性別Ssex年齡Sage系別Sdept95001李勇男20CS95002劉晨女19IS95003王敏女18MA95004張立男19ISStudent(a)設(shè)有一個(gè)學(xué)生-課程數(shù)據(jù)庫(kù),包括學(xué)生關(guān)系Student課程關(guān)系Course和選修關(guān)系SC。如下圖示689/20/202328周口師范學(xué)院計(jì)算機(jī)科學(xué)系學(xué)號(hào)姓名性別年齡系別95001李勇男20CS95002劉晨女課程號(hào)Cno課程名Cname先行課Cpno學(xué)分Ccredit1數(shù)據(jù)庫(kù)542數(shù)學(xué)23信息系統(tǒng)144操作系統(tǒng)635數(shù)據(jù)結(jié)構(gòu)746數(shù)據(jù)處理27PASCAL語(yǔ)言64Course(b)9/20/202329周口師范學(xué)院計(jì)算機(jī)科學(xué)系課程號(hào)課程名先行課學(xué)分1數(shù)據(jù)庫(kù)542數(shù)學(xué)23信息系統(tǒng)144操學(xué)號(hào)Sno課程號(hào)Cno成績(jī)Grade9500119295001285950013889500229095002380(c)SC9/20/202330周口師范學(xué)院計(jì)算機(jī)科學(xué)系學(xué)號(hào)課程號(hào)成績(jī)95001192950012859500138二、刪除索引索引一經(jīng)建立,就由系統(tǒng)使用和維護(hù)它,不需用戶干預(yù)。建立索引是為了減少查詢操作時(shí)間,但如果數(shù)據(jù)增、刪、改頻繁,系統(tǒng)會(huì)花費(fèi)許多時(shí)間來(lái)維護(hù)索引,這時(shí),可以刪除一些不必要的索引DROPINDEX<索引名>;注意:該命令不能刪除由CREATETABLE或者ALTERTABLE命令創(chuàng)建的主鍵和唯一性約束索引,也不能刪除系統(tǒng)表中的索引。例2、刪除例1中建立的索引StusnoDROPINDEXStusno;9/20/202331周口師范學(xué)院計(jì)算機(jī)科學(xué)系二、刪除索引8/6/202331周口師范學(xué)院計(jì)算機(jī)科學(xué)系3.3數(shù)據(jù)查詢語(yǔ)言數(shù)據(jù)庫(kù)查詢是數(shù)據(jù)庫(kù)的核心操作。SQL語(yǔ)言提供了SELECT語(yǔ)句進(jìn)行數(shù)據(jù)庫(kù)的查詢,該語(yǔ)句具有靈活的使用方式和豐富的功能。9/20/202332周口師范學(xué)院計(jì)算機(jī)科學(xué)系3.3數(shù)據(jù)查詢語(yǔ)言數(shù)據(jù)庫(kù)查詢是數(shù)據(jù)庫(kù)的核心操作。SQLSQL語(yǔ)言的查詢語(yǔ)句一般格式是:SELECT[ALL|DISTINCT]<目標(biāo)列表達(dá)式>[,<目標(biāo)列表達(dá)式>]…FROM<基本表名或視圖名>[,<基本表名或視圖名>]…[WHERE<條件表達(dá)式>][GROUPBY<列名1>[HAVING<條件表達(dá)式>]][ORDERBY<列名2>[ASC|DESC]];下面對(duì)該命令進(jìn)行一些說(shuō)明:9/20/202333周口師范學(xué)院計(jì)算機(jī)科學(xué)系SQL語(yǔ)言的查詢語(yǔ)句一般格式是:8/6/202333周口師范1.命令含義從FROM子句指定的基本表或視圖中,根據(jù)WHERE子句的條件表達(dá)式查找出滿足該條件的元組(記錄),再按照SELECT子句指定的目標(biāo)列表達(dá)式,選出元組中的屬性值形成結(jié)果表。如果有GROUPBY子句,則將結(jié)果按“列名1”的值進(jìn)行分組,該屬性列值相等的元組為一個(gè)組;如果GROUPBY子句帶有短語(yǔ)HAVING,則只有滿足短語(yǔ)指定條件的分組才會(huì)輸出。如果有ORDERBY子句,則結(jié)果表要按照<列名2>的值進(jìn)行升序和降序排列。9/20/202334周口師范學(xué)院計(jì)算機(jī)科學(xué)系1.命令含義8/6/202334周口師范學(xué)院計(jì)算機(jī)科學(xué)系SELECT[ALL|DISTINCT]<目標(biāo)列表達(dá)式>實(shí)現(xiàn)的是對(duì)表的投影操作,WHERE<條件表達(dá)式>中實(shí)現(xiàn)的是選擇操作。FROM<基本表名或視圖名>[,<基本表名或視圖名>]…實(shí)現(xiàn)的是對(duì)指定表的廣義笛卡爾積

9/20/202335周口師范學(xué)院計(jì)算機(jī)科學(xué)系SELECT[ALL|DISTINCT]<目標(biāo)列表達(dá)式>實(shí)2.目標(biāo)列表達(dá)式①列表達(dá)式可以是“列名1,列名2…”的形式;如果FROM子句指定了多個(gè)表,則列名應(yīng)是“表名.列名”的形式。②列表達(dá)式可以使用SQL提供的庫(kù)函數(shù)形成表達(dá)式,常用的函數(shù)如下:COUNT(*):統(tǒng)計(jì)記錄條數(shù)。COUNT(列名):統(tǒng)計(jì)一列值得個(gè)數(shù)。SUM(列名):計(jì)算某一數(shù)值型列的值的總和。AVG(列名):計(jì)算某一數(shù)值型列的值的平均值MAX(列名):計(jì)算某一數(shù)值型列的值的最大值③DISTINCT參數(shù):表示在結(jié)果集中,查詢出的內(nèi)容相同的記錄只留下一條。

MIN(列名):計(jì)算某一數(shù)值型列的值的最小值9/20/202336周口師范學(xué)院計(jì)算機(jī)科學(xué)系2.目標(biāo)列表達(dá)式8/6/202336周口師范學(xué)院計(jì)算機(jī)科學(xué)系3.3.1單表查詢單表查詢是指僅涉及一個(gè)表的查詢。一、選擇表中的若干列選擇表中的全部列和部分列,就是投影運(yùn)算。1、查詢指定列在很多情況下,用戶只對(duì)表中的一部分屬性列感興趣,這時(shí)可以通過(guò)在SELECT子句的<目標(biāo)列表達(dá)式>中指定要查詢的屬性。9/20/202337周口師范學(xué)院計(jì)算機(jī)科學(xué)系3.3.1單表查詢8/6/202337周口師范學(xué)院計(jì)算機(jī)例1:查詢?nèi)w學(xué)生的學(xué)號(hào)和姓名。SELECTSno,SnameFROMStudent;例2:查詢?nèi)w學(xué)生的姓名、學(xué)號(hào)、所在系。SELECTSname,Sno,SdeptFROMStudent;9/20/202338周口師范學(xué)院計(jì)算機(jī)科學(xué)系例1:查詢?nèi)w學(xué)生的學(xué)號(hào)和姓名。8/6/202338周口師范2、查詢?nèi)苛袑⒈碇兴袑傩粤卸歼x出來(lái),可以有兩種方法。一種方法是在SELECT關(guān)鍵字后列出所有的列名。如果列的顯示順序與其在基表中的順序相同,也可以簡(jiǎn)單地將<目標(biāo)列表達(dá)式>指定為*。例3:查詢?nèi)w學(xué)生的詳細(xì)記錄。SELECT*SELECTSno,Sname,…FROMStudentFROMStudent9/20/202339周口師范學(xué)院計(jì)算機(jī)科學(xué)系2、查詢?nèi)苛?/6/202339周口師范學(xué)院計(jì)算機(jī)科學(xué)系3、查詢經(jīng)過(guò)計(jì)算的值SELECT子句的<目標(biāo)列表達(dá)式>不僅可以是表中的屬性列,也可以是表達(dá)式。例4:查全體學(xué)生的姓名及其出生年份SELECTSname,2004-SageFROMStudent;輸出的結(jié)果為:<目標(biāo)列表達(dá)式>不僅可以是算術(shù)表達(dá)式,還可以是字符串常量、函數(shù)等。9/20/202340周口師范學(xué)院計(jì)算機(jī)科學(xué)系3、查詢經(jīng)過(guò)計(jì)算的值8/6/202340周口師范學(xué)院計(jì)算機(jī)科例5:查詢?nèi)w學(xué)生的姓名,出生年份和所在系,要求用小寫(xiě)字母表示所在系名。SELECTSname,‘YearofBirth’,2004-Sage,ISLOWER(Sdept)FROMStudent;輸出結(jié)果為:用戶可以通過(guò)指定別名來(lái)改變查詢結(jié)果的列標(biāo)題。這對(duì)于含算術(shù)表達(dá)式、常量、函數(shù)名的目標(biāo)列表達(dá)式尤為有用。例如,對(duì)上例,可定義如下:9/20/202341周口師范學(xué)院計(jì)算機(jī)科學(xué)系例5:查詢?nèi)w學(xué)生的姓名,出生年份和所在系,要求用小寫(xiě)字母表SELECTSnameNAME,‘YearofBirth;’BIRTH,2004-SageBIRTHDAY,ISLOWER(Sdept)DEPARTMENTFROMStudent;結(jié)果為:NAMEBIRTHBIRTHDAYDEPARTMENT李勇YearofBirth:1976cs劉晨YearofBirth:1977is王敏YearofBirth:1978ma(c)9/20/202342周口師范學(xué)院計(jì)算機(jī)科學(xué)系SELECTSnameNAME,‘YearofBirSnameYearofBirth:2004-SageISLOWER(Sdept)李勇YearofBirth:1976cs劉晨YearofBirth:1977is王敏YearofBirth:1978maSname2004-Sage李勇1976劉晨1977王敏1978(a)(b)9/20/202343周口師范學(xué)院計(jì)算機(jī)科學(xué)系SnameYearofBirth:2004-SageIS二、選擇表中的若干元組1、消除取值重復(fù)的行兩個(gè)本來(lái)并不完全相同的元組,投影到指定的某些列上后,可能變成相同的行。如果想去掉表中的重復(fù)行,必須在SELECT子句中指定DISTINCET短語(yǔ)。如果沒(méi)有指定DISTINCET短語(yǔ),則缺省為ALL,即保留結(jié)果表中取值重復(fù)的行。例6:查詢選修了課程的學(xué)生學(xué)號(hào)。SELECTSnoFROMSC;9/20/202344周口師范學(xué)院計(jì)算機(jī)科學(xué)系二、選擇表中的若干元組8/6/202344周口師范學(xué)院計(jì)算機(jī)Sno9500195001950019500295002(a)該查詢結(jié)果里包含了許多重復(fù)行如果想去掉表中的重復(fù)行,則:SELECTDISTINCTSnoFROMSC;執(zhí)行結(jié)果為:Sno9500195002(b)9/20/202345周口師范學(xué)院計(jì)算機(jī)科學(xué)系Sno9500195001950019500295002(a2、查詢滿足條件的元組查詢滿足條件的元組可以通過(guò)WHERE子句來(lái)實(shí)現(xiàn),WHERE子句常用的查詢條件如下表示:9/20/202346周口師范學(xué)院計(jì)算機(jī)科學(xué)系2、查詢滿足條件的元組8/6/202346周口師范學(xué)院計(jì)算機(jī)查詢條件運(yùn)

符說(shuō)

明比

較=,>,<,>=,<=,<>,!=,(!<,!>)NOT+字符串比較從左向右進(jìn)行確定范圍BETWEENAND,NOTBETWEENANDBETWEEN后是下限(低),AND后是上限確定集合IN,NOTIN檢查一個(gè)某屬性值是否屬于指定集合的元組字符匹配LIKE,NOTLIKE用于構(gòu)造條件表達(dá)式中的字符匹配空

值ISNULL,ISNOTNULL當(dāng)屬性值內(nèi)容為空時(shí),要用此運(yùn)算符邏輯運(yùn)算AND,OR,NOT用于構(gòu)造復(fù)合表達(dá)式常用的查詢條件9/20/202347周口師范學(xué)院計(jì)算機(jī)科學(xué)系查詢條件運(yùn)算符說(shuō)明比例7:查詢考試成績(jī)不及格學(xué)生的學(xué)號(hào)。SELECTDISTINCTSnoFROMSCWHEREGrade<60;例8:查詢年齡在20~23之間的學(xué)生的姓名,系別和年齡。SELECTSname,Sdept,SageFROMStudentWHERESageBETWEEN20AND23例9:查詢年齡不在20~23之間的學(xué)生的姓名,系別和年齡。SELECTSname,Sdept,SageFROMStudentWHERESageNOTBETWEEN20AND239/20/202348周口師范學(xué)院計(jì)算機(jī)科學(xué)系例7:查詢考試成績(jī)不及格學(xué)生的學(xué)號(hào)。8/6/202348周口例10:查詢計(jì)算機(jī)系、信息系學(xué)生的姓名、系別和年齡。SELECTSname,Sdept,SageFROMStudentWHERESdeptIN(‘CS’,’IS’);例11:查詢不是計(jì)算機(jī)系、也不是信息系的學(xué)生的姓名、系別和年齡。SELECTSname,Sdept,SageFROMStudentWHERESdeptNOT

IN(‘CS’,’IS’);9/20/202349周口師范學(xué)院計(jì)算機(jī)科學(xué)系例10:查詢計(jì)算機(jī)系、信息系學(xué)生的姓名、系別和年齡。8/6/謂詞LIKE可以用來(lái)進(jìn)行字符串的匹配。其一般語(yǔ)法格式如下:[NOT]LIKE‘<匹配串>’[ESCAPE‘<換碼字符>’]其含義是查找指定的屬性列值與<匹配串>相匹配的元組。<匹配串>可以是一個(gè)完整的字符串,也可以含有通配符%和—。其中:%(百分號(hào))代表任意長(zhǎng)度(可以為0)的字符串,如:a%b表示以a開(kāi)頭,以b結(jié)尾的任意長(zhǎng)度的字符串。_(下劃線)代表任意單個(gè)字符。a_b表示以a開(kāi)頭,以b結(jié)尾長(zhǎng)度為3的任意字符串。9/20/202350周口師范學(xué)院計(jì)算機(jī)科學(xué)系謂詞LIKE可以用來(lái)進(jìn)行字符串的匹配。其一般語(yǔ)法格式如下:8例12:查詢所有姓“王”的學(xué)生信息。SELECT*FROMStudentWHERESnamelike‘王%’;例13:查詢名字中第二個(gè)字為“陽(yáng)”的學(xué)生姓名和學(xué)號(hào)。SELECTSname,SnoFROMStudentWHERESnamelike‘__陽(yáng)%’;如果用戶要查詢的字符串本身就含有%或_就要使用ESCAPE‘<換碼字符>’對(duì)通配符進(jìn)行轉(zhuǎn)義9/20/202351周口師范學(xué)院計(jì)算機(jī)科學(xué)系例12:查詢所有姓“王”的學(xué)生信息。8/6/202351周口例14:查詢DB_Design課程的課程號(hào)和學(xué)分SELECTCno,CcreditFROMCourseWHERECnamelike‘DB\_Design’ESCAPE‘\’;

其中:ESCAPE‘\’短語(yǔ)表示\為換碼字符,這樣匹配串中緊跟在\后面的字符“_”不再具有通配符的含義,轉(zhuǎn)義為普通的“_”字符。例15:查詢以“DB_”開(kāi)頭,且倒數(shù)第三個(gè)字符為i的課程的詳細(xì)情況SELECT*FROMCourseWHERECnamelike‘DB\_%i__’ESCAPE‘\’;9/20/202352周口師范學(xué)院計(jì)算機(jī)科學(xué)系例14:查詢DB_Design課程的課程號(hào)和學(xué)分8/6/20例16某些學(xué)生選修課程后沒(méi)有參加考試,所以有選課記錄,但沒(méi)有考試成績(jī)。查詢?nèi)鄙俪煽?jī)的學(xué)生的學(xué)號(hào)和相應(yīng)的課程號(hào)。SELECTSno,CnoFROMSCWHEREGradeISNULL例17查詢所有有成績(jī)的學(xué)生的學(xué)號(hào)和相應(yīng)的課程號(hào)。SELECTSno,CnoFROMSCWHEREGradeISNOTNULL9/20/202353周口師范學(xué)院計(jì)算機(jī)科學(xué)系例16某些學(xué)生選修課程后沒(méi)有參加考試,所以有選課記錄,但沒(méi)多重條件查詢邏輯運(yùn)算符AND和OR可用來(lái)聯(lián)結(jié)多個(gè)查詢條件,AND優(yōu)先級(jí)高于OR,但用戶可用括號(hào)改變優(yōu)先級(jí)。例18查詢計(jì)算機(jī)系年齡在20歲以下的學(xué)生姓名SELECTSnameFROMStudentWHERESdept=‘CS’ANDSage<20;例19:查詢計(jì)算機(jī)系、信息系學(xué)生的姓名、系別和年齡。SELECTSname,Sdept,SageFROMStudentWHERESdept=‘CS’ORSdept=’IS’;9/20/202354周口師范學(xué)院計(jì)算機(jī)科學(xué)系多重條件查詢8/6/202354周口師范學(xué)院計(jì)算機(jī)科學(xué)系三、對(duì)查詢結(jié)果排序用戶可以用ORDERBY子句對(duì)查詢結(jié)果按照一個(gè)或多個(gè)屬性列的升序(ASC)或降序(DESC)排列,缺省值為升序。例19查詢選修了3號(hào)課程的學(xué)號(hào)及其成績(jī),查詢結(jié)果按分?jǐn)?shù)的降序排列。SELECTSno,GradeFROMSCWHERECno=‘3’ORDERBYGradeDESC;

對(duì)于空值,若按升序,含空值的元組將最后顯示,若按降序排,空值的元組將最先顯示。9/20/202355周口師范學(xué)院計(jì)算機(jī)科學(xué)系三、對(duì)查詢結(jié)果排序8/6/202355周口師范學(xué)院計(jì)算機(jī)科學(xué)例19查詢?nèi)w學(xué)生情況,查詢結(jié)果按所在系的系號(hào)升序排列,同一系中的學(xué)生按年齡降序排列。SELECT*FROMStudentORDERBYSdept,SageDESC;9/20/202356周口師范學(xué)院計(jì)算機(jī)科學(xué)系例19查詢?nèi)w學(xué)生情況,查詢結(jié)果按所在系的系號(hào)升序排列,同四、查詢中集函數(shù)的使用說(shuō)明:DISTINCT:取消列中的重復(fù)值A(chǔ)LL:為默認(rèn)狀態(tài),表示不取消重復(fù)值。

函數(shù)名稱函數(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]<列名>)求一列值的平均值MAX([DISTINCT|ALL]<列名>)求一列值的最大值MIN([DISTINCT|ALL]<列名>)求一列值的最小值9/20/202357周口師范學(xué)院計(jì)算機(jī)科學(xué)系四、查詢中集函數(shù)的使用函數(shù)名稱函數(shù)功能COUNT([DIST例20:查詢學(xué)生總?cè)藬?shù)。SELECTCOUNT(*)FROMStudent;例21:計(jì)算95001學(xué)生的平均成績(jī)。SELECTAVG(Grade)FROMSCWHERESno=’95001’;9/20/202358周口師范學(xué)院計(jì)算機(jī)科學(xué)系例20:查詢學(xué)生總?cè)藬?shù)。8/6/202358周口師范學(xué)院計(jì)算5.查詢結(jié)果的分組與排序GROUPBY子句將查詢結(jié)果表按某一列或多列值分組,值相等的為一組。分組的目的是為了細(xì)化集函數(shù)的作用對(duì)象,如果未對(duì)查詢結(jié)果分組,集函數(shù)將作用于整個(gè)查詢結(jié)果。分組后集函數(shù)將作用在每一個(gè)組上,即每一組都有一個(gè)函數(shù)值。

9/20/202359周口師范學(xué)院計(jì)算機(jī)科學(xué)系5.查詢結(jié)果的分組與排序8/6/202359周口師范學(xué)院例22:查詢選修了2門(mén)以上課程的學(xué)生學(xué)號(hào),并且查詢結(jié)果按照升序排列。SELECTSnoFROMSCGROUPBYSnoHAVINGCOUNT(*)>2ORDERBYSnoASC;WHERE與HAVING的區(qū)別在于作用的對(duì)象不同。WHERE子句作用于基本表或視圖,從中選擇滿足條件的記錄;HAVING短語(yǔ)作用于分組,從中選出滿足條件的組。

9/20/202360周口師范學(xué)院計(jì)算機(jī)科學(xué)系例22:查詢選修了2門(mén)以上課程的學(xué)生學(xué)號(hào),并且查詢結(jié)果按照升3.3.2連接查詢前面的查詢都是針對(duì)一個(gè)表進(jìn)行的。若一個(gè)查詢同時(shí)涉及兩個(gè)以上的表,則稱之為連接查詢,連接查詢是關(guān)系數(shù)據(jù)庫(kù)中最主要的查詢,包括等值連接、自然連接、非等值連接查詢、自身連接查詢、外連接查詢和復(fù)合條件連接查詢。9/20/202361周口師范學(xué)院計(jì)算機(jī)科學(xué)系3.3.2連接查詢8/6/202361周口師范學(xué)院計(jì)算機(jī)從概念上講,DBMS執(zhí)行連接操作的過(guò)程是:首先在表1中找到第一個(gè)元組,然后從頭開(kāi)始掃描表2,逐一查找滿足連接條件的元組,找到后就將表1中的第一個(gè)元組與該元組拼接起來(lái),形成結(jié)果表中一個(gè)元組。表2全部查找完后,再找表1中第2個(gè)元組,然后再?gòu)念^開(kāi)始掃描表2,逐一查找滿足連接條件的元組,找到后就將表1中的第2個(gè)元組與該元組拼接起來(lái),形成結(jié)果表中一個(gè)元組。重復(fù)上述操作,直到表1中的全部元組都處理完畢為止。9/20/202362周口師范學(xué)院計(jì)算機(jī)科學(xué)系從概念上講,DBMS執(zhí)行連接操作的過(guò)程是:首先在表1中找到第一、等值與非等值連接。連接查詢中用來(lái)連接兩個(gè)表的條件稱為連接條件或連接謂詞,其一般格式為:

[<表名1>].<列名1><比較運(yùn)算符>[<表名2>].<列名2>其中<比較運(yùn)算符>主要有:=,>,<,>=,<=,!=。當(dāng)連接運(yùn)算符為=時(shí),稱為等值連接,使用其它運(yùn)算符稱為非等值連接。連接謂詞中的<列名>稱為連接字段,連接條件中的各個(gè)連接字段類型必須是可比的,但不必是相同的。Eg.9/20/202363周口師范學(xué)院計(jì)算機(jī)科學(xué)系一、等值與非等值連接。8/6/202363周口師范學(xué)院計(jì)算機(jī)在本例中,SELECT子句與WHERE子句中的屬性名前都加上了表名前綴,這是為了避免混淆。如果屬性名在參加連接的各表中是唯一的,則可以省略表名前綴。連接運(yùn)算中有兩種特殊情況,一種為自然連接,另一種為廣義笛卡爾積(連接)。廣義笛卡爾積是不帶連接謂詞的連接。兩個(gè)表的廣義笛卡爾積即是兩表中元組的交叉乘積,其連接的結(jié)果會(huì)產(chǎn)生一些沒(méi)有意義的元組,所以這種運(yùn)算實(shí)際很少使用。若在等值連接中把目標(biāo)列中重復(fù)的屬性列去掉則為自然連接。9/20/202364周口師范學(xué)院計(jì)算機(jī)科學(xué)系在本例中,SELECT子句與WHERE子句中的屬性名前都加上二、自身連接連接操作不僅可以在兩個(gè)表之間進(jìn)行,也可以是一個(gè)表與其自己進(jìn)行連接,稱為表的自身連接。在通常的連接操作中,只有滿足連接條件的元組才能作為結(jié)果輸出。9/20/202365周口師范學(xué)院計(jì)算機(jī)科學(xué)系二、自身連接8/6/202365周口師范學(xué)院計(jì)算機(jī)科學(xué)系三、外連接外連接的表示方法為,在連接謂詞的某一邊加符號(hào)*(有的數(shù)據(jù)庫(kù)系統(tǒng)中用+)。外連接就好象為符號(hào)*所在邊的表增加一個(gè)“萬(wàn)能的”行,這個(gè)行全部由空值組成。它可以和另一邊的表中所有不滿足條件的元組進(jìn)行連接(從而使得另一個(gè)表在連接的過(guò)程中不會(huì)有元組丟失)。如果外連接符出現(xiàn)在連接條件的右邊,稱其為右外連接,如果外連接符出現(xiàn)在連接條件的左邊,則稱其為左外連接。9/20/202366周口師范學(xué)院計(jì)算機(jī)科學(xué)系三、外連接8/6/202366周口師范學(xué)院計(jì)算機(jī)科學(xué)系四、復(fù)合條件的連接上面各個(gè)連接查詢中,WHERE子句中只有一個(gè)條件,即連接謂詞。WHERE子句中可以有多個(gè)連接條件,稱為復(fù)合條件連接。連接操作除了可以是兩表連接,一個(gè)表與其自身連接外,還可以是兩個(gè)以上的表進(jìn)行連接,后者稱為多表連接。9/20/202367周口師范學(xué)院計(jì)算機(jī)科學(xué)系四、復(fù)合條件的連接8/6/202367周口師范學(xué)院計(jì)算機(jī)科學(xué)例23查詢每個(gè)學(xué)生及其所選課程的情況SelectStudent.*,SC.*FromStudent,SC

WhereStudent.Sno=SC.Sno;例24查詢每個(gè)學(xué)生及其所選課程的情況(用自然連接)SelectStudent.Sno,Sname,Ssex,Sage,Sdept,Cno,GradeFromStudent,SC

WhereStudent.Sno=SC.Sno;例25查詢所有比李勇年齡大的學(xué)生姓名、年齡SelectX.Sname,X.SageFromStudentX,StudentYWhereX.Sage>Y.SageAndY.Sname=‘李勇’結(jié)果結(jié)果9/20/202368周口師范學(xué)院計(jì)算機(jī)科學(xué)系例23查詢每個(gè)學(xué)生及其所選課程的情況結(jié)果結(jié)果8/6/20Student.SnoSnameSsexSageSdept95001李勇男20CS95001李勇男20CS95001李勇男20CS95002劉晨女19IS95002劉晨女19ISSC.SnoCnoGrade9500119295001285950013889500229095002380該查詢的執(zhí)行結(jié)果:9/20/202369周口師范學(xué)院計(jì)算機(jī)科學(xué)系Student.SnoSnameSsexSageSdept9Student.SnoSnameSsexSageSdept95001李勇男20CS95001李勇男20CS95001李勇男20CS95002劉晨女19IS95002劉晨女19ISCnoGrade192285388290380該查詢的執(zhí)行結(jié)果:9/20/202370周口師范學(xué)院計(jì)算機(jī)科學(xué)系Student.SnoSnameSsexSageSdept9例26查詢每一門(mén)課的間接先修課(即先修課的先修課)。SelectFIRST.Cno,SECOND.CpnoFromCourseFIRST,CourseSECOND

WhereFIRST.Cpno=SECOND.Cno;例27查詢所有學(xué)生的學(xué)號(hào)、姓名、選修的課程和成績(jī)SelectStudent.Sno,Sname,Cname,GradeFromStudent,SC,CourseWhereStudent.Sno=SC.Sno(+)AndSC.Cno=Course.Cno(+)9/20/202371周口師范學(xué)院計(jì)算機(jī)科學(xué)系例26查詢每一門(mén)課的間接先修課(即先修課的先修課)。8/6例28查詢選修2號(hào)課程且成績(jī)?cè)?0分以上的所有學(xué)生。SELECTStudent.Sno,SnameFROMStudent,SCWHEREStudent.Sno=SC.SnoANDSC.Cno=‘2’ANDSC.Grade>90;9/20/202372周口師范學(xué)院計(jì)算機(jī)科學(xué)系例28查詢選修2號(hào)課程且成績(jī)?cè)?0分以上的所有學(xué)生。8/6例29查詢每個(gè)學(xué)生的學(xué)號(hào)、姓名、選修的課程名及成績(jī)。SELECTStudent.Sno,Sname,Cname,GradeFROMStudent,SC,CourseWHEREStudent.Sno=SC.SnoANDSC.Cno=Course.Cno;9/20/202373周口師范學(xué)院計(jì)算機(jī)科學(xué)系例29查詢每個(gè)學(xué)生的學(xué)號(hào)、姓名、選修的課程名及成績(jī)。8/6Student.SnoSnameSsexSageSdept95001李勇男20CS95001李勇男20CS95001李勇男20CS95002劉晨女19IS95002劉晨女19ISSC.SnoCnoGrade9500119295001285950013889500229095002380該查詢的執(zhí)行結(jié)果:95003王敏女18MA95004張立男19IS9/20/202374周口師范學(xué)院計(jì)算機(jī)科學(xué)系Student.SnoSnameSsexSageSdept99/20/202375周口師范學(xué)院計(jì)算機(jī)科學(xué)系8/6/202375周口師范學(xué)院計(jì)算機(jī)科學(xué)系3.3.3嵌套查詢?cè)赟QL語(yǔ)言中,一個(gè)SELECT-FROM-WHERE稱為一個(gè)查詢塊,將一個(gè)查詢塊嵌套在另一個(gè)查詢塊的WHERE子句或HAVING短語(yǔ)的條件中的查詢稱為嵌套查詢。上層的查詢塊稱為外層查詢或父查詢,下層查詢稱為內(nèi)層查詢或子查詢。外層查詢利用子查詢來(lái)獲取檢索條件的條件值,并根據(jù)這個(gè)條件值確定外層查詢的結(jié)果集合。SQL語(yǔ)言允許多層嵌套查詢,即一個(gè)子查詢中還可以嵌套其他子查詢,通過(guò)子查詢,可以利用一系列簡(jiǎn)單查詢來(lái)構(gòu)造一個(gè)復(fù)雜查詢。子查詢中的SELECT語(yǔ)句中不能使用ORDERBY子句,ORDERBY子句只能對(duì)最終查詢結(jié)果排序。9/20/202376周口師范學(xué)院計(jì)算機(jī)科學(xué)系3.3.3嵌套查詢?cè)赟QL語(yǔ)言中,一個(gè)SELECT-FROM嵌套查詢一般的求解方法是由里向外處理,即每個(gè)子查詢?cè)谏弦患?jí)查詢處理之前求解,子查詢的結(jié)果用于建立其父查詢的查找條件。嵌套查詢使我們可以用多個(gè)簡(jiǎn)單查詢構(gòu)成復(fù)雜的查詢,從而增強(qiáng)SQL的查詢能力。以層層嵌套的方式來(lái)構(gòu)造程序正是SQL(StructuredQueryLanguage)中“結(jié)構(gòu)化”的含義所在。9/20/202377周口師范學(xué)院計(jì)算機(jī)科學(xué)系嵌套查詢一般的求解方法是由里向外處理,即每個(gè)子查詢?cè)谏弦患?jí)查一、帶有IN謂詞的子查詢?cè)谇短撞樵冎?,子查詢的結(jié)果往往是一個(gè)集合,所以謂詞IN是嵌套查詢中最經(jīng)常使用的謂詞。例30查詢與劉晨在同一個(gè)系學(xué)習(xí)的學(xué)生。SelectSno,Sname,SdeptFromStudentWhereSdeptIN(SelectSdeptFromStudentWhereSname=‘劉晨’);9/20/202378周口師范學(xué)院計(jì)算機(jī)科學(xué)系一、帶有IN謂詞的子查詢8/6/202378周口師范學(xué)院計(jì)算本例中的查詢也可以用自身連接來(lái)完成:SELECTS1.Sno,S1.Sname,S1.SdeptFROMStudentS1,StudentS2WHERES1.Sdept=S2.SdeptANDS2.Sname=“劉晨”;本例中父查詢和子查詢均引用了Student表,可以像自身連接那樣用別名將父查詢中的Student表與子查詢中的Student表區(qū)分開(kāi):9/20/202379周口師范學(xué)院計(jì)算機(jī)科學(xué)系本例中的查詢也可以用自身連接來(lái)完成:8/6/202379周口SelectSno,Sname,SdeptFromStudentS1WhereS1.SdeptIN(SelectSdeptFromStudentS2WhereS2.Sname=‘劉晨’);9/20/202380周口師范學(xué)院計(jì)算機(jī)科學(xué)系SelectSno,Sname,Sdept8/6/2例31查詢選修了課程名為‘信息系統(tǒng)’的學(xué)生的學(xué)號(hào)和姓名。SELECTSno,SnameFROMStudentWHERESnoIN(SELECTSnoFROMSCWHERECnoIN(SELECTCnoFROMCourseWHERECname=‘信息系統(tǒng)’));①首先在Course

關(guān)系中找出“信息系統(tǒng)”的課程號(hào),結(jié)果為3號(hào)②然后在SC關(guān)系中找出選修了3號(hào)課程的學(xué)生學(xué)號(hào)③最后在Student關(guān)系中取出Sno和Sname9/20/202381周口師范學(xué)院計(jì)算機(jī)科學(xué)系例31查詢選修了課程名為‘信息系統(tǒng)’的學(xué)生的學(xué)號(hào)和姓名。①同樣本查詢也可以用連接查詢來(lái)實(shí)現(xiàn):SELECTSno,SnameFROMStudent,SC,CourseWHEREStudent.Sno=SC.SnoANDSC.Cno=Course.CnoANDCourse.Cname=“信息系統(tǒng)”;9/20/202382周口師范學(xué)院計(jì)算機(jī)科學(xué)系同樣本查詢也可以用連接查詢來(lái)實(shí)現(xiàn):8/6/202382周口師從例30和例31可以看到,查詢涉及多個(gè)關(guān)系時(shí),用嵌套查詢逐步求解,層次清楚,易于構(gòu)造,具有結(jié)構(gòu)化程序設(shè)計(jì)的優(yōu)點(diǎn)。有些嵌套查詢可以用連接運(yùn)算替代,有些是不能替代的。到底采用哪種方法用戶可以根據(jù)自己的習(xí)慣確定。例30和例31中的各個(gè)子查詢都只執(zhí)行一次,其結(jié)果用于父查詢。子查詢的查詢條件不依賴于父查詢,這類子查詢稱為不相關(guān)子查詢。這種子查詢是最簡(jiǎn)單的一類子查詢。9/20/202383周口師范學(xué)院計(jì)算機(jī)科學(xué)系從例30和例31可以看到,查詢涉及多個(gè)關(guān)系時(shí),用嵌套查詢逐步二、帶有比較運(yùn)算符的子查詢帶有比較運(yùn)算符的子查詢是指父查詢與子查詢之間用比較運(yùn)算符進(jìn)行連接。當(dāng)用戶能確切知道內(nèi)層查詢返回的是單值時(shí),可以用>,<,=,>=,<=,!=或<>等比較運(yùn)算符。例如在例30中,由于一個(gè)學(xué)生只可能在一個(gè)系學(xué)習(xí),也就是說(shuō)內(nèi)查詢的結(jié)果是一個(gè)值,因此可以用=代替IN,其SQL語(yǔ)句如下:9/20/202384周口師范學(xué)院計(jì)算機(jī)科學(xué)系二、帶有比較運(yùn)算符的子查詢帶有比較運(yùn)算符的子查詢是指父查詢與SELECTSno,Sname,SdeptFROMStudentWHERESdept=(SELECTSdeptFROMStudentWHERESname=‘劉晨’);需要注意的是,子查詢一定要跟在比較符之后。9/20/202385周口師范學(xué)院計(jì)算機(jī)科學(xué)系SELECTSno,Sname,Sdept8/6/2三、帶有ANY或ALL謂詞的子查詢子查詢返回單值時(shí)可以用比較運(yùn)算符,而使用ANY或ALL謂詞時(shí)則必須同時(shí)使用比較運(yùn)算符。其語(yǔ)義為:>ANY大于子查詢結(jié)果中的某個(gè)值>ALL大于子查詢結(jié)果中的所有值<ANY小于子查詢結(jié)果中的某個(gè)值<ALL小于子查詢結(jié)果中的所有值>=ANY大于等于子查詢結(jié)果中的某個(gè)值>=ALL大于等于子查詢結(jié)果中的所有值<=ANY小于等于子查詢結(jié)果中的某個(gè)值9/20/202386周口師范學(xué)院計(jì)算機(jī)科學(xué)系三、帶有ANY或ALL謂詞的子查詢8/6/202386周口師<=ALL小于等于子查詢結(jié)果中的所有值=ANY等于子查詢結(jié)果中的某個(gè)值=ALL等于子查詢結(jié)果中的所有值(通常沒(méi)有實(shí)際意義)!=(或<>)ANY不等于子查詢結(jié)果中的某個(gè)值!=(或<>)ALL不等于子查詢結(jié)果中的任何一個(gè)值9/20/202387周口師范學(xué)院計(jì)算機(jī)科學(xué)系<=ALL小于等于子查詢結(jié)果中的所有值8/6/例32查詢其他系中比信息系中某一學(xué)生年齡小的學(xué)生姓名和年齡。SelectSname,SageFromStudentWhereSdept<>‘IS’ANDSage<Any(SelectSageFromStudentWhereSdept=‘IS’);DBMS執(zhí)行此查詢時(shí),首先處理子查詢找出IS系中所有學(xué)生的年齡,構(gòu)成一個(gè)集合(19,18)。然后處理父查詢,找所有不是IS系且年齡小于19或18的學(xué)生。9/20/202388周口師范學(xué)院計(jì)算機(jī)科學(xué)系例32查詢其他系中比信息系中某一學(xué)生年齡小的學(xué)生姓名和年本查詢也可以用集函數(shù)來(lái)實(shí)現(xiàn)。首先用子查詢找出IS系中最大年齡(19),然后在父查詢中查所有非IS系且年齡小于19歲的學(xué)生姓名及年齡。SQL語(yǔ)句如下:

SelectSname,SageFromStudentWhereSdept<>‘IS’ANDSage<(SelectMAX(Sage)FromStudentWhereSdept=‘IS’);9/20/202389周口師范學(xué)院計(jì)算機(jī)科學(xué)系本查詢也可以用集函數(shù)來(lái)實(shí)現(xiàn)。首先用子查詢找出IS系中最大年齡例33查詢其他系中比信息系中所有學(xué)生年齡都小的學(xué)生姓名和年齡。SelectSname,SageFromStudentWhereSdept<>‘IS’AndSage<All(SelectSageFromStudentWhereSdept=‘IS’);本查詢也可以用集函數(shù)實(shí)現(xiàn)。SQL語(yǔ)句?

9/20/202390周口師范學(xué)院計(jì)算機(jī)科學(xué)系例33查詢其他系中比信息系中所有學(xué)生年齡都小的學(xué)生姓名和事實(shí)上,用集函數(shù)實(shí)現(xiàn)子查詢通常比直接用ANY或ALL查詢效率要高。ANY與ALL與集函數(shù)的對(duì)應(yīng)關(guān)系如下表示:

ANY,ALL謂詞與集函數(shù)及IN謂詞的等價(jià)轉(zhuǎn)換關(guān)系=<>或!=<<=>>=ANYIN--<MAX<=MAX>MIN>=MINALL--IN<MIN<=MIN>MAX>=MAX9/20/202391周口師范學(xué)院計(jì)算機(jī)科學(xué)系事實(shí)上,用集函數(shù)實(shí)現(xiàn)子查詢通常比直接用ANY或ALL查詢效率四、帶有EXISTS謂詞的子查詢EXISTS代表存在量詞。帶有EXISTS謂詞的子查詢不返回任何數(shù)據(jù),只產(chǎn)生邏輯真值“true”或邏輯假值“false”.例34查詢選擇了1號(hào)課程的學(xué)生姓名。SELECTSnameFROMStudentWHEREEXISTS(SELECT*FROMSCWHERESno=Student.SnoANDCno=‘1’);9/20/202392周口師范學(xué)院計(jì)算機(jī)科學(xué)系四、帶有EXISTS謂詞的子查詢8/6/202392周口師范使用存在量詞EXISTS后,若內(nèi)層查詢結(jié)果非空,則外層的WHERE子句返回真值,否則返回假值。由EXISTS引出的子查詢,其目標(biāo)列表達(dá)式通常都用*,因?yàn)閹XISTS的子查詢只返回真值或假值,給出列名沒(méi)有實(shí)際意義。這類子查詢的查詢條件依賴于外層父查詢的某個(gè)屬性值,稱這類查詢?yōu)橄嚓P(guān)子查詢。

9/20/202393周口師范學(xué)院計(jì)算機(jī)科學(xué)系使用存在量詞EXISTS后,若內(nèi)層查詢結(jié)果非空,則外層的WH從概念上講,相關(guān)子查詢的一般處理過(guò)程是:首先取外層查詢中表的第一個(gè)元組,根據(jù)它與內(nèi)層查詢相關(guān)的屬性值處理內(nèi)層查詢,若WHERE子句返回值為真,則取此元組放入結(jié)果表;然后再取表的下一個(gè)元組;重復(fù)這一過(guò)程,直至外層表全部檢查完為止。與EXISTS謂詞相對(duì)應(yīng)的是NOTEXISTS謂詞。使用存在量詞NOTEXISTS后,若內(nèi)層查詢結(jié)果為空,則外層的WHERE子句返回真值,否則返回假值。9/20/202394周口師范學(xué)院計(jì)算機(jī)科學(xué)系從概念上講,相關(guān)子查詢的一般處理過(guò)程是:8/6/202394例35查詢沒(méi)有選擇1號(hào)課程的學(xué)生姓名。SELECTSnameFROMStudentWHERENotEXISTS(SELECT*FROMSCWHERESno=Student.SnoAndCno=‘1’);一些帶有EXISTS或NOTEXISTS謂詞的子查詢不能被其它形式的子查詢等價(jià)替換,但所有帶IN謂詞、比較運(yùn)算符、ANY和ALL謂詞的子查詢都能用帶有EXISTS或NOTEXISTS謂詞的子查詢等價(jià)替換。9/20/202395周口師范學(xué)院計(jì)算機(jī)科學(xué)系例35查詢沒(méi)有選擇1號(hào)課程的學(xué)生姓名。8/6/20239查詢與劉晨在同一個(gè)系學(xué)習(xí)的學(xué)生。SELECTSno,Sname,SdeptFROMStudentWHERESdeptIN(SELECTSdeptFROMStudentWHERESname=‘劉晨’);9/20/202396周口師范學(xué)院計(jì)算機(jī)科學(xué)系查詢與劉晨在同一個(gè)系學(xué)習(xí)的學(xué)生。8/6/202396周口師范SELECTSno,Sname,SdeptFROMStudentS1WHEREEXISTS(SELECT*FROMStudentS2WHERES2.Sdept=S1.SdeptANDS2.Sname=‘劉晨’);9/20/202397周口師范學(xué)院計(jì)算機(jī)科學(xué)系SELECTSno,Sname,Sdept8/6由于帶EXISTS詞的相關(guān)子查詢只關(guān)心內(nèi)層查詢是否有返回值,并不需要查具體值因此其效率并不一定低于不相關(guān)子查詢,有時(shí)是高效的方法

9/20/202398周口師范學(xué)院計(jì)算機(jī)科學(xué)系由于帶EXISTS詞的相關(guān)子查詢只關(guān)心內(nèi)層查詢是否有返回值,例36查詢選修了全部課程的學(xué)生姓名SELECTSnameFROMStudentWHERENOTEXISTS(SELECT*FROMCourse

WHERENOTEXISTS(SELECT*FROMSCWHERESno=Student.SnoANDCno=Course.Cno));某個(gè)課程沒(méi)選9/20/202399周口師范學(xué)院計(jì)算機(jī)科學(xué)系例36查詢選修了全部課程的學(xué)生姓名某個(gè)課程沒(méi)選8/6/23.3.4集合查詢SELECT語(yǔ)句的查詢結(jié)果是元組的集合,所以多個(gè)SELECT語(yǔ)句的可進(jìn)行集合操作。集合操作主要包括并操作UNION、交操作INTERSECT和差操作MINUS.例37查詢選修了1號(hào)或2號(hào)課程的學(xué)生SELECTSnoFROMSCWHERECno=‘1’UNIONSELECTSnoFROMSCWHERECno=‘2’9/20/2023100周口師范學(xué)院計(jì)算機(jī)科學(xué)系3.3.4集合查詢SELECT語(yǔ)句的查詢結(jié)果是元組的集合,所標(biāo)準(zhǔn)SQL中沒(méi)有直接提供集合交操作和集合差操作,但可以用其他方法來(lái)實(shí)現(xiàn)。例38查詢選修了1號(hào)課程的學(xué)生和選修了2號(hào)課程的學(xué)生的交集SELECTSnoFROMSCWHERECno=‘1’ANDSnoIN(SELECTSnoFROMSCWHERECno=‘2’);9/20/2023101周口師范學(xué)院計(jì)算機(jī)科學(xué)系標(biāo)準(zhǔn)SQL中沒(méi)有直接提供集合交操作和集合差操作,但可以用其他例39查詢計(jì)算機(jī)系的學(xué)生與年齡不大于19歲的學(xué)生的差集。即查詢計(jì)算機(jī)系中年齡大于19歲的學(xué)生。SELECT*FROMStudentWHERESdept=‘CS’ANDSage>19;9/20/2023102周口師范學(xué)院計(jì)算機(jī)科學(xué)系例39查詢計(jì)算機(jī)系的學(xué)生與年齡不大于19歲的學(xué)生的差集。83.4數(shù)據(jù)更新SQL中數(shù)據(jù)更新包括插入、修改數(shù)據(jù)和刪除數(shù)據(jù)三條語(yǔ)句:INSERT語(yǔ)句UPDATE語(yǔ)句DELETE語(yǔ)句9/20/2023103周口師范學(xué)院計(jì)算機(jī)科學(xué)系3.4數(shù)據(jù)更新SQL中數(shù)據(jù)更新包括插入、修改數(shù)據(jù)和刪除數(shù)3.4.1Insert語(yǔ)句SQL的數(shù)據(jù)插入語(yǔ)句INSERT通常有兩種形式。一種是插入一個(gè)元組,另一種是插入子查詢結(jié)果。后者可以一次插入多個(gè)元組一、插入單個(gè)元組INSERTINTO<表名>[(<屬性列1>[,<屬性列2>…])]VALUES(<常量1>[{,<常量2>}]…);其功能是將新元組插入指定表中。其中新記錄屬性列1的值為常量1,屬性列2的值為常量2,…INTO子句中沒(méi)有出現(xiàn)的屬性列,新記錄在這些列上將取空值。如果INTO子句中沒(méi)有任何列名,則新插入的記錄必須在每個(gè)屬性列上均有值。9/20/2023104周口師范學(xué)院計(jì)算機(jī)科學(xué)系3.4.1Insert語(yǔ)句SQL的數(shù)據(jù)插入語(yǔ)句INSER例1將一個(gè)新學(xué)生記錄(學(xué)號(hào):95020;姓名:陳冬;性別:男;所在系:IS;年齡:18歲)插入到Student表中。INSERTINTOStudentValues(‘95020’,‘陳冬’,‘男’,‘IS’,18);例2插入一條選課記錄(‘95020’,‘1’)。INSERTINTOSC(Sno,Cno)Values(‘95020’,‘1’);新插入的記錄在Grade列上取空值。9/20/2023105周口師范學(xué)院計(jì)算機(jī)科學(xué)系例1將一個(gè)新學(xué)生記錄(學(xué)號(hào):95020;姓名:陳冬;性別:二、插入子查詢結(jié)果子查詢不僅可以嵌套在SELECT語(yǔ)句中,用以構(gòu)造父查詢的條件,也可以嵌套在INSERT語(yǔ)句中,用以生成要插入的批量數(shù)據(jù)。INSERTINTO<表名>[(<屬性列1>[,<屬性列2>…])]<子查詢>;9/20/2023106周口師范學(xué)院計(jì)算機(jī)科學(xué)系二、插入子查詢結(jié)果8/6/2023106周口師范學(xué)院計(jì)算機(jī)科例3對(duì)每一個(gè)系,求學(xué)生的平均年齡,并把結(jié)果存入數(shù)據(jù)庫(kù)。INSERTINTODept_Age(Sdept,Avgage)

SELECTSdept,AVG(Sage)FROMStudentGROUPBYSdept;9/20/2023107周口師范學(xué)院計(jì)算機(jī)科學(xué)系例3對(duì)每一個(gè)系,求學(xué)生的平均年齡,并把結(jié)果存入數(shù)據(jù)庫(kù)。83.4.2Update語(yǔ)句修改操作語(yǔ)句的一般格式:UPDATE<表名>SET<列名1>=<表達(dá)式1>[,<列名2>=<表達(dá)式2>]…[WHERE<條件>];其功能是修改指定表中滿足WHERE子句條件的元組。其中SET子句給出<表達(dá)式>的值用于取代相應(yīng)的屬性列值。如果省略WHERE子句,則表示要修改表中的所有元組。9/20/2023108周口師范學(xué)院計(jì)算機(jī)科學(xué)系3.4.2Update語(yǔ)句修改操作語(yǔ)句的一般格式:8/6一、修改某一個(gè)元組的值例4、將學(xué)生95001的年齡改為22歲UPDATEStudentSETSage=22WHERESno=‘95001’;二、修改

溫馨提示

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