![《MySQL數(shù)據(jù)庫(kù)應(yīng)用案例教程》教案 第9課 多表數(shù)據(jù)記錄查詢_第1頁(yè)](http://file4.renrendoc.com/view/b097cb6f57edf7fa5185966a44085a10/b097cb6f57edf7fa5185966a44085a101.gif)
![《MySQL數(shù)據(jù)庫(kù)應(yīng)用案例教程》教案 第9課 多表數(shù)據(jù)記錄查詢_第2頁(yè)](http://file4.renrendoc.com/view/b097cb6f57edf7fa5185966a44085a10/b097cb6f57edf7fa5185966a44085a102.gif)
![《MySQL數(shù)據(jù)庫(kù)應(yīng)用案例教程》教案 第9課 多表數(shù)據(jù)記錄查詢_第3頁(yè)](http://file4.renrendoc.com/view/b097cb6f57edf7fa5185966a44085a10/b097cb6f57edf7fa5185966a44085a103.gif)
![《MySQL數(shù)據(jù)庫(kù)應(yīng)用案例教程》教案 第9課 多表數(shù)據(jù)記錄查詢_第4頁(yè)](http://file4.renrendoc.com/view/b097cb6f57edf7fa5185966a44085a10/b097cb6f57edf7fa5185966a44085a104.gif)
![《MySQL數(shù)據(jù)庫(kù)應(yīng)用案例教程》教案 第9課 多表數(shù)據(jù)記錄查詢_第5頁(yè)](http://file4.renrendoc.com/view/b097cb6f57edf7fa5185966a44085a10/b097cb6f57edf7fa5185966a44085a105.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
課題多表數(shù)據(jù)記錄直詢
課時(shí)2課時(shí)(90min)
知識(shí)技能目標(biāo):
(1)掌握多表連接查詢的方法
(2)掌握FROM子句和WHERE子句中子查詢的使用方法
教學(xué)目標(biāo)(3)掌握使用UNION關(guān)鍵字合并查詢結(jié)果的方法
素質(zhì)目標(biāo):
(1)了解數(shù)據(jù)庫(kù)前沿技術(shù),緊跟時(shí)代發(fā)展
(2)了解數(shù)據(jù)庫(kù)在生活中的應(yīng)用
教學(xué)重點(diǎn):多表連接查詢的方法
教學(xué)重難點(diǎn)教學(xué)難點(diǎn):FROM子句和WHERE子句中子查詢的使用方法,使用UNION關(guān)鍵字合并查詢結(jié)果的方
法
教學(xué)方法案例分析法、問(wèn)答法、討論法、講授法、實(shí)踐法
教學(xué)用具電腦、投影儀、多媒體課件、教材
第1節(jié)課:課前彳珍一考勤(2min)一問(wèn)題導(dǎo)入(5min)一傳授新知(38min)
教學(xué)設(shè)計(jì)第2節(jié)課:?jiǎn)栴}導(dǎo)入(5min)一傳授新知(20min)一?課堂實(shí)訓(xùn)(15min)一課堂小結(jié)(3min)一作
業(yè)布置(2min)
教學(xué)過(guò)程主要教學(xué)內(nèi)容及步驟設(shè)計(jì)意圖
第一節(jié)課
通過(guò)課前任務(wù),
【教師】布置課前任務(wù),和學(xué)生負(fù)責(zé)人取得聯(lián)系,讓其提醒同學(xué)通過(guò)APP或其他
使學(xué)生預(yù)習(xí)本節(jié)
學(xué)習(xí)軟件,預(yù)習(xí)本節(jié)課要學(xué)習(xí)的知識(shí)
課前任務(wù)課要學(xué)習(xí)的知識(shí),
【學(xué)生】完成課前任務(wù)增加學(xué)生的學(xué)習(xí)
興趣
【教師】使用APP進(jìn)行簽到培養(yǎng)學(xué)生的組
考勤
織紀(jì)律性,掌握學(xué)
(2min)【學(xué)生】班干部報(bào)請(qǐng)假人員及原因
生的出勤情況
【教師】提出以下問(wèn)題:通過(guò)問(wèn)題導(dǎo)入,
問(wèn)題導(dǎo)入
如何在多張數(shù)據(jù)表中進(jìn)行查詢?引導(dǎo)學(xué)生主動(dòng)思
(5min)考,激發(fā)學(xué)生的學(xué)
【學(xué)生】聆聽(tīng)'思考、舉手回答習(xí)興趣
【教師】通過(guò)學(xué)生的回答引入要講的知識(shí),講解連接查詢的相關(guān)知識(shí)
8.1連接查詢通過(guò)教師的講
傳授新知解和演示,使學(xué)生
中【教師】隨機(jī)邀請(qǐng)學(xué)生回答以下問(wèn)題:
(38min)了解連接查詢的
什么是連接查詢?相關(guān)知識(shí)
}【學(xué)生】聆聽(tīng)、思考、回答
+【教師】總結(jié)學(xué)生的回答
在關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)中,通常一張表只會(huì)存儲(chǔ)一個(gè)實(shí)體的相關(guān)信息,如果
用戶需要查詢多張表中不同實(shí)體的數(shù)據(jù)可以使用關(guān)鍵字JOIN對(duì)表執(zhí)行連接查詢操
作,但前提條件是,這些表中必須存在具有相同意義的字段.連接查詢主要包括內(nèi)
連接查詢和外連接查詢,另外還可以在連接查詢中添加過(guò)濾條件,篩選符合條件的
數(shù)據(jù),這就是復(fù)合條件連接查詢。
8.1.1內(nèi)連接查詢
★【教師】組織學(xué)生掃碼觀看”內(nèi)連接查詢“視頻(詳見(jiàn)教材),讓學(xué)生對(duì)基
本知識(shí)有一個(gè)大致的了解
內(nèi)連接查詢(INNERJOIN)是使用比較運(yùn)算符對(duì)多個(gè)表間的某些列數(shù)據(jù)進(jìn)行比
較,并列出這些表中與連接條件相匹配的數(shù)據(jù)行,組合成新的記錄。表之間的連接
條件由表中具有相同意義的字段組成。
〉【教師】通過(guò)多媒體展示"staff表結(jié)構(gòu)"和"section表結(jié)構(gòu)”表格,介紹
相關(guān)知識(shí)
為便于講解,首先需要?jiǎng)?chuàng)建一個(gè)數(shù)據(jù)庫(kù)staff,并在其中創(chuàng)建兩個(gè)數(shù)據(jù)表staff和
section,兩個(gè)表的結(jié)構(gòu)分別如表8-1和表8-2所不。
表8-1staff表結(jié)構(gòu)
字段數(shù)據(jù)類(lèi)型約束注釋
無(wú)符號(hào)、主鍵、自增、
stafflidINT(IO)員工ID
非空
section_idINT(IO)無(wú)符號(hào)、非空部門(mén)ID
positions_idINT(IO)非空職位ID
nameVARCHAR(IO)非空姓名
sexENUMC男;女)非空性別
phone_numberCHAR(ll)非空手機(jī)號(hào)
無(wú)符號(hào)、非空,默認(rèn)值
moneyDECIMAL(10,2)薪資
0
entry_dateDATETIME非空入職時(shí)間
表8-2section表結(jié)構(gòu)
字段數(shù)據(jù)類(lèi)型約束注釋
無(wú)符號(hào)、主鍵、自增、
sectionedINT(IO)部門(mén)ID
非空
section_titleVARCHAR(20)非空部門(mén)名稱
【實(shí)例8-1]本例首先創(chuàng)建數(shù)據(jù)庫(kù)staff,然后參照表8-1和表8-2創(chuàng)建數(shù)據(jù)表
staff和section,并在其中插入數(shù)據(jù)。
步驟1登錄MySQL后執(zhí)行以下語(yǔ)句,創(chuàng)建數(shù)據(jù)庫(kù)staff。
CREATEDATABASEstaff;
步驟2選擇數(shù)據(jù)庫(kù)staff,并執(zhí)行以下語(yǔ)句創(chuàng)建數(shù)據(jù)表staff。
CREATETABLEstaff
(
staff_idINT(IO)UNSIGNEDNOTNULLAUTOJNCREMENT,
section_idINT(IO)UNSIGNEDNOTNULL,
positionsJdINT(IO)NOTNULL,
nameVARCHAR(IO)NOTNULL,
sexENUMC男;女)NOTNULL,
phone.numberCHAR(ll)NOTNULL,
moneydecimal(10,2)UNSIGNEDNOTNULLDEFAULT'O.OO1,
entry_dateDATETIMENOTNULL,
PRIMARYKEY(staff_id)
);
步驟3執(zhí)行以下SQL語(yǔ)句,向staff表中插入數(shù)據(jù)。
INSERTINTO
staff(stafLid,seclion_id,positions_id,name,sex,phone_number,money,entry_date)
VALUES(1,T,T,‘劉長(zhǎng)生男'.,20000,'2018-04-0214:35:52'),
(2,T,'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',‘張向陽(yáng),15000,12018-04-0314:47:24'),
(6,'4','8','張旭','男',,10000;2018-04-0314:50:52');
……(詳見(jiàn)教材)
1.普通內(nèi)連接查詢
內(nèi)連接查詢的語(yǔ)法形式為:
SELECT{*|col_list)FROMiable_namel
INNERJOINtable_name2ONcondition;
上述語(yǔ)句中,condition表示連接條件。接下來(lái)通過(guò)實(shí)例具體說(shuō)明內(nèi)連接查詢的
用法。
【實(shí)例8-2]在staff表和section表之間使用內(nèi)連接查詢,從staff表中查詢
staffjd(員工ID)、name(姓名)、sex(悵!])和phone_number(手機(jī)號(hào)),從
section表中查詢section_title(部門(mén)名稱),
由表8-1和表8-2的表結(jié)構(gòu)可知,兩個(gè)表都有相同數(shù)據(jù)類(lèi)型的字段sectionjd,
可以通過(guò)該字段建立聯(lián)系。為此,首先選擇數(shù)據(jù)庫(kù)staff,然后執(zhí)行內(nèi)連接查詢語(yǔ)句,
結(jié)果如下:
mysql>SELECTstaff_id,name,sex,section_title,phonc_number
->FROMstaffINNERJOINsection
->ONstaff.section_id=section.section_id;
+--------------+------------------4------------------4-------------------------+--------------------------------------+
|staffLid|name|sex|section_title|phone_number|
+---------+-----------+-----------+---------------+------------------------+
11I劉長(zhǎng)生I男I總經(jīng)辦113753697300|
12|趙霞|女|總經(jīng)辦
131季慶奇|女|財(cái)務(wù)部113753697302|
14|李星宇|男|銷(xiāo)售部
151張向陽(yáng)|男|研發(fā)部113753697304|
16|張旭|男I研發(fā)部
+----------+-----------+----------+----------------+------------------------+
6rowsinset(0.01sec)
【提示】
上述SQL語(yǔ)句中,使用符號(hào)將表名和字段名拼接起來(lái),作用是明確指定字
段所屬的數(shù)據(jù)表,不會(huì)因?yàn)樽侄蚊孛斐上到y(tǒng)無(wú)法識(shí)別。
此處,SELECT語(yǔ)句與前面最大的區(qū)別在于:SELECT后面指定的列分別屬于
兩個(gè)不同的表伺時(shí),FROM子句列出了兩個(gè)表兩個(gè)表之間的關(guān)系通過(guò)INNERJOIN
指定;連接條件使用ON子句給出。
另外,使用WHERE子句也可以給出連接條件,以下語(yǔ)句將返回與前面完全相
同的結(jié)果。
SELECTstafflid,name,sex,section_title,phone_numberFROMstaff,section
WHEREstaff.section_id=section.section_id;
使用WHERE子句定義連接條件簡(jiǎn)單明了,但在某些時(shí)候會(huì)影響查詢性能,而
使用INNERJOIN語(yǔ)法能夠確保不會(huì)忘記連接條件。
2.自連接查詢
內(nèi)連接查詢中有一種特殊的查詢,稱為自連接查詢,它是指連接查詢中涉及的
兩張表在物理上是同一張表,但邏輯上可以看成兩張表,語(yǔ)法形式如下:
SELECTtable_alias1.*,table_alias2.*FROMtablc_nameAStable_aliasl
INNERJOINtablc_nameAStable_alias2ONcondition;
上述語(yǔ)句的意義是,將一張表分別命名為table_aliasl和tablc_alias2,然后使用
這兩個(gè)表名進(jìn)行自連接查詢。
【實(shí)例8-3]使用內(nèi)連接查詢語(yǔ)句,從staff表中查詢薪資低于15000的員工
的staffjd(員工ID)、name(姓名)和money(薪資)。
首先選擇數(shù)據(jù)庫(kù)staff,然后執(zhí)行內(nèi)連接查詢語(yǔ)句,結(jié)果如下:
mysql>SELECTs1.staffjd,s1.name,s2.moneyFROMstaffASsi
->INNERJOINstaffASs2ONsl.staff_id=s2.staffjdANDs2.money<15000;
+---------+----------+------------------+
|staffLid|name|money|
+---------+----------+------------------+
I21趙霞|10000.00|
I61張旭|10000.00|
+----------+----------+-----------------+
2rowsinset(0.00sec)
此處查詢的兩個(gè)表是同一個(gè)表staff,為防止產(chǎn)生二義性,使用AS關(guān)鍵字為表
起了別名,staff表第1次以si為別名出現(xiàn),第2次以s2為別名出現(xiàn)。INNERJOIN
連接兩個(gè)表,并按照第2個(gè)表的money值對(duì)數(shù)據(jù)進(jìn)行過(guò)濾.
8.1.2外連接直詢
〉【教師】組織學(xué)生掃碼觀看”外連接和復(fù)合條件連接查詢“視頻(詳見(jiàn)教材),
讓學(xué)生對(duì)基本知識(shí)有一個(gè)大致的了解
外連接查詢(OUTERJOIN)是以一張表為基表,根據(jù)連接條件,與另外一張
表的每一行進(jìn)行匹配,如果沒(méi)有匹配上,則在相關(guān)聯(lián)的結(jié)果行中,另一張表的所有
選擇列均返回空值。
外連接查詢通常分為兩種:左連接查詢(LEFTJOIN)和右連接查詢(RIGHT
JOIN).其基本語(yǔ)法形式如下:
SELECT(*|col_list)FROMtablc_namel
{LEFTIRIGHT)[OUTER]JOINtabie_name2ONcondition;
本節(jié)以第5章創(chuàng)建的goods表和orders表為操作對(duì)象,講解外連接查詢的應(yīng)用,
在前面的操作中已經(jīng)為goods表插入數(shù)據(jù),接下來(lái)為orders表插入數(shù)據(jù)。
【實(shí)例8-4]執(zhí)行SQL語(yǔ)句,向orders表中插入數(shù)據(jù)。
步驟1登錄MySQL,并執(zhí)行以下語(yǔ)句,選擇db_sh叩數(shù)據(jù)庫(kù)。
USEdb_shop;
步驟2執(zhí)行以下語(yǔ)句,關(guān)閉orders表的外鍵約束。
SETFOREIGN_KEY_CHECKS=0;
【提示】
對(duì)于先創(chuàng)建表關(guān)系,之后才插入數(shù)據(jù)的表,在其中插入數(shù)據(jù)時(shí)需要先關(guān)閉外鍵
約束,否則會(huì)插入不成功。由于前面在創(chuàng)建orders表時(shí)為其設(shè)置了外鍵約束,此處
先將其關(guān)閉,待插入數(shù)據(jù)后再開(kāi)啟。開(kāi)啟表外鍵約束的語(yǔ)句為SET
FOREIGN_KEY_CHECKS=1;.
步驟3執(zhí)行SQL語(yǔ)句,向orders表中插入數(shù)據(jù),結(jié)果如下所示。
mysql>INSERTINTOorders(o_id,add_time,goods_id)
->VALUES(1,2018-04-0214:35:52\6),
->(272018-04-0314:40:52;1),
->(3/2018-04-0314:43:57,5),
->(4/2018-04-0314:45:521,1),
->(5/2018-04-0314:47:24,,15),
->(6/2018-04-0314:50:52,,4);
QueryOK,6rowsaffected(0.06sec)
Records:6Duplicates:0Warnings:0
1.左連接查詢
在外連接查詢語(yǔ)句中,LEFTJOIN關(guān)鍵字之前的表稱為左表,左連接查詢會(huì)以
左表為基表,與另外一張表的每一行進(jìn)行匹配,如果符合連接條件,則返回兩張表
相對(duì)應(yīng)的行;如果不符合,則只返回左表中的行,并且其對(duì)應(yīng)的行為一個(gè)空值。
【實(shí)例8-5]執(zhí)行左連接查詢語(yǔ)句,查詢goods表中哪些商品有訂單,哪些商
品沒(méi)有訂單。
由于goods表中的id字段對(duì)應(yīng)orders表中的goods_id字段,此處將這兩個(gè)字段
進(jìn)行比較,如果goods表中的id字段在orders表中有對(duì)應(yīng)的goods_id值,則返回其
對(duì)應(yīng)的。一id值;否則就表示該商品沒(méi)有對(duì)應(yīng)訂單,返回空值。執(zhí)行結(jié)果如下:
mysql>SELECTgoods.id,,orders.o_idFROMgoods
->LEFTJOINordersONgoods.id=orders.goods_id;
+--+----------+------+
|id|name|o_id|
+——+----------+------+
14|休閑西服|6|
151果汁|3|
131水果糖INULL|
19|牛仔褲|NULL|
12|牛奶糖|NULL|
|10|紅樓夢(mèng)|NULL|
18|蘋(píng)果|NULL|
111西游記12|
111西游記14|
171西瓜INULL|
161論語(yǔ)|1|
+---+---------+-------+
11rowsinset(0.04sec)
由結(jié)果可以看出,goods表中id值為2,3,7,8,9和10的商品所對(duì)應(yīng)的訂單
信息為空值,說(shuō)明這幾種商品沒(méi)有客戶下訂單。
2.右連接查詢
在外連接查詢語(yǔ)句中,RIGHTJOIN關(guān)鍵字之后的表稱為右表,右連接查詢會(huì)
以右表為基表,與另外一張表的每一行進(jìn)行匹配,如果符合連接條件,則返回兩張
表相對(duì)應(yīng)的行;如果不符合,則只返回右表中的行,并且其對(duì)應(yīng)的行為一個(gè)空值。
【實(shí)例8-6]執(zhí)行右連接查詢語(yǔ)句,查詢訂單中所對(duì)應(yīng)的商品哪些仍然存在,
哪些已經(jīng)刪除。
與實(shí)例8-5類(lèi)似,依然將商品編號(hào)進(jìn)行比較,所不同的是,此處是將orders表
中的goodsjd與goods表中的id字段逐行進(jìn)行比較,如果在goods表中有對(duì)應(yīng)的記
錄,則返回相應(yīng)的name值,如果沒(méi)有則返回空值。執(zhí)行結(jié)果如下:
mysql>SELECTorders.o_id,orders.add_time,FROMgoods
->RIGHTJOINordersONorders.goods_id=goods.id;
+-----+-------------------+----------+
|o_id|add_time|name|
+------+----------------------+------------+
I112018-04-0214:35:52|論語(yǔ)|
|2|2018-04-0314:40:52|西游記|
|312018-04-0314:43:52|果汁|
|412018-04-0314:45:52|西游記|
|512018-04-0314:47:24|NULL|
I612018-04-0314:50:52|休閑西服|
+-------+----------------------+------------+
6rowsinset(0.00sec)
由結(jié)果可以看出,orders表中o_id值為5的訂單所對(duì)應(yīng)的商品信息為空值,說(shuō)
明該商品已被刪除。
8.1.3復(fù)合條件連接查詢
復(fù)合條件連接杳詢是通過(guò)在連接查詢中添加過(guò)濾條件,以達(dá)到限制查詢結(jié)果和
篩選數(shù)據(jù)的目的,下面通過(guò)實(shí)例進(jìn)行介紹。
【實(shí)例8-7】在staff表和section表中,執(zhí)行內(nèi)連接查詢語(yǔ)句,查詢section表
中部門(mén)名稱為“總經(jīng)辦"的員工ID、姓名、性別和電話號(hào)碼等信息。
步驟1登錄MySQL,并執(zhí)行以下語(yǔ)句,選擇staff數(shù)據(jù)庫(kù)。
USEstaff;
步驟2執(zhí)行以下SQL語(yǔ)句,在staff表和section表中查詢部門(mén)名稱為"總經(jīng)
辦"的員工ID、姓名、性別和電話號(hào)碼,執(zhí)行結(jié)果如下:
mysql>SELECTstaff_id,name,sex,section_title,phone_number
->FROMstaffINNERJOINsection
->ONstaff.section_id=section.section_id
->WHEREsection.section_title='總經(jīng)辦';
+------+-------+----+----------+-------------+
|staff_id1name|sex|section_title|phone_number|
+------+--------+----+------------4----------------+
11I劉長(zhǎng)生I男|總經(jīng)辦113753697300|
12|趙霞|女|總經(jīng)辦
+-----+-------+----+----------+-------------+
2rowsinset(0.00sec)
可以看出,在限制了部門(mén)名稱為總經(jīng)辦后,此處只返回了在總經(jīng)辦任職的員工
信息??梢詫⒃摻Y(jié)果與實(shí)例8-2的查詢結(jié)果進(jìn)行匕匕較.
【實(shí)例8-8]執(zhí)行左連接查詢語(yǔ)句,查詢goods表中哪些商品有訂單,哪些商
品沒(méi)有訂單,并使用商品1D號(hào)對(duì)查詢結(jié)果進(jìn)行排序。
步驟1登錄MySQL,并執(zhí)行以下語(yǔ)句,選擇db_shop數(shù)據(jù)庫(kù)。
USEdb_shop;
步驟2執(zhí)行以下SQL語(yǔ)句,在goods表和orders表中查詢哪些商品有訂單,
哪些商品沒(méi)有訂單,并使用商品ID號(hào)對(duì)查詢結(jié)果進(jìn)行排序,執(zhí)行結(jié)果如下:
mysql>SELECTgoods.id,,orders.o_idFROMgoodsLEFTJOINorders
->ONgoods.id=orders.goods_idORDERBYgoods.id;
+---+----------+-------+
|id|name|o_id|
+--+----------+-------+
111西游記12|
111西游記14|
12|牛奶糖|NULL|
13|水果糖INULL|
14|休閑西服|6|
15|果汁13|
16|論語(yǔ)111
17|西瓜|NULL|
I8|蘋(píng)果|NULL|
19|牛仔褲|NULL|
|10I紅樓夢(mèng)INULL|
+----+----------+-------+
11rowsinset(0.01sec)
與實(shí)例8-5的查詢結(jié)果進(jìn)行比較,可以看出,在對(duì)商品信息進(jìn)行排序后,可以
更加方便地查看信息。
【學(xué)生】聆聽(tīng)、思考、記錄
第二節(jié)課
【教師】提出以下問(wèn)題:通過(guò)問(wèn)題導(dǎo)入,
問(wèn)題導(dǎo)入什么是主查詢和子查詢?引導(dǎo)學(xué)生主動(dòng)思
(5min)考,激發(fā)學(xué)生的學(xué)
【學(xué)生】思考、舉手回答
習(xí)興趣
【教師】通過(guò)學(xué)生的回答引入新知,介紹子查詢和合并查詢結(jié)果的相關(guān)知識(shí)
8.2子查詢通過(guò)教師的講
+【教師】組織學(xué)生掃碼觀看“子查詢"視頻(詳見(jiàn)教材),讓學(xué)生對(duì)基本知解和演示,使學(xué)生
傳授新知了解子查詢和合
識(shí)有一個(gè)大致的了解
(20min)并查詢結(jié)果的相
如果一個(gè)查詢語(yǔ)句中嵌套了一個(gè)或若干個(gè)其他的查詢語(yǔ)句,那么在整個(gè)語(yǔ)句中,關(guān)知識(shí)
外層查詢稱為主查詢,內(nèi)層查詢稱為子查詢或者嵌套查詢。該類(lèi)查詢可以基于一個(gè)
表或多個(gè)表。在此類(lèi)查詢中,系統(tǒng)會(huì)先執(zhí)行子查詢,將子查詢的結(jié)果作為主查詢的
過(guò)濾條件。
子查詢可以應(yīng)用在SELECT,UPDATE和DELETE語(yǔ)句中,并且大多數(shù)子查詢
會(huì)包含在FROM子句或WHERE子句中,在WHERE子句中通常與IN,ANY,ALL
和EXISTS關(guān)鍵字搭配使用,也可以使用條件判斷符。本節(jié)主要講解SELECT語(yǔ)句
中的子查詢。
8.2.1FROM子句中的子查詢
FROM子句中的子查詢會(huì)生成一個(gè)臨時(shí)表,由于FROM子句中的每個(gè)表都必須
有一個(gè)名稱,因此應(yīng)該為臨時(shí)表取一個(gè)別名,語(yǔ)法形式如下:
SELECT(*|col_list)FROM(SELECT*FROMtable_name)AStable_alias
[WHEREcondition];
上述語(yǔ)句中,table_alias表示表別名,下面通過(guò)實(shí)例介紹上述語(yǔ)句的應(yīng)用.
【實(shí)例8-9]執(zhí)行查詢語(yǔ)句,查詢goods表中id值大于3,且num值大于10
的商品的id和name值。
步驟1登錄MySQL,并執(zhí)行以下語(yǔ)句,選擇db_shop數(shù)據(jù)庫(kù)。
USEdb_shop;
步驟2執(zhí)行以下語(yǔ)句,查詢goods表中id值大于3的數(shù)據(jù)記錄,結(jié)果如下:
mysql>SELECT*FROMgoodsWHEREid>3;
+——+-----------4------------------------+---------------4----------------+------------------------------------------------+
|id|type|name|price|num|add_time|
+——+----+---------+------+------+-------------------+
I4|服飾|休閑西服1800.00|10|2018-04-0413:40:40|
I5|飲品I果汁I2.50|7012018-05-0513:40:40|
|6|書(shū)籍|論語(yǔ)|109.00|5012018-01-0313:40:40|
|7|水果|西瓜|1.50|NULL|2018-02-0513:40:40|
|8|水果|蘋(píng)果|3.00|10012018-03-0513:40:40|
|9I服飾I牛仔褲|120.00|1012018-05-0413:40:40|
|10|書(shū)籍|紅樓夢(mèng)|50.50|1512018-05-0613:40:40|
+一一+----+---------+------+------+-------------------+
7rowsinset(0.04sec)
步驟3執(zhí)行嵌套笥旬,將上述語(yǔ)句作為子查詢,在其生成的臨時(shí)表gl中查詢
num值大于10的商品的id和name值,查詢結(jié)果如下:
mysql>SELECTid,namefrom(SELECT*FROMgoodsWHEREid>3)ASgl
->WHEREnum>10;
+_…+-----------------4-
|id|name|
+——+------+
15|果汁I
161論語(yǔ)I
18I蘋(píng)果I
110|紅樓夢(mèng)|
++-------+
4rowsinset(0.00sec)
8.2.2WHERE子句中的子查詢
包含在WHERE子句中的子查詢,其查詢結(jié)果通常是單列數(shù)據(jù),系統(tǒng)執(zhí)行子查
詢后,子查詢的結(jié)果會(huì)作為主查詢的篩選條件。
1.使用IN關(guān)鍵字的子查詢
當(dāng)子查詢返回的是一個(gè)數(shù)據(jù)集合,主查詢需要返回符合集合中條件的記錄時(shí),
可以使用1N關(guān)鍵字,語(yǔ)法形式如下:
SELECT{*|col_list}FROMtablc_namcl
WHEREcol_namelIN
(SELECTcol_name2FROMtable_name2[WHEREcondition]);
上述語(yǔ)句中col_namcl為表1中的字段,col_name2為表2中的字段。
【實(shí)例8-10]執(zhí)行查詢語(yǔ)句,查詢orders表中字段goods_id的所有值,然后
使用子查詢結(jié)果拼接WHERE條件,查詢goods_id值對(duì)應(yīng)的所有商品的詳細(xì)信息。
步驟1登錄MySQL,并執(zhí)行以下語(yǔ)句,選擇db_shop數(shù)據(jù)庫(kù)。
USEdb_shop;
步驟2執(zhí)行SQL語(yǔ)句,查詢orders表中字段goods_id的所有值,執(zhí)行結(jié)果如
下:
mysql>SELECTgoods_idFROMorders;
+----------+
|goods_id|
+......................+
|1|
|1|
|4|
|5|
|6|
|15|
++
6rowsinset(0.00sec)
步驟3執(zhí)行SQL語(yǔ)句,使用上述查詢結(jié)果作為子查詢,在goods表中查詢
goods_id值對(duì)應(yīng)的商品的詳細(xì)信息,執(zhí)行結(jié)果如下:
mysql>SELECT*FROMgoodsWHEREidIN(SELECTgoods.idFROMorders);
+--+----+---------+------+------+-------------------+
|id|type|name|price|num|add」ime|
+——+----+---------+------+------+-------------------+
|1I書(shū)籍I西游記I50.40|2012018-01-0113:40:40|
|4|服飾|休閑西服|800.00|1012018-04-0413:40:40|
|5|飲品|果汁|2.50|7012018-05-0513:40:40|
|6|書(shū)籍|論語(yǔ)|109.0015012018-01-0313:40:40|
+----+----+----------+-----+------+-------------------+
4rowsinset(0.04sec)
執(zhí)行結(jié)果成功顯示出訂單中商品的詳細(xì)信息,但由于goods_id為15的商品不
在goods表中,所以沒(méi)有顯示出該商品的信息。
另外,子查詢還可以和NOTIN配合使用,下面通過(guò)實(shí)例進(jìn)行介紹。
【實(shí)例8-11】執(zhí)行SQL語(yǔ)句,依然以前面的查詢結(jié)果作為子查詢,在goods
表中查詢沒(méi)有訂單的商品的詳細(xì)信息,執(zhí)行結(jié)果如下:
mysql>SELECT*FROMgoodsWHEREidNOTIN(SELECTgoods_idFROM
orders);
+----+----+-------+--------+------+-------------------+
|id|type|name|price|num|add_time|
+——+----+-------+--------+------+-------------------+
I2|糖類(lèi)|牛奶糖|7.50|20012018-02-0213:40:40|
|3|糖類(lèi)|水果糖|2.50|10012018-06-0911:20:55|
|7|水果|西瓜|1.50INULL12018-02-0513:40:40|
|8|水果|蘋(píng)果|3.00|10012018-03-0513:40:40|
|9|服飾|牛仔褲|120.00|1012018-05-0413:40:40|
|10I書(shū)籍I紅樓夢(mèng)I50.5011512018-05-0613:40:40|
+——+----+-------+-------+------+-------------------+
6rowsinset(0.04sec)
2.使用ANY、SOME關(guān)鍵字的子查詢
ANY和SOME是同義詞,表示滿足其中任一條件。該類(lèi)查詢會(huì)創(chuàng)建一個(gè)表達(dá)
式對(duì)子查詢的返回值列表進(jìn)行比較,只要滿足子查詢中的任一個(gè)比較條件,就返回
一個(gè)結(jié)果。其語(yǔ)法形式如下:
SELECT(*|col_list)FROMtablc_namel
WHEREcol_namel<any
(SELECTcol_name2FROMtable_name2[WHEREcondition]);
【實(shí)例8-12】執(zhí)行SQL語(yǔ)句,在goods表中查詢2018年4月2號(hào)以后訂單
中的商品信息。
步驟1登錄MySQL,并執(zhí)行以下語(yǔ)句,選擇db.shop數(shù)據(jù)庫(kù)。
USEdb_shop;
步驟2執(zhí)行SQL語(yǔ)句,查詢orders表中2018年4月2號(hào)以后的訂單中的
goods_id的所有值,結(jié)果如下:
mysql>SELECTgoods_idFROMordersWHEREadd_time>'2018-04-02,;
+--------+
Igoods_id|
+--------+
16|
111
15|
111
115|
14|
+--------+
6rowsinset(0.00sec)
步驟3執(zhí)行SQL語(yǔ)句,使用上述查詢結(jié)果作為子查詢,在goods表中查詢
goods_id值對(duì)應(yīng)的商品的詳細(xì)信息,結(jié)果如下:
mysql>SELECT*FROMgoods
->WHEREid=ANY(SELECTgoodsjdFROMordersWHERE
add_time>'2018-04-02');
+----+----+--------+------+------+-------------------+
|id|type|name|price|num|add_time|
+--+----+--------+------+------+-------------------+
|6|書(shū)籍|論語(yǔ)|109.00|5012018-01-0313:40:40|
|1I書(shū)籍I西游記I50.40|2012018-01-0113:40:40|
|5|飲品|果汁|2.50|7012018-05-0513:40:40|
|41服飾|休閑西服1800.00|10|2018-04-0413:40:40|
+--+----+---------+------+-------+------------------+
4rowsinset(0.00sec)
【提示】
由上述查詢結(jié)果可以看出,使用"=ANY"與使用關(guān)鍵字IN的效果實(shí)際上是相
同的,除"="外,ANY關(guān)鍵字前面可以使用的條件判斷符還有"<="
和"〉=",讀者可根據(jù)需要進(jìn)行選擇.
3.使用ALL關(guān)鍵字的子查詢
與ANY和SOME不同,使用關(guān)鍵字ALL的子查詢,表示當(dāng)一條記錄符合子查
詢結(jié)果中所有的條件時(shí),才會(huì)返回該記錄。其語(yǔ)法形式如下:
SELECT{*|col_list}FROMtable_namel
WHEREcol_namel>All
(SELECTcol_name2FROMtable_name2[WHERE條件]);
【實(shí)例8-13]執(zhí)行以下語(yǔ)句,查詢goods表中id值比子查詢結(jié)果中的最大數(shù)
據(jù)還要大的記錄.
步驟1登錄MySQL,并執(zhí)行以下語(yǔ)句,選擇db_sh叩數(shù)據(jù)庫(kù)。
USEdb_shop;
步驟2執(zhí)行SQL語(yǔ)句,查詢orders表中2018年4月3號(hào)之前的訂單中的
goods_id的所有值,結(jié)果如下:
mysql>SELECTgoods.idFROMordersWHEREadd_time<'2018-04-03';
+----------+
|goods_id|
+----------+
16|
14|
+----------+
2rowsinset(0.00sec)
【提示】
為驗(yàn)證查詢結(jié)果,此處事先將orders表中第6條記錄的添加時(shí)間改為了
2018-04-0114:47:24.
步驟3執(zhí)行SQL語(yǔ)句,使用上述查詢結(jié)果作為子查詢,在goods表中查詢
goods.id值對(duì)應(yīng)的商品的詳細(xì)信息,結(jié)果如下:
mysql>SELECT*FROMgoods
->WHEREid>ALL(SELECTgoodsjdFROMordersWHERE
addjime^O18-04-03');
+——+------------4------------------+--------------------4-----------------+-----------------------------------------------+
|id|type|name|price|num|add_time|
+——+----+-------+--------+------+------------------+
I7|水果|西瓜|1.50INULL12018-02-0513:40:40|
|8|水果|蘋(píng)果|3.00|100R018-03-0513:40:40|
|9|服飾|牛仔褲|120.00|1012018-05-0413:40:40|
|10I書(shū)籍I紅樓夢(mèng)|50.5011512018-05-0613:40:40|
+——+-----+------+--------+------+-------------------+
4rowsinset(0.00sec)
可以看出,查詢結(jié)果中所有記錄的id值都同時(shí)大于子查詢結(jié)果中的4和6。
【提示】
ALL關(guān)鍵字之前可以使用的條件判斷符有">""<="和">=",但一般
不會(huì)使用.
4.使用EXISTS關(guān)鍵字的子查詢
使用EXISTS關(guān)鍵字,系統(tǒng)會(huì)對(duì)子查詢的返回結(jié)果進(jìn)行判斷,如果子查詢至少
返回一行記錄,那么EXISTS的結(jié)果為T(mén)RUE,此時(shí)主查詢語(yǔ)句將會(huì)執(zhí)行;如果子
查詢沒(méi)有返回任^記錄,那么EXISTS的結(jié)果為FALSE,此時(shí)主查詢語(yǔ)句將不會(huì)執(zhí)
行。其語(yǔ)法形式如下:
SELECT{*|col_list)FROMtable_namel
WHEREEXISTS(SELECT*FROMtable_name2);
【實(shí)例8-14]查詢orders表中是否存在goodsjd值為5的記錄,如果存在,
則查詢goods表中id值小于5的記錄。
在選中數(shù)據(jù)庫(kù)db_shop后,執(zhí)行SQL語(yǔ)句,使用EXISTS關(guān)鍵字查詢goods表
中id值小于5的記錄,查詢結(jié)果如下:
mysql>SELECT*FROMgoodsWHEREid<'5'AND
->EXISTS(SELECTo_idFROMordersWHEREgoods_id=,5,);
+——+----+---------+------+------+-------------------+
|id|type|name|price|num|add_time|
+--+----+---------+------+------+-------------------+
|1I書(shū)籍|西游記I50.40|20R018-01-0I13:40:40|
|21糖類(lèi)|牛奶糖|7.50|20012018-02-0213:40:40|
|31糖類(lèi)|水果糖|2.50|10012018-06-0911:20:55|
|4|服飾|休閑西服|800.00|1012018-04-0413:40:40|
+——+----+---------+------+-------+------------------+
4rowsinset(0.02sec)
由查詢結(jié)果可知,子查詢結(jié)果表明orders表中存在goods_id=5的記錄,因此
EXISTS表達(dá)式返回true;主查詢語(yǔ)句接收true之后根據(jù)查詢條件id<5對(duì)goods表
進(jìn)行查詢,返回4條符合條件的記錄。
NOTEXISTS與EXISTS使用方法相同,返回的結(jié)果相反,讀者可自行嘗試.
5.使用條件判斷符的子查詢
在子查詢中,還可以單獨(dú)使用條件判斷符.其語(yǔ)法形式如下:
SELECT{*|col_list}FROMtable_name1
WHEREcol_nameloperators
(SELECTcol_name2FROMtable_name2);
上述語(yǔ)句中,operators表示條件判斷符。
【實(shí)例8-15】查詢goods表中ojd值等于3的商品的詳細(xì)信息。
在選中數(shù)據(jù)庫(kù)db_shop后執(zhí)行SQL語(yǔ)句使用條件判斷符查詢goods表中o_id
值等于3的商品的詳細(xì)信息。查詢結(jié)果如下:
mysql>SELECT*FROMgoods
->WHEREid=(SELECTgoods_idFROMordersWHEREo_id=3);
+--+----+----+------+------+-------------------+
|id|type|name|price|num|add_time|
+--+----+----+------+-------+-------------------+
|5|飲品|果汁|2.50|7012018-05-0513:40:40|
+---+----+----+------+-------+-------------------+
1rowinset(0.06sec)
8.3合并查詢結(jié)果
合并查詢結(jié)果就是使用UNION關(guān)鍵字,將多條查詢語(yǔ)句的結(jié)果合并在一起顯
示。UNION有兩種使用方法,一種是查詢結(jié)果不重復(fù)(過(guò)濾掉重復(fù)的記錄),另一
種是保留所有查詢結(jié)果。
為便于講解,首先創(chuàng)建兩張表,分別為愛(ài)好音樂(lè)的學(xué)生表(music)和愛(ài)好舞蹈
的學(xué)生表(dance),具體操作見(jiàn)實(shí)例8-16.
【實(shí)例8-16]參照表8-3創(chuàng)建兩張結(jié)構(gòu)相同的表,分別命名為music和dance,
之后為各個(gè)表插入數(shù)據(jù)。
+【教師】通過(guò)多媒體展示"表結(jié)構(gòu)"表格,介紹相關(guān)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年成都房產(chǎn)預(yù)約買(mǎi)賣(mài)居間服務(wù)合同
- 2025年公司租賃共享協(xié)議模板
- 2025年報(bào)廢汽車(chē)收購(gòu)與再利用諒解協(xié)議
- 2025年建筑工人雇傭合同樣本
- 2025年建設(shè)銀行二手住房貸款合同
- 2025年全球研發(fā)合作與專(zhuān)利授權(quán)合同范本
- 2025年工程退款協(xié)議書(shū)模板下載
- 2025年專(zhuān)業(yè)清潔服務(wù)勞動(dòng)合同范本
- 2025年分公司之間業(yè)務(wù)合作與分工的策劃協(xié)議
- 2025年交通工具抵債協(xié)議
- 2024年總經(jīng)理助理年終工作總結(jié)(3篇)
- 2024年考研英語(yǔ)(二)真題及參考答案
- 山西省太原市2023-2024學(xué)年高二上學(xué)期期末物理試題(含答案)
- 幼兒園園安全培訓(xùn)
- 沖突礦產(chǎn)課件教學(xué)課件
- 三甲醫(yī)院臨床試驗(yàn)機(jī)構(gòu)-44 V00專(zhuān)業(yè)組SOP目錄
- 酒店工作安全培訓(xùn)(共60張課件)
- 2024年委托招商代理合同經(jīng)典版(三篇)
- 03S702鋼筋混凝土化糞池-標(biāo)準(zhǔn)圖集
- 自我保護(hù)-保護(hù)自己勇敢說(shuō)不
- 安全設(shè)施檢查維護(hù)保養(yǎng)記錄表
評(píng)論
0/150
提交評(píng)論