《數(shù)據(jù)庫技術(shù)及應(yīng)用》第九章 數(shù)據(jù)查詢_第1頁
《數(shù)據(jù)庫技術(shù)及應(yīng)用》第九章 數(shù)據(jù)查詢_第2頁
《數(shù)據(jù)庫技術(shù)及應(yīng)用》第九章 數(shù)據(jù)查詢_第3頁
《數(shù)據(jù)庫技術(shù)及應(yīng)用》第九章 數(shù)據(jù)查詢_第4頁
《數(shù)據(jù)庫技術(shù)及應(yīng)用》第九章 數(shù)據(jù)查詢_第5頁
已閱讀5頁,還剩71頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第九章數(shù)據(jù)查詢學(xué)習(xí)目標(biāo):掌握關(guān)系代數(shù)中的并、交、差、笛卡兒積運(yùn)算掌握關(guān)系代數(shù)中的選擇、投影、連接、除運(yùn)算掌握SELECT查詢掌握聚合函數(shù)進(jìn)行查詢統(tǒng)計掌握多表連接查詢掌握嵌套查詢理解聯(lián)合查詢9.1關(guān)系代數(shù)

關(guān)系數(shù)據(jù)庫系統(tǒng)是支持關(guān)系模型的數(shù)據(jù)庫系統(tǒng)。關(guān)系數(shù)據(jù)模型的理論基礎(chǔ)是集合論與關(guān)系代數(shù),這些數(shù)學(xué)理論的研究為關(guān)系數(shù)據(jù)庫技術(shù)的發(fā)展奠定了堅實(shí)的基礎(chǔ)。關(guān)系數(shù)據(jù)語言包括以下3類:

①關(guān)系代數(shù)語言。

②關(guān)系演算語言(元組關(guān)系演算語言、域關(guān)系演算語言)。

③具有關(guān)系代數(shù)和關(guān)系演算雙重特點(diǎn)的語言,如SQL。這些關(guān)系數(shù)據(jù)語言的共同特點(diǎn)是語言具有完備的表達(dá)能力,是非過程化的集合操作語言,功能強(qiáng),能夠嵌入高級語言中使用。9.1.1關(guān)系操作 關(guān)系模型給出了關(guān)系操作的能力的說明,但不對關(guān)系數(shù)據(jù)庫管理系統(tǒng)語言給出具體的語法要求,也就是說不同的關(guān)系數(shù)據(jù)庫管理系統(tǒng)可以定義和開發(fā)不同的語言來實(shí)現(xiàn)這些操作。 常用的關(guān)系操作包括查詢(QUERY)操作和插入(INSERT)、刪除(DELETE)、修改(UPDATE)操作兩大部分。 關(guān)系的查詢表達(dá)能力很強(qiáng),是關(guān)系操作中最主要的部分。查詢操作又可分為選擇(Select)、投影(Project)、連接(Join)、除(Divide)、并(Union)、差(Except)、交(Intersection)、笛卡兒積等。其中,選擇、投影、并、差、笛卡兒積是5種基本操作,其他操作可以用基本操作來定義和導(dǎo)出,就像乘法可以用加法來定義和導(dǎo)出一樣。關(guān)系操作

關(guān)系操作的特點(diǎn)是集合操作方式,即操作的對象和結(jié)果都是集合。這種操作方式也稱為一次一集合(set-at-a-time)方式。相應(yīng)地,非關(guān)系數(shù)據(jù)模型的數(shù)據(jù)操作方式則為一次一記錄(record-at-a-time)方式。 關(guān)系代數(shù)、元組關(guān)系演算和域關(guān)系演算均是抽象的查詢語言,這些抽象的語言與具體的關(guān)系數(shù)據(jù)庫管理系統(tǒng)中實(shí)現(xiàn)的實(shí)際語言并不完全一樣。但它們能用作評估實(shí)際系統(tǒng)中查詢語言能力的標(biāo)準(zhǔn)或基礎(chǔ)。 SQL不僅具有豐富的查詢功能,而且具有數(shù)據(jù)定義和數(shù)據(jù)控制功能,是集查詢、數(shù)據(jù)定義語言、數(shù)據(jù)操縱語言和數(shù)據(jù)控制語言(DataControlLanguage,DCL)于一體的關(guān)系數(shù)據(jù)語言。SQL充分體現(xiàn)了關(guān)系數(shù)據(jù)語言的特點(diǎn)和優(yōu)點(diǎn),是關(guān)系數(shù)據(jù)庫的標(biāo)準(zhǔn)語言。9.1.2關(guān)系代數(shù)

關(guān)系代數(shù)是一種抽象的查詢語言,是關(guān)系數(shù)據(jù)操縱語言的一種傳統(tǒng)表達(dá)方式,它是用對關(guān)系的運(yùn)算來表達(dá)查詢的。

任何一種運(yùn)算都是將一定的運(yùn)算符作用于一定的運(yùn)算對象上,得到預(yù)期的運(yùn)算結(jié)果。所以運(yùn)算對象、運(yùn)算符、運(yùn)算結(jié)果是運(yùn)算的三大要素。

關(guān)系代數(shù)的運(yùn)算對象是關(guān)系,運(yùn)算結(jié)果亦為關(guān)系。關(guān)系代數(shù)用到的運(yùn)算符包括4類,即集合運(yùn)算符、專門的關(guān)系運(yùn)算符、算術(shù)比較符和邏輯運(yùn)算符,見表9.1。關(guān)系代數(shù)

關(guān)系代數(shù)的運(yùn)算按運(yùn)算符的不同可分為傳統(tǒng)的集合運(yùn)算和專門的關(guān)系運(yùn)算兩大類。傳統(tǒng)的集合運(yùn)算將關(guān)系看成元組的集合,其運(yùn)算是從關(guān)系的“水平”方向即行的角度來進(jìn)行。專門的關(guān)系運(yùn)算不僅涉及行而且涉及列。比較運(yùn)算符和邏輯運(yùn)算符是用來輔助專門的關(guān)系運(yùn)算符進(jìn)行操作的。9.1.3傳統(tǒng)的集合運(yùn)算

傳統(tǒng)的集合運(yùn)算是二目運(yùn)算,包括并、差、交、廣義笛卡兒積4種運(yùn)算。設(shè)關(guān)系R和關(guān)系S具有相同的目n(即n個屬性),且相應(yīng)的屬性取自同一個域,則可定義并、差、交運(yùn)算如下: (1)并(Union) 關(guān)系R與關(guān)系S的并記作: R∪S={t|t∈R∨t∈S} 它是由關(guān)系R中的元素和關(guān)系S中的元素共同組成的集合,其結(jié)果仍是n目關(guān)系。

傳統(tǒng)的集合運(yùn)算

(2)差(Difference) 關(guān)系R與關(guān)系S的差記作:

R-S={t|t∈R∧t?S}

它是由只在關(guān)系R中出現(xiàn)、不在關(guān)系S中出現(xiàn)的元素組成的集合,其結(jié)果仍是n目關(guān)系。 (3)交 關(guān)系R與關(guān)系S的交記作: R∩S={t|t∈R∧t∈S} 它是由既出現(xiàn)在關(guān)系R中又出現(xiàn)在關(guān)系S中的元素組成的集合,其結(jié)果仍是n目關(guān)系。交可以用差來表示R∩S=R-(R-S)。傳統(tǒng)的集合運(yùn)算 (4)廣義笛卡兒積 兩個分別為n目和m目的關(guān)系R和關(guān)系S的廣義笛卡兒積,是一個(m+n)列的元組的集合。元組的前n列是關(guān)系R的一個元組,后m列是關(guān)系S的一個元組。若R有k1個元組,S有k2個元組,那么關(guān)系R與S的廣義笛卡兒積有k1×k2個元組,記作:

其結(jié)果是m+n目關(guān)系。當(dāng)結(jié)果中出現(xiàn)同名屬性時,以“關(guān)系名.屬性”表示。傳統(tǒng)的集合運(yùn)算 【例9.1】圖9.1(a)、(b)分別為具有3個屬性列的關(guān)系R、關(guān)系S。圖9.1(c)為關(guān)系R與關(guān)系S的并。圖9.1(d)為關(guān)系R與關(guān)系S的交。圖9.1(e)為關(guān)系R和關(guān)系S的差。圖9.1(f)為關(guān)系R和關(guān)系S的廣義笛卡兒積。傳統(tǒng)的集合運(yùn)算 集合運(yùn)算符主要研究的是元組,即對表中的行進(jìn)行研究和操作。9.1.4專門的關(guān)系運(yùn)算符

(1)幾個記號 專門的關(guān)系運(yùn)算符包括選擇、投影、連接、除等。為敘述上的方便,先引入幾個記號:

【例9.2】設(shè)有關(guān)系R,如圖9.2所示。 關(guān)系R(學(xué)號,姓名,年齡)中,t[年齡2]=22。幾個記號(2)專門的關(guān)系運(yùn)算 下面給出這些關(guān)系運(yùn)算的定義:專門的關(guān)系運(yùn)算 設(shè)有一個學(xué)生-課程數(shù)據(jù)庫,包括: 學(xué)生students(學(xué)號,姓名,性別,電話,所在學(xué)院), 課程關(guān)系course(課程號,課程名,先行課,學(xué)分), 學(xué)生選課關(guān)系score(學(xué)號,課程號,成績,狀態(tài)), 下面將用例子對這3個關(guān)系進(jìn)行運(yùn)算。 首先畫出上面數(shù)據(jù)庫的E-R圖,如圖9.3所示。專門的關(guān)系運(yùn)算專門的關(guān)系運(yùn)算 【例9.3】查詢計算機(jī)學(xué)院的學(xué)生。其中下角標(biāo)“5”為所在學(xué)院的屬性序號。其結(jié)果如圖9.5(a)所示。專門的關(guān)系運(yùn)算 【例9.4】查詢計算機(jī)學(xué)院的女生。

其結(jié)果如圖9.5(b)所示。

選擇運(yùn)算實(shí)際上是從關(guān)系R中選取使邏輯表達(dá)式成為真的元組。這是從行的角度進(jìn)行的運(yùn)算。專門的關(guān)系運(yùn)算 2)投影(Projection) 關(guān)系R上的投影是從R中選擇若干屬性列組成新的關(guān)系,記作: 其中A為R中的屬性列。A中的屬性不可重復(fù)。 【例9.5】查詢學(xué)生的姓名和電話號碼,即求關(guān)系students在學(xué)生姓名和電話號碼上的投影。

其結(jié)果如圖9.6(a)所示。專門的關(guān)系運(yùn)算 【例9.6】查詢學(xué)生的成績。 其結(jié)果如圖9.6(b)所示。 【例9.7】查詢學(xué)習(xí)課程號為C002的學(xué)生學(xué)號與成績。 其結(jié)果如圖9.6(c)所示。 【例9.8】查詢選修課程號為C002或C003的學(xué)生學(xué)號。 其結(jié)果如圖9.6(d)所示。專門的關(guān)系運(yùn)算

投影操作是從列的角度進(jìn)行的運(yùn)算。專門的關(guān)系運(yùn)算

3)連接(Join) 連接也稱為θ連接。它是從兩個關(guān)系的笛卡兒積中選取屬性間的滿足一定條件的元組,記作:

其中A和B分別為R和S上度數(shù)相同且可比的屬性組。θ是比較運(yùn)算符。連接運(yùn)算從R和S的廣義笛卡兒積R×S中選取(R關(guān)系)在A屬性組上的值與(S關(guān)系)在B屬性組上的值滿足比較關(guān)系θ的元組。連接運(yùn)算中有兩種最為重要也最為常用的連接,一種是等值連接(Equal-Join),一種是自然連接(Natural-Join)。專門的關(guān)系運(yùn)算

①等值連接:θ為“=”的連接運(yùn)算稱為等值連接。它是從R與S的廣義笛卡兒積中選取A、B屬性值相等的那些元組,即等值連接為:

②自然連接:自然連接是一種特殊的等值連接,要求兩個關(guān)系中進(jìn)行比較的分量必須是相同的屬性組,并且在結(jié)果中把重復(fù)的屬性列去掉。即若R和S具有相同的屬性組B,則自然連接可記作:

一般的連接從行的角度,自然連接要取消重復(fù)列,是從行和列的角度進(jìn)行運(yùn)算。專門的關(guān)系運(yùn)算專門的關(guān)系運(yùn)算專門的關(guān)系運(yùn)算 4)除(Division) 給定關(guān)系R(X,Y)和S(Y,Z),其中X,Y,Z為屬性組。R中的Y與S中的Y可以有不同的屬性名,但必須出自相同的域集。R與S的除運(yùn)算得到一個新的關(guān)系P(X),P是R中滿足下列條件的元組在X屬性列上的投影:元組在X上分量值x的象集Yx包含S在Y上投影的集合。記作: 除操作是同時從行和列角度進(jìn)行運(yùn)算。專門的關(guān)系運(yùn)算

【例9.11】關(guān)系R和關(guān)系S如圖9.9(a)和(b)所示,求R÷S。

第一步:找出關(guān)系R和關(guān)系S中相同的屬性,即C、D屬性。在關(guān)系S中對C、D做投影T(即取出C、D列),如圖9.9(c)所示。 第二步:在被除關(guān)系R與關(guān)系S中不相同的屬性是C、D,關(guān)系R在屬性X上做取消重復(fù)值的投影為X,如圖9.9(d)所示。

專門的關(guān)系運(yùn)算

第三步:求關(guān)系R中X屬性對應(yīng)的像集C、D,如圖9.9(e)、(f)所示。

第四步:判斷包含關(guān)系R÷S其實(shí)就是判斷關(guān)系R中X各個值的象集C、D的所有值。對比即可發(fā)現(xiàn),a和b的象集包含了關(guān)系S中屬性C、D(T)的所有值,而c和a只包含了其中一個,所以排除c和a構(gòu)成的集合,如圖9.9(g)所示。專門的關(guān)系運(yùn)算

【例9.12】查詢至少選修C001號課程和C003號課程的學(xué)生學(xué)號。

首先建立一個臨時關(guān)系K:

然后求: 結(jié)果為:{169001409} 【例9.13】查詢學(xué)習(xí)課程號為C002的學(xué)生學(xué)號與姓名。 此查詢涉及students和score,可先進(jìn)行自然連接,然后再執(zhí)行選擇投影操作:專門的關(guān)系運(yùn)算

后一個表達(dá)式自然連接的右分量為“學(xué)了C002課的學(xué)生學(xué)號的集合”,因此比前一個表達(dá)式更加優(yōu)化,執(zhí)行起來更省時間、省空間。 【例9.14】查詢選修課程名為“數(shù)據(jù)結(jié)構(gòu)”的學(xué)生學(xué)號與姓名。

【例9.15】查詢至少選修課程號為C002或C004的學(xué)生學(xué)號。專門的關(guān)系運(yùn)算

【例9.16】查詢至少選修了一門其直接先行課為C006號課程的學(xué)生姓名。

分解:先查詢先行課為C006號課程的課程,然后再查詢選修的學(xué)生。

【例9.17】查詢選修全部課程的學(xué)生學(xué)號和姓名。9.2SQL通用查詢

9.2.1SELECT語法結(jié)構(gòu)

MySQL中,SELECT語句的基本語法格式如下:

“[]”表示可選項(xiàng);“SELECT子句”指定要查詢的列名稱,列與列之間用逗號隔開;“FROM子句”指定要查詢的表,可以指定兩個以上的表,表與表之間用逗號隔開;“WHERE子句”指定要查詢的條件,后面跟“條件表達(dá)式”;“GROUPBY”子句用于對查詢結(jié)構(gòu)進(jìn)行分組,后面跟“屬性名”指定分組的依據(jù);“HAVING子句”指定分組的條件,通常在GROUPBY子句之后;“ORDERBY子句”用于對查詢結(jié)果進(jìn)行排序,后面跟“屬性名”指定排序的依據(jù);“LIMIT子句”限制查詢的輸出結(jié)果行。SELECT語法結(jié)構(gòu)

【例9.18】查詢學(xué)生的學(xué)號、姓名和聯(lián)系電話,SQL語句如下:

運(yùn)行結(jié)果如圖9.10所示。9.2.2SELECT語法結(jié)構(gòu)的基本子句

(1)SELECT子句SELECT子句用于指定要返回的列,SELECT常用參數(shù)見表9.2。SELECT語法結(jié)構(gòu)的基本子句

1)使用通配符“?”查詢所有字段

通配符“?”表示所有字段,這樣就不用列出表中的所有字段了。但是,在使用這種方式查詢時,只能按照表中的字段順序進(jìn)行排列,不能改變字段的排列順序。其語法的基本形式為:

SELECT?FROM表名;

下面是用SELECT語句來查詢表中所有數(shù)據(jù)的例子。 【例9.19】查詢學(xué)生的所有記錄。

其運(yùn)行結(jié)果,如圖9.11所示。SELECT語法結(jié)構(gòu)的基本子句

運(yùn)行結(jié)果如圖9.10所示。SELECT語法結(jié)構(gòu)的基本子句

2)使用DISTINCT消除重復(fù)行 如果表中的某些字段上沒有唯一性約束,這些字段可能存在重復(fù)的值,在SELECT語句中就可以使用DISTINCT關(guān)鍵字來消除重復(fù)的記錄。其語法的基本形式為: SELECTDISTINCT屬性名FROM表名; 其中,“屬性名”表示要消除重復(fù)記錄的字段的名字。下面是使用distinct關(guān)鍵字來消除系部重復(fù)記錄的例子。 【例9.20】查詢學(xué)生所在的系部,去掉重復(fù)值。SELECT語法結(jié)構(gòu)的基本子句

3)使用AS定義查詢列的別名 當(dāng)查詢數(shù)據(jù)時,MySQL會顯示每個輸出列的名字,默認(rèn)情況下,顯示的列名是創(chuàng)建表時定義的列名。有時為了讓顯示結(jié)果更加直觀,可以用AS來定義查詢列的別名。 AS不是給表里的字段取別名,而是給查詢的結(jié)果字段取別名。其目的是讓查詢的結(jié)果展現(xiàn)出更符合人們觀看的習(xí)慣,在多張表查詢時可以直接區(qū)別多張表的同名的字段。為查詢結(jié)果取別名的基本形式如下: 屬性名[AS]別名; 其中,屬性名為字段原來的名稱,別名參數(shù)為字段新的名字,AS關(guān)鍵字可有可無,實(shí)現(xiàn)的作用都一樣。SELECT語法結(jié)構(gòu)的基本子句

【例9.21】統(tǒng)計男生的學(xué)生人數(shù)。

其運(yùn)行結(jié)果,如圖9.13所示。

(2)FROM子句SELECT的查詢對象(數(shù)據(jù)源)由FROM子句指定。FROM子句指定進(jìn)行查詢的單個表或者多個表、視圖。其語法結(jié)構(gòu)如下: FROM{表名|視圖}【,…,n】//當(dāng)有多個表時,表與表之間用“,”分隔

SELECT語法結(jié)構(gòu)的基本子句

【例9.22】查詢男生基本情況。

其運(yùn)行結(jié)果,如圖9.14所示。SELECT語法結(jié)構(gòu)的基本子句

(3)WHERE子句 WHERE子句指定查詢的條件,限制返回的數(shù)據(jù)行。WHERE子句必須緊跟FROM子句之后,在WHERE子句中,使用一個條件從FROM子句的中間結(jié)果中選取行。 WHERE子句語法格式如下: WHEREwhere_definition;其中,where_definition為查詢條件。 WHERE子句用于指定條件,過濾不符合條件的數(shù)據(jù)記錄??梢允褂玫臈l件包括比較運(yùn)算、邏輯運(yùn)算、范圍、模糊匹配以及未知值等。SELECT語法結(jié)構(gòu)的基本子句

【例9.23】查詢出生日期在1998年5月到1999年5月出生的學(xué)生。

其運(yùn)行結(jié)果,如圖9.15所示。SELECT語法結(jié)構(gòu)的基本子句

【例9.24】查詢院系編號為d001或d002的學(xué)生。

其運(yùn)行結(jié)果,如圖9.16所示。SELECT語法結(jié)構(gòu)的基本子句

(4)GROUPBY子句 GROUPBY子句主要根據(jù)字段對行分組統(tǒng)計,因此會同類匯總成為一行。 GROUPBY子句的語法格式如下: GROUPBY{字段名|表達(dá)式|正整數(shù)}【ASC|DESC】,…,【W(wǎng)ITHROLLUP】; 其中,GROUPBY子句后通常包含列名或表達(dá)式。也可以用正整數(shù)表示列,如指定3,則表示按第3列分組;ASC為升序,DESC為降序,系統(tǒng)默認(rèn)為ASC;GROUPBY子句通常與聚合函數(shù)(COUNT()、SUM()、AVG()、MAX()和MIN())一起使用。SELECT語法結(jié)構(gòu)的基本子句

【例9.25】求選修的各門課程的平均成績和選修該課程的人數(shù)。

其運(yùn)行結(jié)果,如圖9.17所示。SELECT語法結(jié)構(gòu)的基本子句

(5)ORDERBY子句

使用ORDERBY子句后,可以保證結(jié)果中的行按一定順序排列。

ORDERBY子句語法格式如下: ORDERBY{列|表達(dá)式|正整數(shù)}【ASC|DESC】,… 其中,ORDERBY子句后可以是一個列、一個表達(dá)式,也可以用正整數(shù)表示列;關(guān)鍵字ASC表示升序排列,DESC表示降序排列,系統(tǒng)默認(rèn)值為ASC;指定要排序的列可以是多列。如果是多列,系統(tǒng)先按照第一列排序,當(dāng)該列出現(xiàn)重復(fù)值時,按第二列排序,以此類推。SELECT語法結(jié)構(gòu)的基本子句

【例9.26】按成績降序排序列出選修a001課程的學(xué)生學(xué)號和成績。

其運(yùn)行結(jié)果,如圖9.18所示。SELECT語法結(jié)構(gòu)的基本子句

(6)HAVING子句

使用HAVING子句的目的與WHERE子句類似,不同的是,WHERE子句是用來在FROM子句之后選擇行,而HAVING子句用來在GROUPBY子句后選擇行。其語法格式如同WHERE。 【例9.27】選修了1門以上課程的學(xué)生學(xué)號。

其運(yùn)行結(jié)果,如圖9.19所示。SELECT語法結(jié)構(gòu)的基本子句

【例9.28】查找講授了2門課程的老師。

其運(yùn)行結(jié)果,如圖9.20所示。SELECT語法結(jié)構(gòu)的基本子句

(7)認(rèn)識LIMIT子句

LIMIT子句主要用于限制被SELECT語句返回的行數(shù)。LIMIT子句語法結(jié)構(gòu)如下: LIMIT{【偏移量,】行數(shù)|行數(shù)offset偏移量}; 【例9.29】查詢課程號為‘A001’成績前五名的學(xué)生號和成績。

其運(yùn)行結(jié)果如圖9.21所示。9.2.3使用聚合函數(shù)進(jìn)行查詢統(tǒng)計

常用的聚合函數(shù)見表9.3。

其中,DISTINCT去掉列中的重復(fù)值,ALL計算所有列值;COUNT(?)計算所有記錄的數(shù)量。而CONUT(列名)則只計算列的數(shù)量,不計該列中的空值;AVG、MAX、MIN和SUM函數(shù)也不計空的列值。使用聚合函數(shù)進(jìn)行查詢統(tǒng)計

【例9.30】求課程為A001的最高分、最低分。

其運(yùn)行結(jié)果如圖9.22所示。9.2.4多表連接查詢

(1)全連接

多表查詢的語法結(jié)構(gòu)如下: SELECT表名.列名【,…,n】FROM表1,表2【,…,n】WHERE{連接條件}[AND|OR查詢條件]。 【例9.31】查找jxgl數(shù)據(jù)庫中所有學(xué)生選過的課程名和課程號,使用如下語句:

其運(yùn)行結(jié)果如圖9.23所示。多表連接查詢

(2)JOIN連接

SELECT表名.列名[,…,n]

FROM{表1[連接方式]JOIN表2{ON連接條件|USING(字段)}}

WHERE查詢條件; 其中,連接方式包括INNER,LEFTOUTER,RIGHTOUTER,CROSSJOIN;MySQL默認(rèn)的JOIN連接是INNERJOIN,INNER可以省略;USING:用于自然連接,用兩個表的公共字段進(jìn)行連接。多表連接查詢

(3)內(nèi)連接(INNERJOIN)

【例9.32】查找上課老師姓名及其所教課程名。

其運(yùn)行結(jié)果如圖9.24所示。多表連接查詢

(4)外連接(OUTERJOIN)

外連接分為左外連接(LEFTOUTERJOIN)和右外連接(RIGHTOUTERJOIN)。

左外連接是指返回連接查詢的表中匹配的行和所有來自左表不符合指定條件的行,以左表為準(zhǔn),左表的記錄將會全部表示出來,而右表只會顯示符合搜索條件的記錄。

右外連接是指返回連接查詢的表中匹配的行和所有來自右表不符合指定條件的行,以右表為準(zhǔn),右表的記錄將會全部表示出來,而左表只會顯示符合搜索條件的記錄。多表連接查詢

【例9.33】查詢所有學(xué)生的姓名以及所學(xué)課程的名稱與成績。

其運(yùn)行結(jié)果如圖9.25所示。9.2.5嵌套查詢

嵌套查詢通常是指在一個SELECT語句的WHERE或HAVING語句中,又嵌套有另一個SELECT語句,使用子查詢的結(jié)果作為條件的一部分。在嵌套查詢中,上層的SELECT語句塊稱為父查詢或外層查詢,下層的SELECT語句塊稱為子查詢或內(nèi)層查詢。

SQL標(biāo)準(zhǔn)允許SELECT多層嵌套使用,用來表示復(fù)雜的查詢。子查詢可以使用在SELECT、INSERT、UPDATE或DELETE語句中。除嵌套在WHERE子句中外,子查詢還嵌套在SELECT子句、嵌套在FROM子句、HAVING子句中。

子查詢通常與IN、EXISTS謂詞及比較運(yùn)算符等操作符結(jié)合使用。根據(jù)子查詢的結(jié)果可以將子查詢分為4種類型:返回一個表的表子查詢;

嵌套查詢返回帶有一個或多個值的一行的行子查詢;返回一行或多行,每行只有一個值的列子查詢;只返回一個值的標(biāo)量子查詢。

標(biāo)量子查詢既是列子查詢也是行子查詢。

其中,子查詢需要用圓括號括起來;子查詢不支持ORDERBY子句,不支持LIMIT;子查詢結(jié)果值必須與WHERE子句要求的數(shù)據(jù)類型匹配,不能包含text或blob數(shù)據(jù)類型的字段;子查詢中也可以再包含子查詢,嵌套可以多至32層;子查詢在FROM子句中時,必須為其定義一個別名;SELECT關(guān)鍵字后面也可以定義子查詢;子查詢執(zhí)行效率并不理想,在一般情況下不推薦使用子查詢,建議多用連接查詢。嵌套查詢

(1)嵌套在WHERE子句中

這是子查詢的最常用形式,語法格式如下:

SELECTselect_list

FROMtbl_name

WHEREexpression=(subquery); (subquery)表示子查詢,該子查詢語句返回的是一個值,也就是列子查詢。其查詢語句將以子查詢的結(jié)果作為WHERE子句的條件進(jìn)行查詢。嵌套查詢

【例9.34】查詢信息學(xué)院的學(xué)生信息。

其運(yùn)行結(jié)果如圖9.26所示。

該子查詢是一個標(biāo)量子查詢,“=”號后只能跟標(biāo)量子查詢作條件值。

在執(zhí)行查詢時,先執(zhí)行內(nèi)層的子查詢,返回一個結(jié)果集(中間表),然后再以此值作為條件執(zhí)行外層的父查詢。嵌套查詢

嵌套在WHERE子句的查詢還有另一種形式:

SELECTselect_list

FROMtbl_name

WHEREexpressionIN[NOTIN](subquery);

子查詢語句返回的是一個范圍,即行子查詢,查詢語句將以子查詢的結(jié)果作為WHERE子句的條件進(jìn)行查詢。這種查詢也稱為IN子查詢。

如果在子查詢中使用比較運(yùn)算符(>、<、<>等)作為WHERE子句的關(guān)鍵詞,這樣的查詢也稱為比較子查詢。嵌套查詢

(2)嵌套在SELECT子句中把子查詢的結(jié)果放在SELECT子句后面作為查詢的一個列值,其值是唯一的。語法格式如下: SELECTselect_list,(subquery)FROMtbl_name; 【例9.35】從score表中查找所有學(xué)生的平均成績,以及與’169001404’號學(xué)生的平均成績差距

其運(yùn)行結(jié)果如圖9.27所示。嵌套查詢

(3)嵌套在FROM子句中

這種查詢通過子查詢執(zhí)行的結(jié)果來構(gòu)建一張新的表,用來作為主查詢的對象。其語法格式如下:

SELECTselect_list

FROM(subquery)ASname

WHEREexpression;嵌套查詢

【例9.36】從students表中查找成績在80~90分的學(xué)生。

其運(yùn)行結(jié)果如圖9.28所示。

FROM后面的子查詢得到的是一張?zhí)摂M表,要用AS子句定義一個表名稱。該句法非常強(qiáng)大,一般在一些復(fù)雜的查詢中用到。(4)IN子查詢

通過使用IN關(guān)鍵字可以把原表中目標(biāo)列的值和子查詢返回的結(jié)果集進(jìn)行比較,進(jìn)行一個給定值是否在子查詢結(jié)果集中的判斷,如果列值與子查詢的結(jié)果一致或存在與之匹配的數(shù)據(jù)行,則查詢結(jié)果包含該數(shù)據(jù)行。其語法格式如下:

SELECTselect_list

FROMtbl_name

WHEREexpressionIN[NOTIN](subquery);

當(dāng)表達(dá)式與子查詢的結(jié)果表中的某個值相等時,則返回TRUE,否則返回FALSE;若使用了NOT,則返回的值剛好相反。嵌套查詢

【例9.37】查找不及格的學(xué)生姓名,并按s_name降序排序

其運(yùn)行結(jié)果如圖9

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論