《MySQL數(shù)據(jù)庫應(yīng)用案例教程》651-5(馬潔)教案 第9課 多表數(shù)據(jù)記錄查詢_第1頁
《MySQL數(shù)據(jù)庫應(yīng)用案例教程》651-5(馬潔)教案 第9課 多表數(shù)據(jù)記錄查詢_第2頁
《MySQL數(shù)據(jù)庫應(yīng)用案例教程》651-5(馬潔)教案 第9課 多表數(shù)據(jù)記錄查詢_第3頁
《MySQL數(shù)據(jù)庫應(yīng)用案例教程》651-5(馬潔)教案 第9課 多表數(shù)據(jù)記錄查詢_第4頁
《MySQL數(shù)據(jù)庫應(yīng)用案例教程》651-5(馬潔)教案 第9課 多表數(shù)據(jù)記錄查詢_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

PAGE16PAGE16PAGE17PAGE17

課題多表數(shù)據(jù)記錄查詢課時2課時(90min)教學(xué)目標知識技能目標:(1)掌握多表連接查詢的方法(2)掌握FROM子句和WHERE子句中子查詢的使用方法(3)掌握使用UNION關(guān)鍵字合并查詢結(jié)果的方法素質(zhì)目標:(1)了解數(shù)據(jù)庫前沿技術(shù),緊跟時代發(fā)展(2)了解數(shù)據(jù)庫在生活中的應(yīng)用教學(xué)重難點教學(xué)重點:多表連接查詢的方法教學(xué)難點:FROM子句和WHERE子句中子查詢的使用方法,使用UNION關(guān)鍵字合并查詢結(jié)果的方法教學(xué)方法案例分析法、問答法、討論法、講授法、實踐法教學(xué)用具電腦、投影儀、多媒體課件、教材教學(xué)設(shè)計第1節(jié)課:→→→傳授新知(38min)第2節(jié)課:→傳授新知(20min)→課堂實訓(xùn)(15min)→課堂小結(jié)(3min)→作業(yè)布置(2min)教學(xué)過程主要教學(xué)內(nèi)容及步驟設(shè)計意圖第一節(jié)課課前任務(wù)【教師】布置課前任務(wù),和學(xué)生負責(zé)人取得聯(lián)系,讓其提醒同學(xué)通過文旌課堂APP或其他學(xué)習(xí)軟件,預(yù)習(xí)本節(jié)課要學(xué)習(xí)的知識【學(xué)生】完成課前任務(wù)通過課前任務(wù),使學(xué)生預(yù)習(xí)本節(jié)課要學(xué)習(xí)的知識,增加學(xué)生的學(xué)習(xí)興趣考勤(2min)【教師】使用文旌課堂APP進行簽到【學(xué)生】班干部報請假人員及原因培養(yǎng)學(xué)生的組織紀律性,掌握學(xué)生的出勤情況問題導(dǎo)入(5min)【教師】提出以下問題:如何在多張數(shù)據(jù)表中進行查詢?通過問題導(dǎo)入,引導(dǎo)學(xué)生主動思考,激發(fā)學(xué)生的學(xué)習(xí)興趣傳授新知(38min)【教師】通過學(xué)生的回答引入要講的知識,講解連接查詢的相關(guān)知識8.1連接查詢?【教師】隨機邀請學(xué)生回答以下問題:什么是連接查詢??【學(xué)生】聆聽、思考、回答?【教師】總結(jié)學(xué)生的回答在關(guān)系型數(shù)據(jù)庫管理系統(tǒng)中,通常一張表只會存儲一個實體的相關(guān)信息,如果用戶需要查詢多張表中不同實體的數(shù)據(jù),可以使用關(guān)鍵字JOIN對表執(zhí)行連接查詢操作,但前提條件是,這些表中必須存在具有相同意義的字段。連接查詢主要包括內(nèi)連接查詢和外連接查詢,另外還可以在連接查詢中添加過濾條件,篩選符合條件的數(shù)據(jù),這就是復(fù)合條件連接查詢。8.1.1內(nèi)連接查詢?【教師】組織學(xué)生掃碼觀看“內(nèi)連接查詢”視頻(詳見教材),讓學(xué)生對基本知識有一個大致的了解內(nèi)連接查詢(INNERJOIN)是使用比較運算符對多個表間的某些列數(shù)據(jù)進行比較,并列出這些表中與連接條件相匹配的數(shù)據(jù)行,組合成新的記錄。表之間的連接條件由表中具有相同意義的字段組成。?【教師】通過多媒體展示“staff表結(jié)構(gòu)”和“section表結(jié)構(gòu)”表格,介紹相關(guān)知識為便于講解,首先需要創(chuàng)建一個數(shù)據(jù)庫staff,并在其中創(chuàng)建兩個數(shù)據(jù)表staff和section,兩個表的結(jié)構(gòu)分別如表8-1和表8-2所示。表8-1staff表結(jié)構(gòu)字段數(shù)據(jù)類型約束注釋staff_idINT(10)無符號、主鍵、自增、非空員工IDsection_idINT(10)無符號、非空部門IDpositions_idINT(10)非空職位IDnameVARCHAR(10)非空姓名sexENUM('男','女')非空性別phone_numberCHAR(11)非空手機號moneyDECIMAL(10,2)無符號、非空,默認值0薪資entry_dateDATETIME非空入職時間表8-2section表結(jié)構(gòu)字段數(shù)據(jù)類型約束注釋section_idINT(10)無符號、主鍵、自增、非空部門IDsection_titleVARCHAR(20)非空部門名稱【實例

8-1】本例首先創(chuàng)建數(shù)據(jù)庫staff,然后參照表8-1和表8-2創(chuàng)建數(shù)據(jù)表staff和section,并在其中插入數(shù)據(jù)。步驟1登錄MySQL后執(zhí)行以下語句,創(chuàng)建數(shù)據(jù)庫staff。CREATEDATABASEstaff;步驟2選擇數(shù)據(jù)庫staff,并執(zhí)行以下語句創(chuàng)建數(shù)據(jù)表staff。CREATETABLEstaff(staff_idINT(10)UNSIGNEDNOTNULLAUTO_INCREMENT,section_idINT(10)UNSIGNEDNOTNULL,positions_idINT(10)NOTNULL,nameVARCHAR(10)NOTNULL,sexENUM('男','女')NOTNULL,phone_numberCHAR(11)NOTNULL,moneydecimal(10,2)UNSIGNEDNOTNULLDEFAULT'0.00',entry_dateDATETIMENOTNULL,PRIMARYKEY(staff_id));步驟3執(zhí)行以下SQL語句,向staff表中插入數(shù)據(jù)。INSERTINTOstaff(staff_id,section_id,positions_id,name,sex,phone_number,money,entry_date)VALUES(1,'1','1','劉長生','男',,20000,'2018-04-0214:35:52'),(2,'1','2','趙霞','女',,10000,'2018-04-0314:40:52'),(3,'2','3','季慶奇','女',,15000,'2018-04-0314:43:52'),(4,'3','3','李星宇','男',,15000,'2018-04-0314:45:52'),(5,'4','3','張向陽','男',,15000,'2018-04-0314:47:24'),(6,'4','8','張旭','男',,10000,'2018-04-0314:50:52');……(詳見教材)1.普通內(nèi)連接查詢內(nèi)連接查詢的語法形式為:SELECT{*|col_list}FROMtable_name1INNERJOINtable_name2ONcondition;上述語句中,condition表示連接條件。接下來通過實例具體說明內(nèi)連接查詢的用法。【實例8-2】在staff表和section表之間使用內(nèi)連接查詢,從staff表中查詢staff_id(員工ID)、name(姓名)、sex(性別)和phone_number(手機號),從section表中查詢section_title(部門名稱)。由表8-1和表8-2的表結(jié)構(gòu)可知,兩個表都有相同數(shù)據(jù)類型的字段section_id,可以通過該字段建立聯(lián)系。為此,首先選擇數(shù)據(jù)庫staff,然后執(zhí)行內(nèi)連接查詢語句,結(jié)果如下:mysql>SELECTstaff_id,name,sex,section_title,phone_number->FROMstaffINNERJOINsection->ONstaff.section_id=section.section_id;++++++|staff_id|name|sex|section_title|phone_number|++++++|1|劉長生|男|總經(jīng)辦|2|趙霞|女|總經(jīng)辦|3|季慶奇|女|財務(wù)部|4|李星宇|男|銷售部|5|張向陽|男|研發(fā)部|6|張旭|男|研發(fā)部++++++6rowsinset(0.01sec)【提示】上述SQL語句中,使用符號“.”將表名和字段名拼接起來,作用是明確指定字段所屬的數(shù)據(jù)表,不會因為字段名重名而造成系統(tǒng)無法識別。此處,SELECT語句與前面最大的區(qū)別在于:SELECT后面指定的列分別屬于兩個不同的表;同時,F(xiàn)ROM子句列出了兩個表,兩個表之間的關(guān)系通過INNERJOIN指定;連接條件使用ON子句給出。另外,使用WHERE子句也可以給出連接條件,以下語句將返回與前面完全相同的結(jié)果。SELECTstaff_id,name,sex,section_title,phone_numberFROMstaff,sectionWHEREstaff.section_id=section.section_id;使用WHERE子句定義連接條件簡單明了,但在某些時候會影響查詢性能,而使用INNERJOIN語法能夠確保不會忘記連接條件。2.自連接查詢內(nèi)連接查詢中有一種特殊的查詢,稱為自連接查詢,它是指連接查詢中涉及的兩張表在物理上是同一張表,但邏輯上可以看成兩張表,語法形式如下:SELECTtable_alias1.*,table_alias2.*FROMtable_nameAStable_alias1INNERJOINtable_nameAStable_alias2ONcondition;上述語句的意義是,將一張表分別命名為table_alias1和table_alias2,然后使用這兩個表名進行自連接查詢?!緦嵗?-3】使用內(nèi)連接查詢語句,從staff表中查詢薪資低于15000的員工的staff_id(員工ID)、name(姓名)和money(薪資)。首先選擇數(shù)據(jù)庫staff,然后執(zhí)行內(nèi)連接查詢語句,結(jié)果如下:mysql>SELECTs1.staff_id,,s2.moneyFROMstaffASs1->INNERJOINstaffASs2ONs1.staff_id=s2.staff_idANDs2.money<15000;++++|staff_id|name|money|++++|2|趙霞|10000.00||6|張旭|10000.00|++++2rowsinset(0.00sec)此處查詢的兩個表是同一個表staff,為防止產(chǎn)生二義性,使用AS關(guān)鍵字為表起了別名,staff表第1次以s1為別名出現(xiàn),第2次以s2為別名出現(xiàn)。INNERJOIN連接兩個表,并按照第2個表的money值對數(shù)據(jù)進行過濾。8.1.2外連接查詢?【教師】組織學(xué)生掃碼觀看“外連接和復(fù)合條件連接查詢”視頻(詳見教材),讓學(xué)生對基本知識有一個大致的了解外連接查詢(OUTERJOIN)是以一張表為基表,根據(jù)連接條件,與另外一張表的每一行進行匹配,如果沒有匹配上,則在相關(guān)聯(lián)的結(jié)果行中,另一張表的所有選擇列均返回空值。外連接查詢通常分為兩種:左連接查詢(LEFTJOIN)和右連接查詢(RIGHTJOIN)。其基本語法形式如下:SELECT{*|col_list}FROMtable_name1{LEFT|RIGHT}[OUTER]JOINtable_name2ONcondition;本節(jié)以第5章創(chuàng)建的goods表和orders表為操作對象,講解外連接查詢的應(yīng)用,在前面的操作中已經(jīng)為goods表插入數(shù)據(jù),接下來為orders表插入數(shù)據(jù)?!緦嵗?-4】執(zhí)行SQL語句,向orders表中插入數(shù)據(jù)。步驟1登錄MySQL,并執(zhí)行以下語句,選擇db_shop數(shù)據(jù)庫。USEdb_shop;步驟2執(zhí)行以下語句,關(guān)閉orders表的外鍵約束。SETFOREIGN_KEY_CHECKS=0;【提示】對于先創(chuàng)建表關(guān)系,之后才插入數(shù)據(jù)的表,在其中插入數(shù)據(jù)時需要先關(guān)閉外鍵約束,否則會插入不成功。由于前面在創(chuàng)建orders表時為其設(shè)置了外鍵約束,此處先將其關(guān)閉,待插入數(shù)據(jù)后再開啟。開啟表外鍵約束的語句為SETFOREIGN_KEY_CHECKS=1;。步驟3執(zhí)行SQL語句,向orders表中插入數(shù)據(jù),結(jié)果如下所示。mysql>INSERTINTOorders(o_id,add_time,goods_id)->VALUES(1,'2018-04-0214:35:52',6),->(2,'2018-04-0314:40:52',1),->(3,'2018-04-0314:43:52',5),->(4,'2018-04-0314:45:52',1),->(5,'2018-04-0314:47:24',15),->(6,'2018-04-0314:50:52',4);QueryOK,6rowsaffected(0.06sec)Records:6Duplicates:0Warnings:01.左連接查詢在外連接查詢語句中,LEFTJOIN關(guān)鍵字之前的表稱為左表,左連接查詢會以左表為基表,與另外一張表的每一行進行匹配,如果符合連接條件,則返回兩張表相對應(yīng)的行;如果不符合,則只返回左表中的行,并且其對應(yīng)的行為一個空值。【實例

8-5】執(zhí)行左連接查詢語句,查詢goods表中哪些商品有訂單,哪些商品沒有訂單。由于goods表中的id字段對應(yīng)orders表中的goods_id字段,此處將這兩個字段進行比較,如果goods表中的id字段在orders表中有對應(yīng)的goods_id值,則返回其對應(yīng)的o_id值;否則就表示該商品沒有對應(yīng)訂單,返回空值。執(zhí)行結(jié)果如下:mysql>SELECTgoods.id,,orders.o_idFROMgoods->LEFTJOINordersONgoods.id=orders.goods_id;++++|id|name|o_id|++++|4|休閑西服|6||5|果汁|3||3|水果糖|NULL||9|牛仔褲|NULL||2|牛奶糖|NULL||10|紅樓夢|NULL||8|蘋果|NULL||1|西游記|2||1|西游記|4||7|西瓜|NULL||6|論語|1|++++11rowsinset(0.04sec)由結(jié)果可以看出,goods表中id值為2,3,7,8,9和10的商品所對應(yīng)的訂單信息為空值,說明這幾種商品沒有客戶下訂單。2.右連接查詢在外連接查詢語句中,RIGHTJOIN關(guān)鍵字之后的表稱為右表,右連接查詢會以右表為基表,與另外一張表的每一行進行匹配,如果符合連接條件,則返回兩張表相對應(yīng)的行;如果不符合,則只返回右表中的行,并且其對應(yīng)的行為一個空值。【實例

8-6】執(zhí)行右連接查詢語句,查詢訂單中所對應(yīng)的商品哪些仍然存在,哪些已經(jīng)刪除。與實例8-5類似,依然將商品編號進行比較,所不同的是,此處是將orders表中的goods_id與goods表中的id字段逐行進行比較,如果在goods表中有對應(yīng)的記錄,則返回相應(yīng)的name值,如果沒有則返回空值。執(zhí)行結(jié)果如下:mysql>SELECTorders.o_id,orders.add_time,FROMgoods->RIGHTJOINordersONorders.goods_id=goods.id;++++|o_id|add_time|name|++++|1|2018-04-0214:35:52|論語||2|2018-04-0314:40:52|西游記||3|2018-04-0314:43:52|果汁||4|2018-04-0314:45:52|西游記||5|2018-04-0314:47:24|NULL||6|2018-04-0314:50:52|休閑西服|++++6rowsinset(0.00sec)由結(jié)果可以看出,orders表中o_id值為5的訂單所對應(yīng)的商品信息為空值,說明該商品已被刪除。8.1.3復(fù)合條件連接查詢復(fù)合條件連接查詢是通過在連接查詢中添加過濾條件,以達到限制查詢結(jié)果和篩選數(shù)據(jù)的目的,下面通過實例進行介紹。【實例8-7】在staff表和section表中,執(zhí)行內(nèi)連接查詢語句,查詢section表中部門名稱為“總經(jīng)辦”的員工ID、姓名、性別和電話號碼等信息。步驟1登錄MySQL,并執(zhí)行以下語句,選擇staff數(shù)據(jù)庫。USEstaff;步驟

2執(zhí)行以下SQL語句,在staff表和section表中查詢部門名稱為“總經(jīng)辦”的員工ID、姓名、性別和電話號碼,執(zhí)行結(jié)果如下:mysql>SELECTstaff_id,name,sex,section_title,phone_number->FROMstaffINNERJOINsection->ONstaff.section_id=section.section_id->WHEREsection.section_title='總經(jīng)辦';++++++|staff_id|name|sex|section_title|phone_number|++++++|1|劉長生|男|總經(jīng)辦|2|趙霞|女|總經(jīng)辦++++++2rowsinset(0.00sec)可以看出,在限制了部門名稱為總經(jīng)辦后,此處只返回了在總經(jīng)辦任職的員工信息??梢詫⒃摻Y(jié)果與實例8-2的查詢結(jié)果進行比較?!緦嵗?-8】執(zhí)行左連接查詢語句,查詢goods表中哪些商品有訂單,哪些商品沒有訂單,并使用商品ID號對查詢結(jié)果進行排序。步驟1登錄MySQL,并執(zhí)行以下語句,選擇db_shop數(shù)據(jù)庫。USEdb_shop;步驟2執(zhí)行以下SQL語句,在goods表和orders表中查詢哪些商品有訂單,哪些商品沒有訂單,并使用商品ID號對查詢結(jié)果進行排序,執(zhí)行結(jié)果如下:mysql>SELECTgoods.id,,orders.o_idFROMgoodsLEFTJOINorders->ONgoods.id=orders.goods_idORDERBYgoods.id;++++|id|name|o_id|++++|1|西游記|2||1|西游記|4||2|牛奶糖|NULL||3|水果糖|NULL||4|休閑西服|6||5|果汁|3||6|論語|1||7|西瓜|NULL||8|蘋果|NULL||9|牛仔褲|NULL||10|紅樓夢|NULL|++++11rowsinset(0.01sec)與實例8-5的查詢結(jié)果進行比較,可以看出,在對商品信息進行排序后,可以更加方便地查看信息?!緦W(xué)生】聆聽、思考、記錄通過教師的講解和演示,使學(xué)生了解連接查詢的相關(guān)知識第二節(jié)課問題導(dǎo)入(5min)【教師】提出以下問題:什么是主查詢和子查詢?【學(xué)生】思考、舉手回答通過問題導(dǎo)入,引導(dǎo)學(xué)生主動思考,激發(fā)學(xué)生的學(xué)習(xí)興趣傳授新知(20min)【教師】通過學(xué)生的回答引入新知,介紹子查詢和合并查詢結(jié)果的相關(guān)知識8.2子查詢?【教師】組織學(xué)生掃碼觀看“子查詢”視頻(詳見教材),讓學(xué)生對基本知識有一個大致的了解如果一個查詢語句中嵌套了一個或若干個其他的查詢語句,那么在整個語句中,外層查詢稱為主查詢,內(nèi)層查詢稱為子查詢或者嵌套查詢。該類查詢可以基于一個表或多個表。在此類查詢中,系統(tǒng)會先執(zhí)行子查詢,將子查詢的結(jié)果作為主查詢的過濾條件。子查詢可以應(yīng)用在SELECT,UPDATE和DELETE語句中,并且大多數(shù)子查詢會包含在FROM子句或WHERE子句中,在WHERE子句中通常與IN,ANY,ALL和EXISTS關(guān)鍵字搭配使用,也可以使用條件判斷符。本節(jié)主要講解SELECT語句中的子查詢。8.2.1FROM子句中的子查詢FROM子句中的子查詢會生成一個臨時表,由于FROM子句中的每個表都必須有一個名稱,因此應(yīng)該為臨時表取一個別名,語法形式如下:SELECT{*|col_list}FROM(SELECT*FROMtable_name)AStable_alias[WHEREcondition];上述語句中,table_alias表示表別名,下面通過實例介紹上述語句的應(yīng)用?!緦嵗?-9】執(zhí)行查詢語句,查詢goods表中id值大于3,且num值大于10的商品的id和name值。步驟1登錄MySQL,并執(zhí)行以下語句,選擇db_shop數(shù)據(jù)庫。USEdb_shop;步驟2執(zhí)行以下語句,查詢goods表中id值大于3的數(shù)據(jù)記錄,結(jié)果如下:mysql>SELECT*FROMgoodsWHEREid>3;+++++++|id|type|name|price|num|add_time|+++++++|4|服飾|休閑西服|800.00|10|2018-04-0413:40:40||5|飲品|果汁|2.50|70|2018-05-0513:40:40||6|書籍|論語|109.00|50|2018-01-0313:40:40||7|水果|西瓜|1.50|NULL|2018-02-0513:40:40||8|水果|蘋果|3.00|100|2018-03-0513:40:40||9|服飾|牛仔褲|120.00|10|2018-05-0413:40:40||10|書籍|紅樓夢|50.50|15|2018-05-0613:40:40|+++++++7rowsinset(0.04sec)步驟

3執(zhí)行嵌套查詢,將上述語句作為子查詢,在其生成的臨時表g1中查詢num值大于10的商品的id和name值,查詢結(jié)果如下:mysql>SELECTid,namefrom(SELECT*FROMgoodsWHEREid>3)ASg1->WHEREnum>10;+++|id|name|+++|5|果汁||6|論語||8|蘋果||10|紅樓夢|+++4rowsinset(0.00sec)8.2.2WHERE子句中的子查詢包含在WHERE子句中的子查詢,其查詢結(jié)果通常是單列數(shù)據(jù),系統(tǒng)執(zhí)行子查詢后,子查詢的結(jié)果會作為主查詢的篩選條件。1.使用IN關(guān)鍵字的子查詢當(dāng)子查詢返回的是一個數(shù)據(jù)集合,主查詢需要返回符合集合中條件的記錄時,可以使用IN關(guān)鍵字,語法形式如下:SELECT{*|col_list}FROMtable_name1WHEREcol_name1IN(SELECTcol_name2FROMtable_name2[WHEREcondition]);上述語句中col_name1為表1中的字段,col_name2為表2中的字段?!緦嵗?-10】執(zhí)行查詢語句,查詢orders表中字段goods_id的所有值,然后使用子查詢結(jié)果拼接WHERE條件,查詢goods_id值對應(yīng)的所有商品的詳細信息。步驟1登錄MySQL,并執(zhí)行以下語句,選擇db_shop數(shù)據(jù)庫。USEdb_shop;步驟2執(zhí)行SQL語句,查詢orders表中字段goods_id的所有值,執(zhí)行結(jié)果如下:mysql>SELECTgoods_idFROMorders;++|goods_id|++|1||1||4||5||6||15|++6rowsinset(0.00sec)步驟3執(zhí)行SQL語句,使用上述查詢結(jié)果作為子查詢,在goods表中查詢goods_id值對應(yīng)的商品的詳細信息,執(zhí)行結(jié)果如下:mysql>SELECT*FROMgoodsWHEREidIN(SELECTgoods_idFROMorders);+++++++|id|type|name|price|num|add_time|+++++++|1|書籍|西游記|50.40|20|2018-01-0113:40:40||4|服飾|休閑西服|800.00|10|2018-04-0413:40:40||5|飲品|果汁|2.50|70|2018-05-0513:40:40||6|書籍|論語|109.00|50|2018-01-0313:40:40|+++++++4rowsinset(0.04sec)執(zhí)行結(jié)果成功顯示出訂單中商品的詳細信息,但由于goods_id為15的商品不在goods表中,所以沒有顯示出該商品的信息。另外,子查詢還可以和NOTIN配合使用,下面通過實例進行介紹?!緦嵗?-11】執(zhí)行SQL語句,依然以前面的查詢結(jié)果作為子查詢,在goods表中查詢沒有訂單的商品的詳細信息,執(zhí)行結(jié)果如下:mysql>SELECT*FROMgoodsWHEREidNOTIN(SELECTgoods_idFROMorders);+++++++|id|type|name|price|num|add_time|+++++++|2|糖類|牛奶糖|7.50|200|2018-02-0213:40:40||3|糖類|水果糖|2.50|100|2018-06-0911:20:55||7|水果|西瓜|1.50|NULL|2018-02-0513:40:40||8|水果|蘋果|3.00|100|2018-03-0513:40:40||9|服飾|牛仔褲|120.00|10|2018-05-0413:40:40||10|書籍|紅樓夢|50.50|15|2018-05-0613:40:40|+++++++6rowsinset(0.04sec)2.使用ANY、SOME關(guān)鍵字的子查詢ANY和SOME是同義詞,表示滿足其中任一條件。該類查詢會創(chuàng)建一個表達式對子查詢的返回值列表進行比較,只要滿足子查詢中的任一個比較條件,就返回一個結(jié)果。其語法形式如下:SELECT{*|col_list}FROMtable_name1WHEREcol_name1<any(SELECTcol_name2FROMtable_name2[WHEREcondition]);【實例8-12】執(zhí)行SQL語句,在goods表中查詢2018年4月2號以后訂單中的商品信息。步驟1登錄MySQL,并執(zhí)行以下語句,選擇db_shop數(shù)據(jù)庫。USEdb_shop;步驟2執(zhí)行SQL語句,查詢orders表中2018年4月2號以后的訂單中的goods_id的所有值,結(jié)果如下:mysql>SELECTgoods_idFROMordersWHEREadd_time>'2018-04-02';++|goods_id|++|6||1||5||1||15||4|++6rowsinset(0.00sec)步驟3執(zhí)行SQL語句,使用上述查詢結(jié)果作為子查詢,在goods表中查詢goods_id值對應(yīng)的商品的詳細信息,結(jié)果如下:mysql>SELECT*FROMgoods->WHEREid=ANY(SELECTgoods_idFROMordersWHEREadd_time>'2018-04-02');+++++++|id|type|name|price|num|add_time|+++++++|6|書籍|論語|109.00|50|2018-01-0313:40:40||1|書籍|西游記|50.40|20|2018-01-0113:40:40||5|飲品|果汁|2.50|70|2018-05-0513:40:40||4|服飾|休閑西服|800.00|10|2018-04-0413:40:40|+++++++4rowsinset(0.00sec)【提示】由上述查詢結(jié)果可以看出,使用“=ANY”與使用關(guān)鍵字IN的效果實際上是相同的,除“=”外,ANY關(guān)鍵字前面可以使用的條件判斷符還有“<”“>”“<=”和“>=”,讀者可根據(jù)需要進行選擇。3.使用ALL關(guān)鍵字的子查詢與ANY和SOME不同,使用關(guān)鍵字ALL的子查詢,表示當(dāng)一條記錄符合子查詢結(jié)果中所有的條件時,才會返回該記錄。其語法形式如下:SELECT{*|col_list}FROMtable_name1WHEREcol_name1>All(SELECTcol_name2FROMtable_name2[WHERE條件]);【實例8-13】執(zhí)行以下語句,查詢goods表中id值比子查詢結(jié)果中的最大數(shù)據(jù)還要大的記錄。步驟1登錄MySQL,并執(zhí)行以下語句,選擇db_shop數(shù)據(jù)庫。USEdb_shop;步驟2執(zhí)行SQL語句,查詢orders表中2018年4月3號之前的訂單中的goods_id的所有值,結(jié)果如下:mysql>SELECTgoods_idFROMordersWHEREadd_time<'2018-04-03';++|goods_id|++|6||4|++2rowsinset(0.00sec)【提示】為驗證查詢結(jié)果,此處事先將orders表中第6條記錄的添加時間改為了2018-04-0114:47:24。步驟

3執(zhí)行SQL語句,使用上述查詢結(jié)果作為子查詢,在goods表中查詢goods_id值對應(yīng)的商品的詳細信息,結(jié)果如下:mysql>SELECT*FROMgoods->WHEREid>ALL(SELECTgoods_idFROMordersWHEREadd_time<'2018-04-03');+++++++|id|type|name|price|num|add_time|+++++++|7|水果|西瓜|1.50|NULL|2018-02-0513:40:40||8|水果|蘋果|3.00|100|2018-03-0513:40:40||9|服飾|牛仔褲|120.00|10|2018-05-0413:40:40||10|書籍|紅樓夢|50.50|15|2018-05-0613:40:40|+++++++4rowsinset(0.00sec)可以看出,查詢結(jié)果中所有記錄的id值都同時大于子查詢結(jié)果中的4和6?!咎崾尽緼LL關(guān)鍵字之前可以使用的條件判斷符有“<”“>”“<=”和“>=”,但一般不會使用“=”。4.使用EXISTS關(guān)鍵字的子查詢使用EXISTS關(guān)鍵字,系統(tǒng)會對子查詢的返回結(jié)果進行判斷,如果子查詢至少返回一行記錄,那么EXISTS的結(jié)果為TRUE,此時主查詢語句將會執(zhí)行;如果子查詢沒有返回任何記錄,那么EXISTS的結(jié)果為FALSE,此時主查詢語句將不會執(zhí)行。其語法形式如下:SELECT{*|col_list}FROMtable_name1WHEREEXISTS(SELECT*FROMtable_name2);【實例8-14】查詢orders表中是否存在goods_id值為5的記錄,如果存在,則查詢goods表中id值小于5的記錄。在選中數(shù)據(jù)庫db_shop后,執(zhí)行SQL語句,使用EXISTS關(guān)鍵字查詢goods表中id值小于5的記錄,查詢結(jié)果如下:mysql>SELECT*FROMgoodsWHEREid<'5'AND->EXISTS(SELECTo_idFROMordersWHEREgoods_id='5');+++++++|id|type|name|price|num|add_time|+++++++|1|書籍|西游記|50.40|20|2018-01-0113:40:40||2|糖類|牛奶糖|7.50|200|2018-02-0213:40:40||3|糖類|水果糖|2.50|100|2018-06-0911:20:55||4|服飾|休閑西服|800.00|10|2018-04-0413:40:40|+++++++4rowsinset(0.02sec)由查詢結(jié)果可知,子查詢結(jié)果表明orders表中存在goods_id='5'的記錄,因此EXISTS表達式返回true;主查詢語句接收true之后根據(jù)查詢條件id<'5'對goods表進行查詢,返回4條符合條件的記錄。NOTEXISTS與EXISTS使用方法相同,返回的結(jié)果相反,讀者可自行嘗試。5.使用條件判斷符的子查詢在子查詢中,還可以單獨使用條件判斷符。其語法形式如下:SELECT{*|col_list}FROMtable_name1WHEREcol_name1operators(SELECTcol_name2FROMtable_name2);上述語句中,operators表示條件判斷符?!緦嵗?-15】查詢goods表中o_id值等于3的商品的詳細信息。在選中數(shù)據(jù)庫db_shop后,執(zhí)行SQL語句,使用條件判斷符查詢goods表中o_id值等于3的商品的詳細信息。查詢結(jié)果如下:mysql>SELECT*FROMgoods->WHEREid=(SELECTgoods_idFROMordersWHEREo_id=3);+++++++|id|type|name|price|num|add_time|+++++++|5|飲品|果汁|2.50|70|2018-05-0513:40:40|+++++++1rowinset(0.06sec)8.3合并查詢結(jié)果合并查詢結(jié)果就是使用UNION關(guān)鍵字,將多條查詢語句的結(jié)果合并在一起顯示。UNION有兩種使用方法,一種是查詢結(jié)果不重復(fù)(過濾掉重復(fù)的記錄),另一種是保留所有查詢結(jié)果。為便于講解,首先創(chuàng)建兩張表,分別為愛好音樂的學(xué)生表(music)和愛好舞蹈的學(xué)生表(dance),具體操作見實例8-16?!緦嵗?-16】參照表8-3創(chuàng)建兩張結(jié)構(gòu)相同的表,分別命名為music和dance,之后為各個表插入數(shù)據(jù)。?【教師】通過多媒體展示“表結(jié)構(gòu)”表格,介紹相關(guān)知識表8-3表結(jié)構(gòu)字段數(shù)據(jù)類型約束注釋idINT(10)無符號、非空、主鍵、自增學(xué)生IDnameVARCHAR(20)非空學(xué)生姓名步驟1登錄MySQL,執(zhí)行以下SQL語句,創(chuàng)建數(shù)據(jù)庫school。CREATEDATABASEschool;步驟2執(zhí)行以下SQL語句,選擇數(shù)據(jù)庫school。USEschool;步驟

3執(zhí)行以下SQL語句,在數(shù)據(jù)庫school中創(chuàng)建數(shù)據(jù)表music;并按照同樣方法創(chuàng)建與music表結(jié)構(gòu)相同的dance表。CREATETABLEmusic(idINT(10)UNSIGNEDNOTNULLAUTO_INCREMENT,nameVARCHAR(20)NOTNULL,PRIMARYKEY(id));……(詳見教材)8.3.1使用UNION關(guān)鍵字的合并操作單獨使用UNION關(guān)鍵字的合并操作,查詢結(jié)果集會合并在一起,并將重復(fù)的記錄刪除。其語法形式如下:SELECT{*|col_list}FROMtable_name1UNIONSELECT{*|col_list}FROMtable_name2;下面通過實例具體說明UNION關(guān)鍵字的使用?!緦嵗?-17】執(zhí)行SELECT語句,在數(shù)據(jù)庫school中,使用UNION關(guān)鍵字合并

溫馨提示

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

評論

0/150

提交評論