關(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è),還剩220頁(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)介

1、關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL第三章 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL3.1 SQL概述概述3.2 數(shù)據(jù)定義數(shù)據(jù)定義3.3 查詢查詢3.4 數(shù)據(jù)更新數(shù)據(jù)更新3.5 視圖視圖3.6 數(shù)據(jù)控制數(shù)據(jù)控制3.7 嵌入式嵌入式SQL關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQLSQL歷史 SQ是什么? SQL是一個(gè)通用的、功能極強(qiáng)的關(guān)系數(shù)據(jù)庫(kù)的標(biāo)準(zhǔn)語(yǔ)言。 SQL語(yǔ)言是介乎于關(guān)系代數(shù)和元組演算之間的一種結(jié)構(gòu)化查詢語(yǔ)言。 本章詳細(xì)介紹SQL的核心部分內(nèi)容:數(shù)據(jù)定義、數(shù)據(jù)查詢、數(shù)據(jù)更新和嵌入式SQL。 歷史 1970年,美國(guó)IBM研究中心的E.F.Codd連續(xù)發(fā)表多篇論文,提出關(guān)系模型。 1972年,IBM公司開(kāi)始研制實(shí)驗(yàn)型關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)S

2、YSTEM R,配制的查詢語(yǔ)言稱為SQUARE (Specifying Queries As Relational Expression )語(yǔ)言,在語(yǔ)言中使用了較多的數(shù)學(xué)符號(hào)。 1974年,Boyce和Chamberlin把SQUARE修改為SEQUEL (Structured English QUEry Language )語(yǔ)言。后來(lái)SEQUEL簡(jiǎn)稱為SQL (Structured Query Language ),即“結(jié)構(gòu)式查詢語(yǔ)言”,SQL的發(fā)音仍為“sequel”?,F(xiàn)在SQL已經(jīng)成為一個(gè)標(biāo)準(zhǔn) 。關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQLSQL概述 SQL的功能SQL數(shù)據(jù)定義功能SQL模式、基本表和索引的

3、創(chuàng)建和撤銷SQL數(shù)據(jù)查詢功能SELECT語(yǔ)句的句法,SELECT語(yǔ)句的幾種形式及各種限定,基本表的聯(lián)接操作,SQL3中的遞歸查詢SQL數(shù)據(jù)修改功能或數(shù)據(jù)操縱插入、刪除和修改語(yǔ)句視圖的創(chuàng)建和撤銷,對(duì)視圖更新操作的限制SQL數(shù)據(jù)控制功能GRANT,REVOKE 嵌入式SQL:預(yù)處理方式,使用規(guī)定,使用技術(shù),卷游標(biāo),動(dòng)態(tài)SQL語(yǔ)句關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL數(shù)據(jù)庫(kù)的體系結(jié)構(gòu) 用戶用戶1 1用戶用戶2 2用戶用戶3 3用戶用戶4 4視圖視圖1 1視圖視圖1 1基本表基本表1 1基本表基本表2 2基本表基本表3 3基本表基本表4 4存儲(chǔ)文件存儲(chǔ)文件1 1存儲(chǔ)文件存儲(chǔ)文件2 2存儲(chǔ)文件存儲(chǔ)文件3 3存儲(chǔ)文件存

4、儲(chǔ)文件4 4SQLSQL數(shù)據(jù)庫(kù)的體系結(jié)構(gòu)數(shù)據(jù)庫(kù)的體系結(jié)構(gòu)SQLSQL用戶用戶ViewViewB a s e B a s e tabletableStoreStored d filefile關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL基本概念基本表是本身獨(dú)立存在的表,在SQL中一個(gè)關(guān)系就是一個(gè)基本表。一個(gè)基本表對(duì)應(yīng)一個(gè)存儲(chǔ)文件,一個(gè)表可以帶若干索引,索引也存放在存儲(chǔ)文件中。存儲(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ù)中,即數(shù)據(jù)庫(kù)中只存放視圖的定義而不存放視圖對(duì)應(yīng)的數(shù)據(jù),這些數(shù)據(jù)仍存放在導(dǎo)出視圖的基本表中,

5、因此視圖是一個(gè)虛表。視圖在概念上于基本表等同,用戶可以在視圖上再定義視圖。關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL基本概念 主要特點(diǎn)包括: 綜合統(tǒng)一 高度非過(guò)程化 面向集合的操作方式 以同一種語(yǔ)法結(jié)構(gòu)提供兩種使用方式 語(yǔ)言簡(jiǎn)捷,易學(xué)易用SQL語(yǔ)言支持關(guān)系數(shù)據(jù)庫(kù)三級(jí)模式結(jié)構(gòu)。其中: 外模式 對(duì)應(yīng)于 視圖和部分基本表, 模式 對(duì)應(yīng)于 基本表, 內(nèi)模式 對(duì)應(yīng)于 存儲(chǔ)文件。用戶可以用SQL語(yǔ)言對(duì)基本表和視圖進(jìn)行查詢或其他操作,基本表和視圖一樣,都是關(guān)系。關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQLSQL的組成 核心SQL主要有四個(gè)部分: 數(shù)據(jù)定義語(yǔ)言即SQL DDL,用于定義SQL模式、基本表、視圖、索引等結(jié)構(gòu)。 數(shù)據(jù)操縱語(yǔ)言即SQL

6、DML。數(shù)據(jù)操縱分成數(shù)據(jù)查詢和數(shù)據(jù)更新兩類。其中數(shù)據(jù)更新又分成插入、刪除和修改三種操作。 嵌入式SQL語(yǔ)言的使用規(guī)定。這一部分內(nèi)容涉及到SQL語(yǔ)句嵌入在宿主語(yǔ)言程序中的規(guī)則。 數(shù)據(jù)控制語(yǔ)言即SQL DCL,這一部分包括對(duì)基本表和視圖的授權(quán)、完整性規(guī)則的描述、事務(wù)控制等內(nèi)容。 返回關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQLSQL數(shù)據(jù)定義功能域定義*SQL提供的主要數(shù)據(jù)類型(也稱為“域類型”)有:(1)數(shù)值型(2)字符串型(3)位串型(4)時(shí)間型基本表的定義索引的定義數(shù)據(jù)庫(kù)的建立與撤消SQL數(shù)據(jù)定義特點(diǎn)關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL定義基本表格式如下: (列級(jí)完整性約束 ,列級(jí)完整性約束,),primary key(列名

7、 ,列名 ) ,foreign key (列名 ,列名 ) references 表名 (列名 ,列名 ) ,check(條件);說(shuō)明:如果完整性約束條件涉及到該表的多個(gè)屬性列,則必須定義在表級(jí)上,否則既可以定義在列級(jí)也可以定義在表級(jí)。注意:定義表時(shí)每一個(gè)定義語(yǔ)句之間用逗號(hào)分隔,最后一條語(yǔ)句不用逗號(hào)。每個(gè)SQL語(yǔ)句以分號(hào)結(jié)束。關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL示例數(shù)據(jù)庫(kù)DEPT(Dno , DNAME , DEAN)Student(Sno , SNAME , SEX , AGE , Dno)COURSE(Cno , CName , PCno , CREDIT)SC(Sno , Cno , SCORE)P

8、ROF(Pno , PNAME, AGE, Dno , SAL)PC(Pno , Cno)關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL例子例1 建立一個(gè)“學(xué)生”表Student,它由學(xué)號(hào)Sno、姓名Sname、性別Ssex、年齡Sage、所在系Sdept五個(gè)屬性組成,其中學(xué)號(hào)屬性不能為空,并且其值是唯一的。CREATETABLE Student ( Sno CHAR(5) NOT NULL UNIQUE,Sname CHAR(20),Ssex CHAR(1),Sage INT,Sdept CHAR(15) );關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL例子*:例2CREATE TABLE Course(cno char(4) no

9、t null,cname char(10) not null,PCno char(4) , CREDIT int,PRIMARY KEY(CNO) );例3CREATE TABLE SC (SNO char(5) NOT NULL,CNO char(4) NOT NULL,GRADE SMALLINT,PRIMARY KEY(SNO,CNO) ,F(xiàn)OREIGN KEY(SNO) REFERENCES S(SNO) ,F(xiàn)OREIGN KEY(CNO) REFERENCES C(CNO) ) ;關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL常見(jiàn)域類型*char(n)或charter(n) :固定長(zhǎng)度的字符串。varch

10、ar(n):最大長(zhǎng)度為n的可變長(zhǎng)字符串。Int或integer:全字長(zhǎng)二進(jìn)制整數(shù)。smallint:半字長(zhǎng)二進(jìn)制整數(shù)。numeric(p,d):定點(diǎn)數(shù),小數(shù)點(diǎn)左邊p位,右邊q位。Decimal(p,q)或Dec (p,q)壓縮十進(jìn)制數(shù),共P位,其中小數(shù)點(diǎn)后有q位,0=q=p 0)關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL修改基本表結(jié)構(gòu)格式為:ALTER TABLE ADD 完整性約束DROP MODIFY ;ADD子句用于增加新列和新的完整性約束條件,DROP子句用于刪除制定的完整性約束條件,MODIFY子句用于修改原有的列定義,包括修改列名和數(shù)據(jù)類型。示例alter table PROF add LOCATI

11、ON char30關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL例2 向Student表增加“入學(xué)時(shí)間”列,其數(shù)據(jù)類型為日期型ALTER TABLE Student ADD Scome DATE; 不論基本表中原來(lái)是否已有數(shù)據(jù),新增加的列一律為空值。 例3 將年齡的數(shù)據(jù)類型改為半字長(zhǎng)整數(shù)ALTER TABLE Student MODIFY Sage SMALLINT; 修改原有的列定義有可能會(huì)破壞已有數(shù)據(jù)。 例4 刪除關(guān)于學(xué)號(hào)必須取唯一值的約束ALTER TABLE Student DROP UNIQUE(Sno); 說(shuō)明:SQL沒(méi)有提供刪除屬性列的語(yǔ)句,用戶只能間接實(shí)現(xiàn)這一功能,即先原表中要保留的列及其內(nèi)容復(fù)制到

12、一個(gè)新表中,然后刪除原表,并將新表重命名為原表名。 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL刪除基本表格式為:DROP TABLE 示例5 :刪除Student表DROP TABLEStudent 撤消基本表后,基本表的定義、表中數(shù)據(jù)、索引、以及由此表導(dǎo)出的視圖的定義都被刪除。關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL索引:加快查詢速度 建立索引的一般格式為:CREATE UNIQUE CLUSTER INDEX ON (,); 索引可以建立在該表的一列或多列上,各列名之間用逗號(hào)分隔。每個(gè)后面還可以用指定索引值的排列次序,可選ASC(升序)或DESC(降序),缺省值為ASC。 UNIQUE表明此索引的每一個(gè)索引值只對(duì)應(yīng)唯一的數(shù)

13、據(jù)記錄。 CLUSTER表示要建立的索引是聚簇索引。所謂聚簇索引是指索引項(xiàng)的順序與表中記錄的物理順序一致的索引組織。用戶可以在最常查詢的列上建立聚簇索引以提高查詢效率。顯然在一個(gè)基本表上最多只能建立一個(gè)聚簇索引。建立聚簇索引后,更新索引列數(shù)據(jù)時(shí),往往導(dǎo)致表中記錄的物理順序的變更,代價(jià)較大,因此對(duì)于經(jīng)常更新的列不宜建立聚簇索引。 示例 create cluster index s-index on S(S#)關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL例子例6為學(xué)生-課程數(shù)據(jù)庫(kù)中的Student、Couse、SC三個(gè)表建立索引。其中Student表按學(xué)號(hào)升序建唯一索引,CREATE UNIQUE INDEX Stu

14、sno ON Student(Sno);Couse表按課程號(hào)升序建唯一索引,CREATE UNIQUE INDEX Coucno ON Couse(Cno);Sno、Cno表按學(xué)號(hào)升序和課程號(hào)降序建唯一索引。CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC); 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL刪除索引一般格式:DROP INDEX ;索引的有關(guān)說(shuō)明什么時(shí)候適合建立索引?可以動(dòng)態(tài)地定義索引,即可以隨時(shí)建立和刪除索引。不允許用戶在數(shù)據(jù)操作中引用索引。索引如何使用完全由系統(tǒng)決定,這支持了數(shù)據(jù)的物理獨(dú)立性。索引是否越多越好?應(yīng)該在使用頻率高的、經(jīng)常用于連接的列上建

15、索引。一個(gè)表上可建多個(gè)索引。索引可以提高查詢效率,但索引過(guò)多耗費(fèi)空間,且降低了插入、刪除、更新的效率。例7 刪除Student表的索引Stusname(假設(shè)已存在)DROP INDEX Stusname; 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL數(shù)據(jù)庫(kù)的建立與撤消 有的數(shù)據(jù)庫(kù)系統(tǒng)支持多庫(kù)。建立一個(gè)新數(shù)據(jù)庫(kù)create database 數(shù)據(jù)庫(kù)名撤消一個(gè)數(shù)據(jù)庫(kù)drop database 數(shù)據(jù)庫(kù)名指定當(dāng)前數(shù)據(jù)庫(kù)database 數(shù)據(jù)庫(kù)名指定當(dāng)前數(shù)據(jù)庫(kù)close database 數(shù)據(jù)庫(kù)名關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQLSQL數(shù)據(jù)定義特點(diǎn)* SQL中,任何時(shí)候都可以執(zhí)行一個(gè)數(shù)據(jù)定義語(yǔ)句,隨時(shí)修改數(shù)據(jù)庫(kù)結(jié)構(gòu)。而在非關(guān)系型的數(shù)

16、據(jù)庫(kù)系統(tǒng)中,必須在數(shù)據(jù)庫(kù)的裝入和使用前全部完成數(shù)據(jù)庫(kù)的定義。若要修改已投入運(yùn)行的數(shù)據(jù)庫(kù),則需停下一切數(shù)據(jù)庫(kù)活動(dòng),把數(shù)據(jù)庫(kù)卸出,修改數(shù)據(jù)庫(kù)定義并重新編譯,再按修改過(guò)的數(shù)據(jù)庫(kù)結(jié)構(gòu)重新裝入數(shù)據(jù)。數(shù)據(jù)庫(kù)定義不斷增長(zhǎng)(不必一開(kāi)始就定義完整)。數(shù)據(jù)庫(kù)定義隨時(shí)修改(不必一開(kāi)始就完全合理)??蛇M(jìn)行增加索引、撤消索引的實(shí)驗(yàn),檢驗(yàn)其對(duì)效率的影響。關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQLSQL數(shù)據(jù)查詢功能*SQL數(shù)據(jù)查詢基本結(jié)構(gòu)select子句重復(fù)元組的處理from子句where子句更名運(yùn)算字符串操作元組顯示順序集合操作分組和聚集函數(shù)空值嵌套子查詢派生關(guān)系視圖關(guān)系的連接關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL查詢 數(shù)據(jù)庫(kù)查詢是數(shù)據(jù)庫(kù)的核心操作。S

17、QL語(yǔ)言提供了SELECT語(yǔ)句進(jìn)行數(shù)據(jù)庫(kù)的查詢,該語(yǔ)句具有靈活的使用方式和豐富的功能。其一般格式為: SELECT ALL|DISTINCT , FROM , WHERE GROUP BY HAVING ORDER BY ASC|DESC; 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQLSELECT語(yǔ)句的含義 根據(jù)WHERE子句的條件表達(dá)式,從FROM子句指定的基本表或視圖中找出滿足條件的元組, 再按SELECT子句中的目標(biāo)列表達(dá)式,選出元組中的屬性值形成結(jié)果表。 如果有GROUP子句,則將結(jié)果按的值進(jìn)行分組,該屬性列值相等的元組為一組。通常會(huì)在每組中作用集函數(shù)。如果GROUP子句帶HAVING短語(yǔ),則只有滿足指定

18、條件的組才予輸出。 如果有ORDER BY子句,則結(jié)果表還要按的值的升序或降序排序。 DISTINCT(ALL)表示選出的記錄中不包括(包括)重復(fù)記錄 注意:語(yǔ)法中方括號(hào)里的內(nèi)容是可選項(xiàng),根據(jù)功能的不同可以選也可以不選,尖括號(hào)中的內(nèi)容是必選項(xiàng)。關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQLSQL數(shù)據(jù)查詢基本結(jié)構(gòu)基本結(jié)構(gòu)select A1 , A2 , , Anfrom r1 , r2 , , rmwhere P A1 , A2 , , An(p(r1 r2 rm)示例給出所有老師的姓名。select PNAMEfrom PROF關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQLselect子句目標(biāo)列形式 可以為列名、* 、算術(shù)表達(dá)式、聚集函

19、數(shù)?!?”:表示“所有的屬性”。例:給出所有老師的信息。select *from PROF帶, , 的算術(shù)表達(dá)式例:給出所有老師的姓名及稅后工資額。select PNAME,SAL 0.95from PROF關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL重復(fù)元組的處理語(yǔ)法約束 缺省為保留重復(fù)元組,也可用關(guān)鍵字all顯式指明。若要去掉重復(fù)元組,可用關(guān)鍵字distinct或unique指明。示例 找出所有選修課程的學(xué)生。 select distinct SNO from SC關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQLfrom子句()說(shuō)明 from子句列出查詢的對(duì)象表。當(dāng)目標(biāo)列取自多個(gè)表時(shí),在不混淆的情況下可以不用顯式指明來(lái)自哪個(gè)關(guān)系。示

20、例例:找出工資低于500的職工的姓名、工資、系別。 select PNAME , SAL , DNAME from PROF , DEPT where SAL P2.SAL關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL元組顯示順序命令order by 列名 asc | desc示例按系名升序列出老師姓名,所在系名,同一系中老師按姓名降序排列。 select DNAME,PNAME from PROF,DEPT where PROF.DNO = DEPT.DNO order by DNAME asc,PNAME desc關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL單表查詢 選擇表中的若干列 1查詢指定列 中各個(gè)列的先后順序可以與表中的順

21、序不一致。用戶可以根據(jù)應(yīng)用的需要改變列的現(xiàn)實(shí)順序。 2查詢?nèi)苛?3查詢經(jīng)過(guò)計(jì)算的值 不僅可以是算術(shù)表達(dá)式,還可以是字符串常量、函數(shù)等。注意算數(shù)表達(dá)式、字符串常量、函數(shù)做目標(biāo)列表達(dá)式。用字符串常量做目標(biāo)列表達(dá)式時(shí),必須用單引號(hào)把字符串引起來(lái),表示一個(gè)字符串常量。 用戶可以通過(guò)指定別名來(lái)改變查詢結(jié)果的列標(biāo)題,這對(duì)于含算數(shù)表達(dá)式、常量、函數(shù)名的目標(biāo)列表達(dá)式尤為有用。 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL查詢指定列例子例1查詢?nèi)w學(xué)生的學(xué)號(hào)與姓名SELECT Sno,SnameFROM Student; 中各個(gè)列的先后順序可以與表中的順序不一致。也就是說(shuō),用戶在查詢時(shí)可以根據(jù)應(yīng)用的需要改變列的顯示順序。例2查詢

22、全體學(xué)生的姓名、學(xué)號(hào)、所在系SELECT Sname, Sno, SdeptFROM Student; 這時(shí)結(jié)果表中的列的順序與基表中不同,是按查詢要求,先列出姓名屬性,然后再列學(xué)號(hào)屬性和所在系屬性。關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL查詢?nèi)苛欣永?查詢?nèi)w學(xué)生的詳細(xì)記錄SELECT *FROM Student;該SELECT語(yǔ)句實(shí)際上是無(wú)條件地把Student表的全部信息都查詢出來(lái),所以也稱為全表查詢,這是最簡(jiǎn)單的一種查詢。關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL查詢經(jīng)過(guò)計(jì)算的值例子SELECT子句的不僅可以是表中的屬性列,也可以是有關(guān)表達(dá)式,即可以將查詢出來(lái)的屬性列經(jīng)過(guò)一定的計(jì)算后列出結(jié)果。 例4 查全體學(xué)生的姓

23、名及其出生年份SELECT Sname, 2005-SageFROM Student; 本例中,中第二項(xiàng)是一個(gè)計(jì)算表達(dá)式。v例例4輸出的結(jié)果為:輸出的結(jié)果為: Sname 1996-Sage-李勇李勇1976劉晨劉晨1977王名王名1978張立張立1977-關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL例5查全體學(xué)生的姓名、出生年份和所有系,要求用小寫(xiě)字母表示所有系名SELECT Sname, Year of Birth:, 1996-Sage, ISLOWER(Sdept)FROM Student;結(jié)果為: Sname Year of Birth:1996-SageISLOWER(Sdept)-李勇 Year o

24、f Birth:1976cs劉晨 Year of Birth:1977is王名 Year of Birth:1978ma張立 Year of Birth:1977is關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL 用戶可以通過(guò)指定別名來(lái)改變查詢結(jié)果的列標(biāo)題,這對(duì)于含算術(shù)表達(dá)式、常量、函數(shù)名的目標(biāo)列表達(dá)式尤為有用。例如對(duì)于上例,可以如下定義列別名 SELECTSname NAME, Year of Birth:BIRTH,1996-SageBIRTHDAY,ISLOWER(Sdept) DEPARTMENTFROMStudent;結(jié)果為: NAMEBIRTH BIRTHDAY DEPARTMENT -李勇Year o

25、f Birth: 1976cs劉晨Year of Birth: 1977is王名Year of Birth: 1978 ma張立Year of Birth: 1977 is關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL選擇表中的若干元組 1消除取值重復(fù)的行 查詢結(jié)果里可能包含了許多重復(fù)行。如果想去掉結(jié)果表中的重復(fù)行,必須指定DISTINCT短語(yǔ)。如果沒(méi)有指定DINTINCT短語(yǔ),則缺省為ALL,即保留結(jié)果表中取值重復(fù)的行。 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL例6 查所有選修過(guò)課的學(xué)生的學(xué)號(hào)SELECT SnoFROM SC;假設(shè)SC表中有下列數(shù)據(jù) Sno Cno Grade- - - 95001 1 92 95001 2 8

26、5 95001 3 88 95002 2 90 95002 3 80 執(zhí)行左面的執(zhí)行左面的SELECT語(yǔ)句后,結(jié)語(yǔ)句后,結(jié)果為:果為: Sno - 95001 95001 95001 95002 95002 查詢結(jié)果里包含了查詢結(jié)果里包含了許多重復(fù)的行。許多重復(fù)的行。如果想去掉結(jié)果表中的重復(fù)行,必須指定如果想去掉結(jié)果表中的重復(fù)行,必須指定DISTINCT短語(yǔ):短語(yǔ): SELECT DISTINCT Sno FROM SC; 執(zhí)行結(jié)果為:執(zhí)行結(jié)果為: Sno - 95001 95002 -關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL查詢滿足條件的元組查詢滿足指定條件的元組可以通過(guò)WHERE子句實(shí)現(xiàn)。WHERE子句常

27、用的查詢條件如書(shū)上表3.3。 比較大小 確定范圍 確定集合字符匹配 涉及空值的查詢多重條件查詢關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL表3-3 常用的查詢條件查詢條件謂 詞比較 =,=,=,!=,!,! NOT+上述比較運(yùn)算符確定范圍BETWEEN AND, NOT BETWEEN AND確定集合IN, NOT IN字符匹配LIKE, NOT LIKE空值IS NULL, IS NOT NULL多重條件AND, OR 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL比較大小例7查計(jì)算機(jī)系全體學(xué)生的名單SELECT Sname FROM Student WHERE Sdept = CS; 例8查所有年齡在20歲以下的學(xué)生姓名及其年齡S

28、ELECT Sname, Sage FROM Student WHERE Sage = 20; 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL例9查考試成績(jī)有不及格的學(xué)生的學(xué)號(hào)SELECT DISTINCT Sno FROM SCWHERE Grade 60; 這里使用了DISTINCT短語(yǔ),當(dāng)一個(gè)學(xué)生有多門課程不及格,他的學(xué)號(hào)也只列一次。 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL確定范圍例10 查詢年齡在20至23歲之間的學(xué)生的姓名、系別、和年齡SELECT Sname, Sdept, SageFROM Student WHERE Sage BETWEEN 20 AND 23; 與BETWEEN.AND.相對(duì)的謂詞是NOT BE

29、TWEEN.AND.。 例11 查詢年齡不在20至23歲之間的學(xué)生姓名、系別和年齡。SELECT Sname, Sdept, Sage FROM StudentWHERE Sage NOT BETWEEN 20 AND 23; 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL確定集合例12 查信息系(IS)、數(shù)學(xué)系(MA)和計(jì)算機(jī)科學(xué)系(CS)的學(xué)生的姓名和性別SELECT Sname, Ssex FROM Student WHERE Sdept IN (IS, MA, CS) 與IN相對(duì)的謂詞是NOT IN,用于查找屬性值不屬于指定集合的元組。 例13 查既不是信息系、數(shù)學(xué)系,也不是計(jì)算機(jī)科學(xué)系的學(xué)生的姓名和性別S

30、ELECT Sname, Ssex FROM Student WHERE Sdept NOT IN (IS, MA, CS) 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL例:查詢至少選修了1號(hào)和3號(hào)課程學(xué)生的學(xué)號(hào) SELECT SNO FROM SC WHERE CNO=1 AND SNO IN(SELECT SNO FROM SC WHERE CNO=3); 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL字符匹配語(yǔ)法格式如下: NOT LIKE ESCAPE 其含義是查找指定的屬性列值與相匹配的元組。可以是一個(gè)完整的字符串,也可以含有通配符%和_。其中: %(百分號(hào))代表任意長(zhǎng)度(長(zhǎng)度可以為0)的字符串。 _(下橫線)代表任意單個(gè)字

31、符。 如果用戶要查詢的字符串本身就包含有%或_,這時(shí)就要使用ESCAPE 短語(yǔ)對(duì)通配符進(jìn)行轉(zhuǎn)義了。 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL示例列出姓名以“張”打頭的教師的所有信息。 select * from PROF where PNAME like 張%列出名稱中含有4個(gè)字符以上,且倒數(shù)第3個(gè)字符是d,倒數(shù)第2個(gè)字符是_的系的所有信息。 select * from PROF where PNAME like % d ESCAPE 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL例14 查所有姓劉的學(xué)生的姓名、學(xué)號(hào)和性別SELECT Sname, Sno, SsexFROM Student WHERE Sname LIKE 劉%

32、; 例15 查姓“歐陽(yáng)”且全名為三個(gè)漢字的學(xué)生的姓名SELECT Sname FROM Student WHERE Sname LIKE 歐陽(yáng)_; 注意,由于一個(gè)漢字占兩個(gè)字符的位置,所以匹配串歐陽(yáng)后面需要跟個(gè)_。 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL例16 查名字中第二字為“陽(yáng)”字的學(xué)生的姓名和學(xué)號(hào)SELECT Sname, Sno FROM Student WHERE Sname LIKE _陽(yáng)%; 例17 查所以不姓劉的學(xué)生姓名SELECT Sname, Sno, SsexFROM StudentWHERE Sname NOT LIKE 劉%;關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL如果用戶要查詢的匹配字符串本身就

33、含有%或_,比如要查名字為DB_Design的課程的學(xué)分,應(yīng)如何實(shí)現(xiàn)呢?這時(shí)就要使用ESCAPE 短語(yǔ)對(duì)通配符進(jìn)行轉(zhuǎn)義了。 例18 查DB_Design課程的課程號(hào)和學(xué)分SELECT Cno, CcreditFROM CourseWHERE Cname LIKE DB_Design ESCAPE ESCAPE 短語(yǔ)表示為換碼字符,這樣匹配串中緊跟在后面的字符”_”不再具有通配符的含義,而是取其本身含義,被轉(zhuǎn)義為普通的”_”字符。關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL例19查以”DB_”開(kāi)頭,且倒數(shù)第三個(gè)字符為i的課程的詳細(xì)情況SELECT *FROM CourseWHERE Cname LIKE DB_%i

34、_ ESCAPE ;注意:這里的匹配字符串DB_%i_。第一個(gè)_前面有換碼字符,所以它被轉(zhuǎn)義為普通的_字符。而%、第二個(gè)_和第三個(gè)_前面均沒(méi)有換碼字符,所以它們?nèi)宰鳛橥ㄅ浞?。其?zhí)行結(jié)果為: CnoCnameCcredit-8 DB_Design 410DB_Programing 213DB_DBMS Design4 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL涉及空值的查詢例20某些學(xué)生選修某門課程后沒(méi)有參加考試,所以有選課記錄,但沒(méi)有考試成績(jī),下面我們來(lái)查一下缺少成績(jī)的學(xué)生的學(xué)號(hào)和相應(yīng)的課程號(hào)SELECT Sno, Cno FROM SCWHERE Grade IS NULL; 注意這里的IS不能用等號(hào)(=)

35、代替。 例21查所有有成績(jī)的記錄的學(xué)生學(xué)號(hào)和課程號(hào)SELECT Sno, Cno FROM SC WHERE Grade IS NOT NULL; 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL多重條件查詢邏輯運(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í)。例22查CS系年齡在20歲以下的學(xué)生姓名SELECT Sname FROM Student WHERE Sdept=CS AND Sage20;關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL 例12 中的IN謂詞實(shí)際上是多個(gè)OR運(yùn)算符的縮寫(xiě),因此例12中的查詢也可以用OR運(yùn)算符寫(xiě)成如

36、下等價(jià)形式:SELECT Sname, Ssex FROM Student WHERE Sdept=IS OR Sdept=MA OR Sdept=CS; 附:例12查信息系(IS)、數(shù)學(xué)系(MA)和計(jì)算機(jī)科學(xué)系(CS)的學(xué)生的姓名和性別SELECT Sname, Ssex FROM Student WHERE Sdept IN (IS, MA, CS) 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL對(duì)查詢結(jié)果排序 如果沒(méi)有指定查詢結(jié)果的顯示順序,DBMS將按其最方便的順序(通常是元組在表中的先后順序)輸出查詢結(jié)果。用戶也可以用ORDER BY子句指定按照一個(gè)或多個(gè)屬性列的升序(ASC)或降序(DESC)重新排列查

37、詢結(jié)果,其中升序ASC為缺省值。 對(duì)于空值,若按升序排,含空值的元組將最后顯示。若按降序排,空值的元組將最先顯示。多列排序時(shí),排序列的順序不一樣,排序優(yōu)先級(jí)也不同,前面的優(yōu)先級(jí)高。關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL例23 查詢選修了3號(hào)課程的學(xué)生的學(xué)號(hào)及其成績(jī),查詢結(jié)果按分?jǐn)?shù)的降序排列SELECT Sno, GradeFROM SCWHERE Cno=3 ORDER BY Grade DESC;例24 查詢?nèi)w學(xué)生情況,查詢結(jié)果按所在系升序排列,對(duì)同一系中的學(xué)生按年齡降序排列 SELECT * FROM Student ORDER BY Sdept, Sage DESC; 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL四、使

38、用集函數(shù) 為增強(qiáng)檢索功能,SQL提供了許多集函數(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 ) 求一列值中的最小值 如果指定DISTINCT短語(yǔ),則表示在計(jì)算時(shí)要取消指定列中的重復(fù)值。如果不指定DISTINCT短語(yǔ)或指定ALL短語(yǔ),則表示不取消重復(fù)值。 關(guān)系數(shù)據(jù)庫(kù)標(biāo)

39、準(zhǔn)語(yǔ)言SQL例25 查詢學(xué)生總?cè)藬?shù) SELECT COUNT(*) FROM Student; 例26 查詢選修了課程的學(xué)生人數(shù)SELECT COUNT(DISTINCT Sno)FROM SC;學(xué)生每選修一門課,在SC中都有一條相應(yīng)的記錄,而一個(gè)學(xué)生一般都要選修多門課程,為避免重復(fù)計(jì)算學(xué)生人數(shù),必須在COUNT函數(shù)中用DISTINCT短語(yǔ)。關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL例27 計(jì)算1號(hào)課程的學(xué)生平均成績(jī) SELECT AVG(Grade) FROM SC WHERE Cno=1; 例28 查詢學(xué)習(xí)1號(hào)課程的學(xué)生最高分?jǐn)?shù)SELECT MAX(Grade) FROM SC WHERE Cno=1; 關(guān)

40、系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL對(duì)查詢結(jié)果分組 GROUP BY子句可以將查詢結(jié)果表的各行按一列或多列取值相等的原則進(jìn)行分組。對(duì)查詢結(jié)果分組的目的是為了細(xì)化集函數(shù)的作用對(duì)象。如果未對(duì)查詢結(jié)果分組,集函數(shù)將作用于整個(gè)查詢結(jié)果,即整個(gè)查詢結(jié)果只有一個(gè)函數(shù)值。否則,集函數(shù)將作用于每一個(gè)組,即每一組都有一個(gè)函數(shù)值。 HAVING短語(yǔ)指定選擇組的條件,只有滿足條件的組才會(huì)被選出來(lái)。HAVING短語(yǔ)的條件由集函數(shù)構(gòu)造。 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL例30 查詢信息系選修了3門以上課程的學(xué)生的學(xué)號(hào)SELECT SnoFROM SCWHERE Sdept=IS;GROUP BY SnoHAVING

41、COUNT(*)3; 查選修課程超過(guò)3門的信息系學(xué)生的學(xué)號(hào),首先需要通過(guò)WHERE子句從基本表中求出信息系的學(xué)生。 然后求其中每個(gè)學(xué)生選修了幾門課,為此需要用GROUP BY子句按Sno進(jìn)行分組,再用集函數(shù)COUNT對(duì)每一組計(jì)數(shù)。 如果某一組的元組數(shù)目大于3,則表示此學(xué)生選修的課超過(guò)3門,應(yīng)將他的學(xué)生號(hào)選出來(lái)。HAVING短語(yǔ)指定選擇組的條件,只有滿足條件(即元組個(gè)數(shù)3)的組才會(huì)被選出來(lái)。 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL分組和聚集函數(shù)()分組命令group by 列名 having 條件表達(dá)式 group by將表中的元組按指定列上的值相等的原則分組,然后在每一分組上使用聚集函數(shù),得到單一值。hav

42、ing則對(duì)分組進(jìn)行選擇,只將聚集函數(shù)作用到滿足條件的分組上。聚集函數(shù)平均值:avg最小值:min最大值:max總和:sum記數(shù):count關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL分組和聚集函數(shù)()示例列出各系的老師的最高、最低、平均工資。 select DNO,max(SAL),min(SAL),avg(SAL) from PROF group by DNO列出及格的學(xué)生的平均成績(jī)。 select SNO,avg(SCORE) from SC group by SNO having min(SCORE) = 60關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL空值()空值測(cè)試is not null測(cè)試指定列的值是否為空值。示例找出年

43、齡值為空的老師姓名。 select PNAME from PROF where AGE is null不可寫(xiě)為where AGE = null關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL空值()注意事項(xiàng)除is not null之外,空值不滿足任何查找條件。如果null參與算術(shù)運(yùn)算,則該算術(shù)表達(dá)式的值為null。如果null參與比較運(yùn)算,則結(jié)果可視為false。在SQL-92中可看成unknown。如果null參與聚集運(yùn)算,則除count(*)之外其它聚集函數(shù)都忽略null。 例:select sum(SAL) from PROF 例:select count(*) from PROF關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL集合操

44、作()命令集合并:union集合交:intersect集合差: except示例求選修了001或002號(hào)課程的學(xué)生號(hào)。(select SNO from SC where CNO = 001)union all(select SNO from SC where CNO = 002)關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL集合操作()求選修了001和002號(hào)而沒(méi)有選003號(hào)課程的學(xué)生號(hào)。(select SNO from SC where CNO = 001 or CNO = 002 )except(select SNO from SC where CNO = 003)提示 集合操作自動(dòng)去除重復(fù)元組,如果要保留重復(fù)

45、元組的話,必須用all關(guān)鍵詞指明。關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL連接查詢 什么是連接查詢?若一個(gè)查詢同時(shí)涉及兩個(gè)以上的表,則稱之為連接查詢。連接查詢是關(guān)系數(shù)據(jù)庫(kù)中最主要的查詢,也是查詢中最難的一部分。 連接查詢主要包括等值連接非等值連接查詢、自然連接自身連接查詢外連接查詢復(fù)合條件連接查詢關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL等值與非等值連接查詢 連接查詢中用來(lái)連接兩個(gè)表的條件稱為連接條件或連接謂詞。其一般格式為: . . 其中比較運(yùn)算符主要有:=、=、=、!=、!= 此外連接謂詞詞還可以使用下面形式:. BETWEEN . AND . 當(dāng)連接運(yùn)算符為=號(hào)時(shí),稱為。其它稱為。 連接謂詞中的列名稱為。連接條件中的各連

46、接字段類型必須時(shí)可比的,但不必是相同的。 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQLDBMS執(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中的全部元組都處理完畢為止。 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL例32 查詢每個(gè)學(xué)生及其選修課程的情況學(xué)生情況存放在Student表中,學(xué)生選課情況存放在SC表中,所以本查詢實(shí)際上同時(shí)涉及S

47、tudent與SC兩個(gè)表中的數(shù)據(jù)。這兩個(gè)表之間的聯(lián)系是通過(guò)兩個(gè)表都具有的屬性Sno實(shí)現(xiàn)的。要查詢學(xué)生及其選修課程的情況,就必須將這兩個(gè)表中學(xué)號(hào)相同的元組連接起來(lái)。這是一個(gè)等值連接。完成本查詢的SQL語(yǔ)句為: SELECT Student.*, SC.* FROM Student, SC WHERE Student.Sno=SC.Sno; 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL廣義笛卡兒積是不帶連接謂詞的連接。兩個(gè)表的廣義笛卡兒積即是兩表中元組的交叉乘積,連接結(jié)果會(huì)產(chǎn)生一些沒(méi)有意義的元組,所以這種運(yùn)算沒(méi)有什么意義。 若在等值連接中把目標(biāo)列中重復(fù)的屬性列去掉則為自然連接。 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL例33自然連接

48、Student和SC表SELECT Student.Sno, Sname, Ssex, Sage, Sdept, Cno, GradeFROM Student, SCWHERE Student.Sno=SC.Sno;在本查詢中,由于Sname、 Ssex、 Sage、Sdept、Cno和Grade屬性列在Student與SC表中是唯一的,因此引用時(shí)可以去掉表名前綴。而Sno在兩個(gè)表都出現(xiàn)了,因此引用時(shí)必須加上表名前綴。該查詢的執(zhí)行結(jié)果不再出現(xiàn)SC.Sno列。關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL自身連接 連接操作不僅可以在兩個(gè)表之間進(jìn)行,也可以是一個(gè)表與其自己進(jìn)行連接,稱為表的自然連接。 例34:查詢每一門

49、課程的間接先行課。 SELECT FIRST.CNO,SECOND.CPNO FROM COURSE FIRST,COURSE SECOND WHERE FIRST.CPNO=SECOND.CNO; 參見(jiàn)page104為清楚起見(jiàn),我們可以為為清楚起見(jiàn),我們可以為Course表取兩個(gè)別名,表取兩個(gè)別名,一個(gè)是一個(gè)是FIRST,另一個(gè)是另一個(gè)是SECOND,也可以在考也可以在考慮問(wèn)題時(shí)就把慮問(wèn)題時(shí)就把Course表想成是兩個(gè)完全一樣表,表想成是兩個(gè)完全一樣表,一個(gè)是一個(gè)是FIRST表,另一個(gè)是表,另一個(gè)是SECOND表。表。 結(jié)果表如下:結(jié)果表如下: Cno Pcno - - 1 7 3 5 5

50、6 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL結(jié)合連接查詢的執(zhí)行過(guò)程詳細(xì)說(shuō)明該語(yǔ)句的執(zhí)行順序。 例:對(duì)于PC表(PC,HD)分別為PC的型號(hào)和硬盤,查詢?cè)趦煞N或兩種以上PC機(jī)上出現(xiàn)的硬盤。 SELECT DISTINCT HD FROM PC PC1,PC PC2 WHERE PC1.PCPC2.PC AND PC1.HD=PC2.HD 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL外連接 什么時(shí)候需要外連接? 在通常的連接操作中,只有滿足連接條件的元組才能作為結(jié)果輸出。有時(shí)不能滿足我們的要求。例如以STUDENT表為主體列出每個(gè)學(xué)生的基本情況及其選課情況,若某個(gè)學(xué)生沒(méi)有選課,只輸出其基本情況信息,其選課信息為空值即可,這就需要外連

51、接, 外連接的表示方法為 在連接謂詞的某一邊加符號(hào)*。外連接就好像是為符號(hào)*所在邊的表增加一個(gè)“萬(wàn)能”的行,這個(gè)行全部由空值組成。它可以和另一邊的表中所有不滿足連接條件的元組進(jìn)行連接。 SELECT Student.Sno,sname,ssex,sage,sdept,cno,grade FROM STUDENT,SC WHERE STUDENT.SNO=SC.SNO(*); 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQLStudent.Sno Sname Ssex Sage Sdept Cno Grade- - - - - - - 95002 劉晨 女 19 IS 3 80 95003 王名 女 18 MA 950

52、04 張立 男 18 IS 上例中外連接符*出現(xiàn)在連接運(yùn)算符的右邊,所以也稱其為右外連接。相應(yīng)地,如果外連接符出現(xiàn)在連接運(yùn)算符的左邊,則稱為左外連接。 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL復(fù)合條件連接 連接操作除了可以是兩表連接,一個(gè)表與其自身連接外,還可以是兩個(gè)以上的表進(jìn)行連接,后者通常稱為多表連接。 例35:查詢每個(gè)學(xué)生的學(xué)號(hào)、姓名、選修的課程名及成績(jī)。 SELECT Student.Sno, Sname, Course.Cname, SC.Grade FROM Student, SC, Course WHERE Student.Sno=SC.Sno and SC.Cno=Course.Cno; 關(guān)系

53、數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL例35查詢選修2號(hào)課程且成績(jī)?cè)?0分以上的所有學(xué)生 SELECT Student.Sno, Sname FROM Student, SC WHERE Student.Sno=SC.Sno AND SC.Cno=2 AND SC.Grade90; 連接操作除了可以是兩表連接,一個(gè)表與其自身連接外,還可以是兩個(gè)以上的表進(jìn)行連接,后者通常稱為多表連接。關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL嵌套查詢 在SQL語(yǔ)言中,一個(gè)SELECT-FROM-WHERE語(yǔ)句稱為一個(gè)查詢塊。將一個(gè)查詢塊嵌套在另一個(gè)查詢塊的WHERE子句或HAVING短語(yǔ)的條件中的查詢稱為嵌套查詢或子查詢。例如: SELECT S

54、name FROM StudentWHERE Sno IN SELECT Sno FROM SC WHERE Cno=2;在這個(gè)例子中,下層查詢塊 SELECT Sno FROM SC WHERE Cno=2是嵌套在上層查詢塊 SELECT Sname FROM Student WHERE Sno IN 的WHERE條件中的。 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL說(shuō)明上層的查詢塊又稱為外層查詢或父查詢或主查詢,下層查詢塊又稱為內(nèi)層查詢或子查詢。SQL語(yǔ)言允許多層嵌套查詢。即一個(gè)子查詢中還可以嵌套其它子查詢。需要特別指出的是,子查詢的SELECT語(yǔ)句中不能使用ORDER BY子句,ORDER BY子句永遠(yuǎn)只

55、能對(duì)最終查詢結(jié)果排序。關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL說(shuō)明嵌套查詢的求解方法是由里向外處理。即每個(gè)子查詢?cè)谄渖弦患?jí)查詢處理之前求解,子查詢的結(jié)果用于建立其父查詢的查找條件。 嵌套查詢使得可以用一系列簡(jiǎn)單查詢構(gòu)成復(fù)雜的查詢,從而明顯地增強(qiáng)了SQL的查詢能力。以層層嵌套的方式來(lái)構(gòu)造程序正是 SQL(Structurred Query Language)中“結(jié)構(gòu)化”的含義所在。關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL分步完成查詢例37 查詢與“劉晨”在同一個(gè)系學(xué)習(xí)的學(xué)生查詢與“劉晨”在同一個(gè)系學(xué)習(xí)的學(xué)生,可以首先確定“劉晨”所在系名,然后再查找所有在該系學(xué)習(xí)的學(xué)生。所以可以分步來(lái)完成此查詢: 第步,確定“劉晨”所在系名 S

56、ELECT Sdept FROM StudentWHERE Sname=劉晨; 結(jié)果為: Sdept - IS 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL分步完成查詢第步,查找所有在IS系學(xué)習(xí)的學(xué)生。SELECT Sno, Sname, Sdept FROM Student WHERE Sdept=IS; 結(jié)果為: Sno Sname Sdept - - - 95001 劉晨 IS 95004 張立 IS 分步寫(xiě)查詢畢竟比較麻煩,上述查詢實(shí)際上可以用子查詢來(lái)實(shí)現(xiàn),即將第一步查詢嵌入到第二步查詢中,用以構(gòu)造第二步查詢的條件。關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL嵌套查詢SQL語(yǔ)句如下: SELECT Sno, Sname, S

57、deptFROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname=劉晨); 本例中的查詢也可以用我們前面學(xué)過(guò)的表的自身連接查詢來(lái)完成:SELECT Sno, Sname, Sdept FROM Student S1, Student S2 WHERE S1.Sdept = S2.Sdept AND S2.Sname=劉晨; 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL嵌套與連接的方法對(duì)比可見(jiàn),實(shí)現(xiàn)同一個(gè)查詢可以多種方法,當(dāng)然不同的方法其執(zhí)行效率可能會(huì)有差別,甚至?xí)顒e很大。 例38 查詢選修了課程名為信息系統(tǒng)的學(xué)生學(xué)號(hào)和姓名 SELECT

58、 Sno, Sname FROM Student WHERE Sno IN (SELECT Sno FROM SC WHERE Cno IN ( SELECT Cno FROM Course WHERE Cname=信息系統(tǒng));結(jié)果為結(jié)果為: Sno Sname - - 95001 李勇李勇 95002 劉晨劉晨 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL嵌套與連接的方法對(duì)比本查詢同樣可以用連接查詢實(shí)現(xiàn):SELECT Sno, SnameFROM Student, SC, Course WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno AND Course.Cname

59、=信息系統(tǒng); 例37和例38中的各個(gè)子查詢都只執(zhí)行一次,其結(jié)果用于父查詢,子查詢的查詢條件不依賴于父查詢,這類子查詢稱為不相關(guān)子查詢。不相關(guān)子查詢是最簡(jiǎn)單的一類子查詢。 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL帶有比較運(yùn)算符的子查詢 帶有比較運(yùn)算符的子查詢是指父查詢與子查詢之間用比較運(yùn)算符進(jìn)行連接。當(dāng)用戶能確切知道內(nèi)層查詢返回的是單值時(shí),可以用、 =、=、!=或等比較運(yùn)算符。 在例37中,由于一個(gè)學(xué)生只可能在一個(gè)系學(xué)習(xí),也就是說(shuō)內(nèi)查詢劉晨所在系的結(jié)果是一個(gè)唯一值,因此該查詢也可以用比較運(yùn)算符來(lái)實(shí)現(xiàn),其SQL語(yǔ)句如下: SELECT Sno, Sname, Sdept FROM Student WHERE Sd

60、ept = (SELECT Sdept FROM Student WHERE Sname=劉晨;) 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL需要注意的是,子查詢一定要跟在比較符之后,下列寫(xiě)法是錯(cuò)誤的:SELECT Sno, Sname, Sdept FROM Student WHERE (SELECT Sdept FROM Student WHERE Sname=劉晨) = Sdept; 關(guān)系數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)語(yǔ)言SQL例38中信息系統(tǒng)的課程號(hào)是唯一的,但選修該課程的學(xué)生并不只一個(gè),所以例38也可以用=運(yùn)算符和IN謂詞共同完成: SELECT Sno, Sname FROM StudentWHERE Sno IN (

溫馨提示

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