




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第8章高級查詢我們已經(jīng)初步了解了數(shù)據(jù)表的基礎(chǔ)查詢。但是,在實(shí)際的數(shù)據(jù)庫操作中,往往需要同時從來自兩個或兩個以上的表中查詢相關(guān)數(shù)據(jù),連接就是滿足這些需求的技術(shù)。本章將主要介紹子查詢、聯(lián)合語句、單表關(guān)聯(lián)語句及多表查詢的相關(guān)使用。第8章高級查詢我們已經(jīng)初步了解了數(shù)據(jù)表的基礎(chǔ)查詢。但是,18.1連接簡介上一章的查詢語句都只涉及一個表的數(shù)據(jù)。在很多情況下,需要查詢的數(shù)據(jù)往往涉及多個表,這時需要對多個表進(jìn)行連接查詢。通過連接,可以根據(jù)各個表之間的邏輯關(guān)系從兩個或多個表中檢索數(shù)據(jù)。如,既要查詢訂單的信息,又要查詢訂單所在城市的信息,這就涉及orders和customersnew兩個表。8.1連接簡介上一章的查詢語句都只涉及一個表的數(shù)據(jù)。在很28.1.1連接定義多表連接實(shí)際上就是實(shí)現(xiàn)如何使用一個表中的數(shù)據(jù)來選擇另一個表中的行。而連接條件則主要通過以下方法定義兩個表在查詢中的關(guān)聯(lián)方式:指定每個表中要用于連接的列,典型的連接條件是在一個表中指定外鍵,在另一個表中指定與其關(guān)聯(lián)的鍵。指定比較各列的值時要使用的邏輯運(yùn)算符(=、<>等)。在select語句中實(shí)現(xiàn)多表連接,并不是一個物理存在的實(shí)體。換句話說,它在數(shù)據(jù)表中并不存在,它只是由數(shù)據(jù)庫系統(tǒng)在需要時創(chuàng)建的,只在查詢、檢索數(shù)據(jù)期間有效。8.1.1連接定義多表連接實(shí)際上就是實(shí)現(xiàn)如何使用一個表中38.1.2連接的類型連接體現(xiàn)在where子句中指定的條件上,在條件中要指定兩個表通過哪些列進(jìn)行連接。一般情況下進(jìn)行連接查詢的兩個表是通過主鍵和外鍵進(jìn)行關(guān)聯(lián)的,所以最簡單的條件是一個表的外鍵與另一個表的主鍵相等。在SQL中,表的連接類型主要有下面幾種。內(nèi)部連接(innerjoin)外部連接(outer
join)交叉連接(cross
join)8.1.2連接的類型連接體現(xiàn)在where子句中指定的條件48.1.3簡單的多表查詢表的連接實(shí)現(xiàn)最簡單的方法就是在select語句的from子句中,羅列要連接的表即可。而要進(jìn)一步實(shí)現(xiàn)復(fù)雜的多表連接,則需要在from子句中使用join(innerjoin、outer
join、cross
join等)關(guān)鍵詞,以后的章節(jié)將詳細(xì)講解。8.1.3簡單的多表查詢表的連接實(shí)現(xiàn)最簡單的方法就是在s58.1.3簡單的多表查詢1.如何實(shí)現(xiàn)多表查詢實(shí)現(xiàn)多表查詢,可以在from子句中通過join關(guān)鍵詞連接需要查詢的表。而簡單的多表查詢,則可以不使用join關(guān)鍵詞,而直接列出所要連接的表,利用逗號把from子句后的表名隔開?!臼纠?-1】使用from子句直接實(shí)現(xiàn)product_information和categories兩個表的連接。8.1.3簡單的多表查詢1.如何實(shí)現(xiàn)多表查詢68.1.3簡單的多表查詢2.指定連接條件直接使用from子句連接表,返回的是兩個表的記錄的笛卡爾積,這在實(shí)際應(yīng)用中意義不大。在實(shí)際應(yīng)用中,通常需要連接的兩個表的記錄滿足一定的關(guān)系。這時,可以在select語句的where子句中指定連接條件。【示例8-2】使用where子句指定product_information和categories兩個表的連接條件。8.1.3簡單的多表查詢2.指定連接條件78.1.3簡單的多表查詢3.使用別名作為表名的簡寫在上面的示例中,select語句中有關(guān)列名均使用了“product_information.category_id”的完整表達(dá)式。在連接的兩個表中,如果不是相同的列名,可以省略表名;對于相同的列名,在使用時必須指明其對應(yīng)的表名。而使用表名比較繁瑣,我們可以為表定義別名?!臼纠?-3】使用別名簡化product_information和categories兩個表的連接。8.1.3簡單的多表查詢3.使用別名作為表名的簡寫88.1.3簡單的多表查詢4.自連接在查詢信息時,有時需要將表與其自身進(jìn)行連接,即自連接,這時就需要為表定義別名?!臼纠?-4】從customersnew表中查詢賒銷限額credit_limit比顧客編號839大的所有顧客信息。8.1.3簡單的多表查詢4.自連接98.2表的連接查詢在關(guān)系型數(shù)據(jù)庫中實(shí)現(xiàn)多表之間的聯(lián)系,我們引入了連接查詢,連接用于指定多數(shù)據(jù)源(表、視圖)之間如何組合,以形成最終的數(shù)據(jù)源。前面介紹的表的連接,是通過from子句列出所要連接的表,結(jié)合使用where子句列出連接條件來實(shí)現(xiàn)。本節(jié)將主要為大家介紹使用關(guān)鍵字join實(shí)現(xiàn)表的連接,主要包括自然連接、內(nèi)連接,外連接。使用join關(guān)鍵字有助于將連接操作與where的搜索條件分開。8.2表的連接查詢在關(guān)系型數(shù)據(jù)庫中實(shí)現(xiàn)多表之間的聯(lián)系,我108.2.1自然連接自然連接將兩個數(shù)據(jù)源中具有相同名稱的列進(jìn)行連接。在自然連接中,用戶不需要明確指定進(jìn)行連接的列,系統(tǒng)會自動完成這一任務(wù)。連接后相同的列只保留一個。如現(xiàn)在存在兩個表:R表和S表,這兩個表存在相同的列是B列。如果將這兩個表進(jìn)行自然連接,連接的具體情況如圖所示。8.2.1自然連接自然連接將兩個數(shù)據(jù)源中具有相同名稱的列118.2.1自然連接8.2.1自然連接128.2.1自然連接自然連接使用natrualjoin關(guān)鍵字。語法如圖所示。【示例8-5】在示例數(shù)據(jù)庫中,product_information和categories都包含category_id這列,現(xiàn)在我們把這兩個表進(jìn)行自然連接。8.2.1自然連接自然連接使用natrualjoin關(guān)138.2.2內(nèi)連接內(nèi)連接也稱為簡單連接,它會把兩個或多個表進(jìn)行連接,最后只能查詢出匹配的記錄,不匹配的記錄將無法查詢出來。理解如圖所示。8.2.2內(nèi)連接內(nèi)連接也稱為簡單連接,它會把兩個或多個表148.2.2內(nèi)連接8.2.2內(nèi)連接158.2.2內(nèi)連接這種連接查詢是平時最常用的查詢。語法如圖所示?!臼纠?-6】在示例數(shù)據(jù)庫中,orders數(shù)據(jù)表存儲的是訂單信息,這時如果想知道訂單者的聯(lián)系方式phone_number就需要連接表customersnew。8.2.2內(nèi)連接168.2.3外連接外連接分為左外連接、右外連接、全外連接。使用左外連接查詢,返回的結(jié)果不僅僅是符合連接條件的行記錄,還包含了左邊表中的全部記錄,右外連接與左外連接相反。全外連接返回所有匹配成功的記錄,還包含了左、右表中未匹配成功的記錄。理解如圖所示。8.2.3外連接外連接分為左外連接、右外連接、全外連接。178.2.3外連接8.2.3外連接188.2.3外連接1.左外連接左外連接又稱左向外連接,也就是說如果左表的某行記錄在右表中沒有匹配項(xiàng),則在返回結(jié)果中右表的所有選擇列表均為空,左外連接使用語法如圖所示。【示例8-7】左外連接連接product_information、categories數(shù)據(jù)表,顯示產(chǎn)品編號、產(chǎn)品分類編號、分類名稱。8.2.3外連接1.左外連接198.2.3外連接2.右外連接右外連接又稱右向外連接,與左外連接相反,將右邊表中所有的數(shù)據(jù)與左表進(jìn)行匹配,返回的結(jié)果顯示出了匹配成功的記錄,還包含右表中未匹配成功的記錄,并在其左表對應(yīng)列補(bǔ)空值。右外連接使用語法如圖所示。【示例8-8】右外連接連接product_information、categories數(shù)據(jù)表,顯示產(chǎn)品編號、產(chǎn)品分類編號、分類名稱。8.2.3外連接2.右外連接208.2.3外連接3.全外連接返回所有匹配成功的記錄,并返回左表未匹配成功的記錄,也返回右表未匹配成功的記錄。語法如圖所示?!臼纠?-9】全外連接連接product_information、categories數(shù)據(jù)表,顯示產(chǎn)品編號、產(chǎn)品分類編號、分類名稱?!臼纠?-10】利用外連接的簡略寫法來改寫示例8-8。8.2.3外連接3.全外連接218.3單表中的聯(lián)合語句聯(lián)合語句是指兩個或多個select語句是并列關(guān)系,并且對這些select語句所捕獲的記錄集進(jìn)行集合操作,以獲得最終的結(jié)果集。這些聯(lián)合語句包括以下幾種:union查詢、unionall查詢、intersect查詢和minus查詢。8.3單表中的聯(lián)合語句聯(lián)合語句是指兩個或多個select228.3.1union查詢該操作符用于取得兩個查詢結(jié)果集的并集。理解如圖所示。當(dāng)使用該操作符時,會自動去掉結(jié)果集中重復(fù)行。語法結(jié)構(gòu)如圖所示。8.3.1union查詢該操作符用于取得兩個查詢結(jié)果集的238.3.1union查詢【示例8-11】我們使用關(guān)鍵字union,顯示customersnew表中,cust_first_name是Bruce
Margret和city是Roma的顧客編號、顧客姓名、所在城市。8.3.1union查詢【示例8-11】我們使用關(guān)鍵字u248.3.2unionall查詢該操作符與union相似,但是它不會取消重復(fù)行,不會排序。理解如圖所示。8.3.2unionall查詢該操作符與union相似258.3.2unionall查詢【示例8-12】我們使用關(guān)鍵字unionall,顯示customersnew表中,cust_first_name是Bruce或Margret和city是Roma的顧客編號、顧客姓名、所在城市。8.3.2unionall查詢【示例8-12】我們使用268.3.3intersect查詢intersect操作符用于兩個查詢結(jié)果的交集,理解如圖所示?!臼纠?-13】我們使用關(guān)鍵字intersect,顯示customersnew表中,cust_first_name是Margret和city又是Roma的顧客編號、顧客姓名、所在城市。8.3.3intersect查詢intersect操作符278.3.4minus查詢minus集合運(yùn)算可以查詢兩個給定集合之間的差集,理解如圖所示?!臼纠?-14】我們使用關(guān)鍵字minus,顯示customersnew表中credit_limit在3000~5000之間的顧客信息。8.3.4minus查詢minus集合運(yùn)算可以查詢兩個給288.4子查詢子查詢是指嵌套在查詢語句中的查詢語句。子查詢出現(xiàn)的位置一般為條件語句,如where條件,它本質(zhì)上是where后的一個條件表達(dá)式。Oracle會首先執(zhí)行子查詢,然后執(zhí)行父查詢。8.4子查詢子查詢是指嵌套在查詢語句中的查詢語句。子查詢298.4.1理解子查詢子查詢是嵌入在其他SQL語句中的select語句,也叫嵌套查詢。子查詢首先生成結(jié)果集,并將結(jié)果集應(yīng)用于條件語句。子查詢可以出現(xiàn)在插入、查詢、更新和刪除語句中。建立子查詢的目的在于更加有效的限制where子句中的條件,并可以將復(fù)雜的查詢邏輯梳理的更加清晰。子查詢與父查詢關(guān)系情況如圖所示。8.4.1理解子查詢子查詢是嵌入在其他SQL語句中的se308.4.2子查詢使用在select語句中,where子句或者h(yuǎn)aving子句中的條件往往不能用一個確定的表達(dá)式來確定,而要依賴于另一個查詢,這個被嵌套使用的查詢就是子查詢。子查詢返回單行。查詢語法如圖所示。8.4.2子查詢使用在select語句中,where子句318.4.3子查詢的使用方式及限制在實(shí)際應(yīng)用中,子查詢一般出現(xiàn)在where子句中,包含子查詢的語句通常采用圖中所列格式中的一種。8.4.3子查詢的使用方式及限制在實(shí)際應(yīng)用中,子查詢一般328.4.3子查詢的使用方式及限制1.比較運(yùn)算符引入子查詢凡是表達(dá)式可以出現(xiàn)的地方幾乎都可以使用子查詢,只是SQL對查詢的結(jié)果施加了某些限制。即子查詢用在比較運(yùn)算符之后的表達(dá)式中,該子查詢必須返回單值?!臼纠?-15】子查詢顯示顧客編號customer_id是101的顧客所定產(chǎn)品的折扣價。【示例8-16】子查詢顯示顧客編號customer_id是101并且sales_rep_id是159的顧客所定產(chǎn)品的折折扣價。8.4.3子查詢的使用方式及限制1.比較運(yùn)算符引入子查詢338.4.3子查詢的使用方式及限制【示例8-17】利用子查詢,從customersnew表中查詢賒銷限額credit_limit比顧客編號為839大的所有顧客信息。8.4.3子查詢的使用方式及限制【示例8-17】利用子查348.4.3子查詢的使用方式及限制2.子查詢中的聚合函數(shù)之前在講解基本查詢時,我們可以在查詢結(jié)果中包括聚合函數(shù),在這里也可以將聚合函數(shù)作為where子句的搜索條件的一部分得到聚合函數(shù)返回的值。聚合函數(shù)返回的是單值,可以在比較運(yùn)算符引入子查詢?!臼纠?-18】查詢產(chǎn)品單價unit_price高于平均價格并且line_item_id為1的訂單的order_id、ine_item_id、unit_price的詳細(xì)信息?!臼纠?-19】查詢各個品種的訂單產(chǎn)品的產(chǎn)品單價unit_price高于平均價格的訂單的order_id、ine_item_id、unit_price的詳細(xì)信息。8.4.3子查詢的使用方式及限制2.子查詢中的聚合函數(shù)358.4.3子查詢的使用方式及限制2.在子查詢中使用in、all關(guān)鍵字對于在子查詢返回多個值的情況,可以使用in關(guān)鍵字。當(dāng)使用in運(yùn)算符引入子查詢時,就是對子查詢集合成員測試,即把源表中的列值與子查詢的返回結(jié)果進(jìn)行比較,如果列值與返回結(jié)果集中的列數(shù)據(jù)值之一匹配,那么in判別式求值為true,查詢結(jié)果就包含這行數(shù)據(jù)?!臼纠?-20】使用子查詢,結(jié)合in關(guān)鍵字,顯示顧客編號customer_id是101的顧客所定產(chǎn)品的折扣價。8.4.3子查詢的使用方式及限制2.在子查詢中使用in、368.4.3子查詢的使用方式及限制【示例8-21】我們使用關(guān)鍵字all,在數(shù)據(jù)表customersnew中查詢顯示credit_limit比country為IT的所有的顧客的credit_limit高的customer_id、cust_first_name、和country?!臼纠?-22】我們使用關(guān)鍵字any,在數(shù)據(jù)表customersnew中查詢,顯示credit_limit比country為IT的顧客的credit_limit高的customer_id、cust_first_name、和country。8.4.3子查詢的使用方式及限制【示例8-21】我們使用378.4.3子查詢的使用方式及限制3.在子查詢中使用exists關(guān)鍵字在某些情況下,只需要查詢返回true或false,子查詢的數(shù)據(jù)本身并不重要。這時,就可以使用exists判別式來引入子查詢。使用exists引入子查詢時,就相當(dāng)于進(jìn)行一次存在性測試?!臼纠?-23】exists往往可以作為in判式的替代語法。結(jié)合表order_items、orders查詢顧客編號customer_id是101的顧客所定產(chǎn)品的折扣價信息。表order_items測試哪些訂單號在該集合中。8.4.3子查詢的使用方式及限制3.在子查詢中使用exi388.4.3子查詢的使用方式及限制在子查詢過程中,常用的運(yùn)算符如表所示,表中集合S為子查詢返回的結(jié)果。運(yùn)算符用法說明existsexists如果集合S部位空,則條件表達(dá)式為真,否則為假in表達(dá)式inS如果表達(dá)式的值在集合S中,則條件表達(dá)式為真,否則為假=表達(dá)式=S如果表達(dá)式的值與集合S中的唯一一個元素相等,則條件表達(dá)式為真,否則為假。集合S中最多只有一個元素<><=>=與“=”相同進(jìn)行相應(yīng)的關(guān)系運(yùn)算any用在集合之前指定要與集合中的任一個元素進(jìn)行比較all用在集合之前指定要與集合中的所有元素進(jìn)行比較8.4.3子查詢的使用方式及限制在子查詢過程中,常用的運(yùn)398.5查詢語句優(yōu)化所謂語句優(yōu)化是在原來的語句基礎(chǔ)上為了是語句能夠更快速地得到結(jié)果的方法。在查詢語句中,每一條SQL語句對數(shù)據(jù)庫的操作,產(chǎn)生結(jié)果的時間也不同。即使是完成同一功能的SQL語句,最后的響應(yīng)時間也是不同的。本小節(jié)主要講解查詢語句優(yōu)化中的使用技巧。8.5查詢語句優(yōu)化所謂語句優(yōu)化是在原來的語句基礎(chǔ)上為了是408.5.1在查詢中盡量不使用“*”在數(shù)據(jù)庫的查詢操作中,操作著最常用的查詢某一個數(shù)據(jù)表的全部記錄,此時,需要使用“*”。在Oracle數(shù)據(jù)庫中,使用“*”后,會浪費(fèi)很多查詢時間,所以,在查詢語句中使用“*”時,要考慮是否有字段是不需要的。如果有不需要的字段就要用指定列名的方式查詢,這樣就可以提高查詢效率。8.5.1在查詢中盡量不使用“*”在數(shù)據(jù)庫的查詢操作中,418.5.2多表查詢中盡量使用表別名在查詢中使用別名是比較廣泛的,在Oracle數(shù)據(jù)庫中設(shè)置表的別名方式主要有兩種,如圖所示。8.5.2多表查詢中盡量使用表別名在查詢中使用別名是比較428.5.3條件查詢多使用where在SQL語句中指定查詢條件時主要有兩個關(guān)鍵詞,一個是where,另一個是having。having語句通常用于對集合函數(shù)進(jìn)行操作。但是在實(shí)際的應(yīng)用中,應(yīng)該盡量避免使用having語句,因?yàn)閔aving語句通常用于在檢索出的結(jié)果中過濾結(jié)果,所以效率會比較低。使用where語句可以在查詢時就限定結(jié)果的范圍,這樣就可以提高查詢速度。8.5.3條件查詢多使用where在SQL語句中指定查詢438.5.4指定查詢范圍多使用in當(dāng)要查詢某個值在某個范圍時,可以使用or表示“或者”,使用and表示“并且”。但是in關(guān)鍵字可以表示與or關(guān)鍵詞相同的含義。相對于or關(guān)鍵詞來說,使用in的查詢效率更高一些。因?yàn)閛r關(guān)鍵詞要比較每一個條件,所以檢索速度就會變慢。8.5.4指定查詢范圍多使用in當(dāng)要查詢某個值在某個范圍448.5.5子查詢中多使用exists語句判斷條件exists表示存在的意思。這個關(guān)鍵詞可以替代SQL語句中的很多關(guān)鍵詞,可以替代in關(guān)鍵詞;也可以替代distinct關(guān)鍵詞。但是使用exists關(guān)鍵詞效率會更高?!臼纠?-23】分別使用exists和in關(guān)鍵字來查詢。結(jié)合表order_items、orders查詢顧客編號customer_id是101的顧客所定產(chǎn)品的折扣價信息。表orders測試哪些訂單號在該集合中。1.使用in關(guān)鍵字查詢。2.使用exists關(guān)鍵字查詢。8.5.5子查詢中多使用exists語句判斷條件exis458.6小結(jié)本章講述多表連接的查詢語句,同時講解了連接的分類以及集合運(yùn)算、子查詢。本章重點(diǎn)是多表連接的查詢,關(guān)于各種連接的作用。本章難點(diǎn)是各種子查詢的應(yīng)用,各種不同方式的子查詢和不同應(yīng)用條件下子查詢的應(yīng)用。對于結(jié)果集之間的操作,尤其需要注意區(qū)分union和unionall的細(xì)微差別。8.6小結(jié)本章講述多表連接的查詢語句,同時講解了連接的分46第8章高級查詢我們已經(jīng)初步了解了數(shù)據(jù)表的基礎(chǔ)查詢。但是,在實(shí)際的數(shù)據(jù)庫操作中,往往需要同時從來自兩個或兩個以上的表中查詢相關(guān)數(shù)據(jù),連接就是滿足這些需求的技術(shù)。本章將主要介紹子查詢、聯(lián)合語句、單表關(guān)聯(lián)語句及多表查詢的相關(guān)使用。第8章高級查詢我們已經(jīng)初步了解了數(shù)據(jù)表的基礎(chǔ)查詢。但是,478.1連接簡介上一章的查詢語句都只涉及一個表的數(shù)據(jù)。在很多情況下,需要查詢的數(shù)據(jù)往往涉及多個表,這時需要對多個表進(jìn)行連接查詢。通過連接,可以根據(jù)各個表之間的邏輯關(guān)系從兩個或多個表中檢索數(shù)據(jù)。如,既要查詢訂單的信息,又要查詢訂單所在城市的信息,這就涉及orders和customersnew兩個表。8.1連接簡介上一章的查詢語句都只涉及一個表的數(shù)據(jù)。在很488.1.1連接定義多表連接實(shí)際上就是實(shí)現(xiàn)如何使用一個表中的數(shù)據(jù)來選擇另一個表中的行。而連接條件則主要通過以下方法定義兩個表在查詢中的關(guān)聯(lián)方式:指定每個表中要用于連接的列,典型的連接條件是在一個表中指定外鍵,在另一個表中指定與其關(guān)聯(lián)的鍵。指定比較各列的值時要使用的邏輯運(yùn)算符(=、<>等)。在select語句中實(shí)現(xiàn)多表連接,并不是一個物理存在的實(shí)體。換句話說,它在數(shù)據(jù)表中并不存在,它只是由數(shù)據(jù)庫系統(tǒng)在需要時創(chuàng)建的,只在查詢、檢索數(shù)據(jù)期間有效。8.1.1連接定義多表連接實(shí)際上就是實(shí)現(xiàn)如何使用一個表中498.1.2連接的類型連接體現(xiàn)在where子句中指定的條件上,在條件中要指定兩個表通過哪些列進(jìn)行連接。一般情況下進(jìn)行連接查詢的兩個表是通過主鍵和外鍵進(jìn)行關(guān)聯(lián)的,所以最簡單的條件是一個表的外鍵與另一個表的主鍵相等。在SQL中,表的連接類型主要有下面幾種。內(nèi)部連接(innerjoin)外部連接(outer
join)交叉連接(cross
join)8.1.2連接的類型連接體現(xiàn)在where子句中指定的條件508.1.3簡單的多表查詢表的連接實(shí)現(xiàn)最簡單的方法就是在select語句的from子句中,羅列要連接的表即可。而要進(jìn)一步實(shí)現(xiàn)復(fù)雜的多表連接,則需要在from子句中使用join(innerjoin、outer
join、cross
join等)關(guān)鍵詞,以后的章節(jié)將詳細(xì)講解。8.1.3簡單的多表查詢表的連接實(shí)現(xiàn)最簡單的方法就是在s518.1.3簡單的多表查詢1.如何實(shí)現(xiàn)多表查詢實(shí)現(xiàn)多表查詢,可以在from子句中通過join關(guān)鍵詞連接需要查詢的表。而簡單的多表查詢,則可以不使用join關(guān)鍵詞,而直接列出所要連接的表,利用逗號把from子句后的表名隔開?!臼纠?-1】使用from子句直接實(shí)現(xiàn)product_information和categories兩個表的連接。8.1.3簡單的多表查詢1.如何實(shí)現(xiàn)多表查詢528.1.3簡單的多表查詢2.指定連接條件直接使用from子句連接表,返回的是兩個表的記錄的笛卡爾積,這在實(shí)際應(yīng)用中意義不大。在實(shí)際應(yīng)用中,通常需要連接的兩個表的記錄滿足一定的關(guān)系。這時,可以在select語句的where子句中指定連接條件?!臼纠?-2】使用where子句指定product_information和categories兩個表的連接條件。8.1.3簡單的多表查詢2.指定連接條件538.1.3簡單的多表查詢3.使用別名作為表名的簡寫在上面的示例中,select語句中有關(guān)列名均使用了“product_information.category_id”的完整表達(dá)式。在連接的兩個表中,如果不是相同的列名,可以省略表名;對于相同的列名,在使用時必須指明其對應(yīng)的表名。而使用表名比較繁瑣,我們可以為表定義別名。【示例8-3】使用別名簡化product_information和categories兩個表的連接。8.1.3簡單的多表查詢3.使用別名作為表名的簡寫548.1.3簡單的多表查詢4.自連接在查詢信息時,有時需要將表與其自身進(jìn)行連接,即自連接,這時就需要為表定義別名?!臼纠?-4】從customersnew表中查詢賒銷限額credit_limit比顧客編號839大的所有顧客信息。8.1.3簡單的多表查詢4.自連接558.2表的連接查詢在關(guān)系型數(shù)據(jù)庫中實(shí)現(xiàn)多表之間的聯(lián)系,我們引入了連接查詢,連接用于指定多數(shù)據(jù)源(表、視圖)之間如何組合,以形成最終的數(shù)據(jù)源。前面介紹的表的連接,是通過from子句列出所要連接的表,結(jié)合使用where子句列出連接條件來實(shí)現(xiàn)。本節(jié)將主要為大家介紹使用關(guān)鍵字join實(shí)現(xiàn)表的連接,主要包括自然連接、內(nèi)連接,外連接。使用join關(guān)鍵字有助于將連接操作與where的搜索條件分開。8.2表的連接查詢在關(guān)系型數(shù)據(jù)庫中實(shí)現(xiàn)多表之間的聯(lián)系,我568.2.1自然連接自然連接將兩個數(shù)據(jù)源中具有相同名稱的列進(jìn)行連接。在自然連接中,用戶不需要明確指定進(jìn)行連接的列,系統(tǒng)會自動完成這一任務(wù)。連接后相同的列只保留一個。如現(xiàn)在存在兩個表:R表和S表,這兩個表存在相同的列是B列。如果將這兩個表進(jìn)行自然連接,連接的具體情況如圖所示。8.2.1自然連接自然連接將兩個數(shù)據(jù)源中具有相同名稱的列578.2.1自然連接8.2.1自然連接588.2.1自然連接自然連接使用natrualjoin關(guān)鍵字。語法如圖所示。【示例8-5】在示例數(shù)據(jù)庫中,product_information和categories都包含category_id這列,現(xiàn)在我們把這兩個表進(jìn)行自然連接。8.2.1自然連接自然連接使用natrualjoin關(guān)598.2.2內(nèi)連接內(nèi)連接也稱為簡單連接,它會把兩個或多個表進(jìn)行連接,最后只能查詢出匹配的記錄,不匹配的記錄將無法查詢出來。理解如圖所示。8.2.2內(nèi)連接內(nèi)連接也稱為簡單連接,它會把兩個或多個表608.2.2內(nèi)連接8.2.2內(nèi)連接618.2.2內(nèi)連接這種連接查詢是平時最常用的查詢。語法如圖所示?!臼纠?-6】在示例數(shù)據(jù)庫中,orders數(shù)據(jù)表存儲的是訂單信息,這時如果想知道訂單者的聯(lián)系方式phone_number就需要連接表customersnew。8.2.2內(nèi)連接628.2.3外連接外連接分為左外連接、右外連接、全外連接。使用左外連接查詢,返回的結(jié)果不僅僅是符合連接條件的行記錄,還包含了左邊表中的全部記錄,右外連接與左外連接相反。全外連接返回所有匹配成功的記錄,還包含了左、右表中未匹配成功的記錄。理解如圖所示。8.2.3外連接外連接分為左外連接、右外連接、全外連接。638.2.3外連接8.2.3外連接648.2.3外連接1.左外連接左外連接又稱左向外連接,也就是說如果左表的某行記錄在右表中沒有匹配項(xiàng),則在返回結(jié)果中右表的所有選擇列表均為空,左外連接使用語法如圖所示?!臼纠?-7】左外連接連接product_information、categories數(shù)據(jù)表,顯示產(chǎn)品編號、產(chǎn)品分類編號、分類名稱。8.2.3外連接1.左外連接658.2.3外連接2.右外連接右外連接又稱右向外連接,與左外連接相反,將右邊表中所有的數(shù)據(jù)與左表進(jìn)行匹配,返回的結(jié)果顯示出了匹配成功的記錄,還包含右表中未匹配成功的記錄,并在其左表對應(yīng)列補(bǔ)空值。右外連接使用語法如圖所示?!臼纠?-8】右外連接連接product_information、categories數(shù)據(jù)表,顯示產(chǎn)品編號、產(chǎn)品分類編號、分類名稱。8.2.3外連接2.右外連接668.2.3外連接3.全外連接返回所有匹配成功的記錄,并返回左表未匹配成功的記錄,也返回右表未匹配成功的記錄。語法如圖所示?!臼纠?-9】全外連接連接product_information、categories數(shù)據(jù)表,顯示產(chǎn)品編號、產(chǎn)品分類編號、分類名稱。【示例8-10】利用外連接的簡略寫法來改寫示例8-8。8.2.3外連接3.全外連接678.3單表中的聯(lián)合語句聯(lián)合語句是指兩個或多個select語句是并列關(guān)系,并且對這些select語句所捕獲的記錄集進(jìn)行集合操作,以獲得最終的結(jié)果集。這些聯(lián)合語句包括以下幾種:union查詢、unionall查詢、intersect查詢和minus查詢。8.3單表中的聯(lián)合語句聯(lián)合語句是指兩個或多個select688.3.1union查詢該操作符用于取得兩個查詢結(jié)果集的并集。理解如圖所示。當(dāng)使用該操作符時,會自動去掉結(jié)果集中重復(fù)行。語法結(jié)構(gòu)如圖所示。8.3.1union查詢該操作符用于取得兩個查詢結(jié)果集的698.3.1union查詢【示例8-11】我們使用關(guān)鍵字union,顯示customersnew表中,cust_first_name是Bruce
Margret和city是Roma的顧客編號、顧客姓名、所在城市。8.3.1union查詢【示例8-11】我們使用關(guān)鍵字u708.3.2unionall查詢該操作符與union相似,但是它不會取消重復(fù)行,不會排序。理解如圖所示。8.3.2unionall查詢該操作符與union相似718.3.2unionall查詢【示例8-12】我們使用關(guān)鍵字unionall,顯示customersnew表中,cust_first_name是Bruce或Margret和city是Roma的顧客編號、顧客姓名、所在城市。8.3.2unionall查詢【示例8-12】我們使用728.3.3intersect查詢intersect操作符用于兩個查詢結(jié)果的交集,理解如圖所示?!臼纠?-13】我們使用關(guān)鍵字intersect,顯示customersnew表中,cust_first_name是Margret和city又是Roma的顧客編號、顧客姓名、所在城市。8.3.3intersect查詢intersect操作符738.3.4minus查詢minus集合運(yùn)算可以查詢兩個給定集合之間的差集,理解如圖所示?!臼纠?-14】我們使用關(guān)鍵字minus,顯示customersnew表中credit_limit在3000~5000之間的顧客信息。8.3.4minus查詢minus集合運(yùn)算可以查詢兩個給748.4子查詢子查詢是指嵌套在查詢語句中的查詢語句。子查詢出現(xiàn)的位置一般為條件語句,如where條件,它本質(zhì)上是where后的一個條件表達(dá)式。Oracle會首先執(zhí)行子查詢,然后執(zhí)行父查詢。8.4子查詢子查詢是指嵌套在查詢語句中的查詢語句。子查詢758.4.1理解子查詢子查詢是嵌入在其他SQL語句中的select語句,也叫嵌套查詢。子查詢首先生成結(jié)果集,并將結(jié)果集應(yīng)用于條件語句。子查詢可以出現(xiàn)在插入、查詢、更新和刪除語句中。建立子查詢的目的在于更加有效的限制where子句中的條件,并可以將復(fù)雜的查詢邏輯梳理的更加清晰。子查詢與父查詢關(guān)系情況如圖所示。8.4.1理解子查詢子查詢是嵌入在其他SQL語句中的se768.4.2子查詢使用在select語句中,where子句或者h(yuǎn)aving子句中的條件往往不能用一個確定的表達(dá)式來確定,而要依賴于另一個查詢,這個被嵌套使用的查詢就是子查詢。子查詢返回單行。查詢語法如圖所示。8.4.2子查詢使用在select語句中,where子句778.4.3子查詢的使用方式及限制在實(shí)際應(yīng)用中,子查詢一般出現(xiàn)在where子句中,包含子查詢的語句通常采用圖中所列格式中的一種。8.4.3子查詢的使用方式及限制在實(shí)際應(yīng)用中,子查詢一般788.4.3子查詢的使用方式及限制1.比較運(yùn)算符引入子查詢凡是表達(dá)式可以出現(xiàn)的地方幾乎都可以使用子查詢,只是SQL對查詢的結(jié)果施加了某些限制。即子查詢用在比較運(yùn)算符之后的表達(dá)式中,該子查詢必須返回單值。【示例8-15】子查詢顯示顧客編號customer_id是101的顧客所定產(chǎn)品的折扣價?!臼纠?-16】子查詢顯示顧客編號customer_id是101并且sales_rep_id是159的顧客所定產(chǎn)品的折折扣價。8.4.3子查詢的使用方式及限制1.比較運(yùn)算符引入子查詢798.4.3子查詢的使用方式及限制【示例8-17】利用子查詢,從customersnew表中查詢賒銷限額credit_limit比顧客編號為839大的所有顧客信息。8.4.3子查詢的使用方式及限制【示例8-17】利用子查808.4.3子查詢的使用方式及限制2.子查詢中的聚合函數(shù)之前在講解基本查詢時,我們可以在查詢結(jié)果中包括聚合函數(shù),在這里也可以將聚合函數(shù)作為where子句的搜索條件的一部分得到聚合函數(shù)返回的值。聚合函數(shù)返回的是單值,可以在比較運(yùn)算符引入子查詢?!臼纠?-18】查詢產(chǎn)品單價unit_price高于平均價格并且line_item_id為1的訂單的order_id、ine_item_id、unit_price的詳細(xì)信息。【示例8-19】查詢各個品種的訂單產(chǎn)品的產(chǎn)品單價unit_price高于平均價格的訂單的order_id、ine_item_id、unit_price的詳細(xì)信息。8.4.3子查詢的使用方式及限制2.子查詢中的聚合函數(shù)818.4.3子查詢的使用方式及限制2.在子查詢中使用in、all關(guān)鍵字對于在子查詢返回多個值的情況,可以使用in關(guān)鍵字。當(dāng)使用in運(yùn)算符引入子查詢時,就是對子查詢集合成員測試,即把源表中的列值與子查詢的返回結(jié)果進(jìn)行比較,如果列值與返回結(jié)果集中的列數(shù)據(jù)值之一匹配,那么in判別式求值為true,查詢結(jié)果就包含這行數(shù)據(jù)?!臼纠?-20】使用子查詢,結(jié)合in關(guān)鍵字,顯示顧客編號customer_id是101的顧客所定產(chǎn)品的折扣價。8.4.3子查詢的使用方式及限制2.在子查詢中使用in、828.4.3子查詢的使用方式及限制【示例8-21】我們使用關(guān)鍵字all,在數(shù)據(jù)表customersnew中查詢顯示credit_limit比country為IT的所有的顧客的credit_limit高的customer_id、cust_first_name、和country。【示例8-22】我們使用關(guān)鍵字any,在數(shù)據(jù)表customersnew中查詢,顯示credit_limit比country為IT的顧客的credit_limit高的customer_id、cust_first_name、和country。8.4.3子查詢的使用方式及限制【示例8-21】我們使用838.4.3子查詢的使用方式及限制3.在子查詢中使用exists關(guān)鍵字在某些情況下,只需要查詢返回true或false,子查詢的數(shù)據(jù)本身并不重要。這時,就可以使用exists判別式來引入子查詢。使用exists引入子查詢時,就相當(dāng)于進(jìn)行一次存在性測試?!臼纠?-23】exists往往可以作為in判式的替代語法。結(jié)合表order_items、orders查詢顧客編號customer_id是101的顧客所定產(chǎn)品的折扣價信息。表order_items測試哪些訂單號在該集合中。8.4.3子查詢的使用方式及限制3.在子查詢中使用exi8
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 創(chuàng)業(yè)者如何面對政策的挑戰(zhàn)與機(jī)遇試題及答案
- 2025年創(chuàng)業(yè)扶持政策的資金使用效率試題及答案
- 農(nóng)民創(chuàng)業(yè)與農(nóng)村電商的契機(jī)試題及答案
- 初級律師職稱試題及答案
- 2025年新能源汽車技術(shù)知識測試試題及答案
- 農(nóng)業(yè)電商社會影響考試考點(diǎn)討論試題及答案
- 中風(fēng)病例分析試題及答案
- 樂理考試的準(zhǔn)備與復(fù)習(xí)建議試題及答案
- 體育意識測試題及答案
- 人力銀行面試題及答案
- 人教版五年級數(shù)學(xué)下冊《通分》課件
- 有機(jī)化學(xué)課件:第4章 對映異構(gòu)
- 《隋書刑法志》所見隋初修律
- 《愛蓮說》課件市公開課一等獎?wù)n件省賽課獲獎?wù)n件
- 小學(xué)科學(xué)課標(biāo)解讀課件
- 三灣改編-課件
- 文心雕龍-神思教學(xué)課件
- 【輔助投籃機(jī)器人設(shè)計7600字(論文)】
- 35KV架空輸電線路工程鐵塔組立專項(xiàng)工程施工組織設(shè)計方案
- 寧波市建設(shè)工程資料統(tǒng)一用表(2022版)
- 2022屆遼寧省沈陽市高三一模語文試題(含答案)
評論
0/150
提交評論