




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
項(xiàng)目3查詢教學(xué)管理數(shù)據(jù)表對(duì)表數(shù)據(jù)的查詢,單表和多表查詢
查詢教學(xué)管理數(shù)據(jù)表3.1掌握單表查詢3.2掌握連接查詢3.3掌握嵌套查詢
查詢教學(xué)管理數(shù)據(jù)表學(xué)號(hào)sno姓名sname性別ssex出生日期birthday專業(yè)spec20231012101李偉男2002-09-06計(jì)算機(jī)應(yīng)用20231012102張?zhí)m女2003-03-09軟件技術(shù)20231012103王芳女2003-05-06通信技術(shù)20231012104劉勇男2003-06-16軟件技術(shù)課程號(hào)cno課程名cname學(xué)分credit開課學(xué)期termc06101高等數(shù)學(xué)41c06102大學(xué)英語(yǔ)21c06103C語(yǔ)言52c05101軟件工程44學(xué)號(hào)sno課程號(hào)cno成績(jī)grade20231012101c061019020231012101c061028920231012102c061018520231012103c0610375學(xué)生表student課程表course成績(jī)表score3.1掌握單表查詢SELECT語(yǔ)句的一般格式
SELECT[ALL|DISTINCT]<目標(biāo)列表達(dá)式>[,<目標(biāo)列表達(dá)式>]…
FROM<表名或視圖名>[,<表名或視圖名>][WHERE<條件表達(dá)式>][GROUPBY<列名1>[HAVING<條件表達(dá)式>]][ORDERBY<列名2>[ASC|DESC]][LIMIT[OFFSET]記錄數(shù)];
SELECT子句:指定要顯示的屬性列FROM子句:指定查詢對(duì)象(基本表或視圖)WHERE子句:指定查詢條件GROUPBY子句:對(duì)查詢結(jié)果按指定列的值分組,該屬性列值相等的元組為一個(gè)組。通常會(huì)在每組中作用聚集函數(shù)。HAVING短語(yǔ):只有滿足指定條件的組才予以輸出ORDERBY子句:對(duì)查詢結(jié)果表按指定列值的升序或降序排序LIMIT子句:指定只輸出查詢結(jié)果集的部分行3.1掌握單表查詢查詢僅涉及一個(gè)表1.SELECT…FROM基本子句的使用2.使用WHERE子句查詢滿足條件的行3.對(duì)查詢結(jié)果排序(ORDERBY子句)4.使用LIMIT子句限制查詢結(jié)果(LIMIT子句)5.使用聚集函數(shù)6.分組查詢(GROUPBY子句)3.1掌握單表查詢3.1.1SELECT…FROM基本子句的使用1.查詢表中的指定列
【例3.1】查詢?nèi)w學(xué)生的學(xué)號(hào)與姓名。
SELECTsno,snameFROMstudent;【例3.2】查詢?nèi)w學(xué)生的姓名、學(xué)號(hào)、所在專業(yè)。SELECTsname,sno,specFROMstudent;2.查詢?nèi)苛小纠?.3】查詢?nèi)w學(xué)生的信息。SELECT*FROMstudent;等價(jià)于SELECTsno,sname,ssex,birthday,specFROMstudent;3.查詢經(jīng)過(guò)計(jì)算的值
SELECT子句的<目標(biāo)列表達(dá)式>不僅可以是表中的屬性列,還可以是表達(dá)式。
+-------+---------------------+|sname|2025-year(birthday)|+-------+---------------------+|李偉|20||張?zhí)m|19||王芳|19||劉勇|19|+-------+---------------------+3.1.1SELECT…FROM基本子句的使用【例3.4】查詢?nèi)w學(xué)生的姓名及年齡。SELECTsname,2025-year(birthday)FROMstudent;/*假設(shè)當(dāng)時(shí)為2025年*/輸出結(jié)果:4.為列取別名可以通過(guò)指定別名來(lái)改變查詢結(jié)果的列標(biāo)題。在列的別名前也可以添加關(guān)鍵字AS。
+-------+-----------------+------+------------+|sname|ageofstudent:|sage|spec|+-------+-----------------+------+------------+|李偉|ageofstudent:|20|計(jì)算機(jī)應(yīng)用||張?zhí)m|ageofstudent:|19|軟件技術(shù)||王芳|ageofstudent:|19|通信技術(shù)||劉勇|ageofstudent:|19|軟件技術(shù)|+-------+-----------------+------+------------+3.1.1SELECT…FROM基本子句的使用【例3.5】查詢?nèi)w學(xué)生的姓名、年齡和所在專業(yè)。輸出結(jié)果:SELECTsname,'ageofstudent:',2025-year(birthday)sage,specFROMstudent;5.消除取值重復(fù)的行如果希望一個(gè)查詢結(jié)果集中沒(méi)有重復(fù)行,可以使用關(guān)鍵字DISTINCT去除重復(fù)行。如果沒(méi)有指定DISTINCT關(guān)鍵詞,則缺省為ALL。
+-------------+|sno|+-------------+|20231012101||20231012102||20231012103|+-------------+3.1.1SELECT…FROM基本子句的使用【例3.6】查詢選修了課程的學(xué)生學(xué)號(hào)。輸出結(jié)果:SELECTdistinctsnoFROMscore;查詢僅涉及一個(gè)表1.SELECT…FROM基本子句的使用2.使用WHERE子句查詢滿足條件的行3.對(duì)查詢結(jié)果排序(ORDERBY子句)4.使用LIMIT子句限制查詢結(jié)果5.使用聚集函數(shù)6.分組查詢(GROUPBY子句)3.1掌握單表查詢3.1.2使用where子句查詢滿足條件的行查詢條件謂詞比較=,>,<,>=,<=,!=,<>,!>,!<;NOT+上述比較運(yùn)算符確定范圍BETWEENAND,NOTBETWEENAND確定集合IN,NOTIN字符匹配LIKE,NOTLIKE空值ISNULL,ISNOTNULL多重條件(邏輯運(yùn)算)AND,OR,NOTWHERE子句常用的查詢條件:3.1.2使用where子句查詢滿足條件的行1.比較大小用于比較的運(yùn)算符一般是關(guān)系運(yùn)算符,如=(等于),>(大于),<(小于),>=(大于或等于),<=(小于或等于),!=或<>(不等于),!>(不大于),!<(不小于)。【例3.7】查詢軟件技術(shù)專業(yè)全體學(xué)生的姓名。SELECTsnameFROMstudentWHEREspec='軟件技術(shù)';【例3.8】查詢考試成績(jī)不及格的學(xué)生的學(xué)號(hào)。SELECTDISTINCTsnoFROMscoreWHEREgrade<60;3.1.2使用where子句查詢滿足條件的行2.確定范圍謂詞BETWEEN…AND…和NOTBETWEEN…AND…可以用來(lái)查找列值在(或不在)指定范圍的元組,其中,BETWEEN后是范圍的下限(低值),AND后是范圍的上限(高值)?!纠?.9】查找成績(jī)?cè)?0~90的學(xué)號(hào)、課程號(hào)和成績(jī)。SELECTsno,cno,gradeFROMscoreWHEREgradeBETWEEN80AND90;【例3.10】查找成績(jī)不在80~90的學(xué)號(hào)、課程號(hào)和成績(jī)。SELECTsno,cno,gradeFROMscoreWHEREgradeNOTBETWEEN80AND90;3.1.2使用where子句查詢滿足條件的行3.確定集合謂詞IN可以用來(lái)查找列值屬于指定集合的記錄?!纠?.11】查詢軟件技術(shù)專業(yè)、計(jì)算機(jī)應(yīng)用技術(shù)專業(yè)和通信技術(shù)專業(yè)學(xué)生的姓名和性別。SELECTsname,ssexFROMstudentWHEREspecIN('軟件技術(shù)','計(jì)算機(jī)應(yīng)用技術(shù)','通信技術(shù)');【例3.12】查詢既不是軟件技術(shù)專業(yè)、計(jì)算機(jī)應(yīng)用技術(shù)專業(yè),又不是通信技術(shù)專業(yè)的學(xué)生的姓名和性別。SELECTsname,ssexFROMstudentWHEREspecNOTIN('軟件技術(shù)','計(jì)算機(jī)應(yīng)用技術(shù)','通信技術(shù)');3.1.2使用where子句查詢滿足條件的行4.字符匹配謂詞LIKE可以用來(lái)進(jìn)行字符串的匹配。其一般的語(yǔ)法格式如下。[NOT]LIKE'<匹配串>'[ESCAPE'<轉(zhuǎn)義字符>']<匹配串>可以是一個(gè)完整的字符串,也可以是含有通配符%和_的字符串。(1)通配符%(百分號(hào))代表任意長(zhǎng)度(長(zhǎng)度可以是0)的字符串。例如,a%b表示以a開頭、以b結(jié)尾的任意長(zhǎng)度的字符串。(2)通配符_(下劃線)代表任意單個(gè)字符。例如,a_b表示以a開頭、以b結(jié)尾的長(zhǎng)度為3的任意字符串。【例3.13】查詢學(xué)號(hào)為20231012101的學(xué)生的詳細(xì)情況。SELECT*FROMstudentWHEREsnoLIKE'20231012101';等價(jià)于SELECT*FROMstudentWHEREsno='20231012101';3.1.2使用where子句查詢滿足條件的行4.字符匹配【例3.14】查詢所有姓李的學(xué)生的姓名、學(xué)號(hào)和性別。SELECTsname,sno,ssexFROMstudentWHEREsnameLIKE'李%';【例3.16】查詢名字中第二個(gè)字為“白”的學(xué)生的姓名、學(xué)號(hào)和性別。SELECTsname,sno,ssexFROMstudentWHEREsnameLIKE'_白%';謂詞LIKE可以用來(lái)進(jìn)行字符串的匹配。其一般的語(yǔ)法格式如下。[NOT]LIKE'<匹配串>'[ESCAPE'<轉(zhuǎn)義字符>']【例3.17】查詢所有不姓“李”的學(xué)生的姓名、學(xué)號(hào)和性別。SELECTsname,sno,ssexFROMstudentWHEREsnameNOTLIKE'李%';3.1.2使用where子句查詢滿足條件的行4.字符匹配謂詞LIKE可以用來(lái)進(jìn)行字符串的匹配。其一般的語(yǔ)法格式如下?!纠?.18】查詢姓名中包含“_”字符的學(xué)號(hào)和姓名。SELECTsno,snameFROMstudentWHEREsnameLIKE'%/_%'ESCAPE'/';[NOT]LIKE'<匹配串>'[ESCAPE'<轉(zhuǎn)義字符>']ESCAPE'/'表示“/”為轉(zhuǎn)義字符。這樣匹配字符串中緊跟在“/”后的字符“_”不再具有通配符的含義,轉(zhuǎn)義為普通字符“_”。如果要查詢的字符串本身就含有字符%或_,則需要使用ESCAPE'<轉(zhuǎn)義字符>'短語(yǔ)對(duì)通配符進(jìn)行轉(zhuǎn)義。3.1.2使用where子句查詢滿足條件的行5.涉及空值的查詢
判斷是否為空值的查詢用ISNULL或ISNOTNULL謂詞【例】查詢沒(méi)有考試成績(jī)的學(xué)號(hào)和課程號(hào)。SELECTsno,cnoFROMcourseWHEREgradeisnull;【例】查詢查詢沒(méi)有考試成績(jī)的學(xué)號(hào)和課程號(hào)。SELECTsno,cnoFROMcourseWHEREgradeisnotnull;“IS”不能用“=”代替3.1.2使用where子句查詢滿足條件的行6.多重條件查詢邏輯運(yùn)算符AND和OR可用來(lái)連接多個(gè)查詢條件。AND的優(yōu)先級(jí)高于OR,但用戶可以用括號(hào)改變優(yōu)先級(jí)。【例3.19】查詢軟件技術(shù)專業(yè)的男同學(xué)的學(xué)號(hào)和姓名。SELECTsno,snameFROMstudentWHEREspec='軟件技術(shù)'ANDssex='男';【例3.11】查詢軟件技術(shù)專業(yè)、計(jì)算機(jī)應(yīng)用技術(shù)專業(yè)和通信技術(shù)專業(yè)學(xué)生的姓名和性別。SELECTsname,ssexFROMstudentWHEREspec='軟件技術(shù)'ORspec='計(jì)算機(jī)應(yīng)用技術(shù)'ORspec='通信技術(shù)';查詢僅涉及一個(gè)表1.SELECT…FROM基本子句的使用2.使用WHERE子句查詢滿足條件的行3.對(duì)查詢結(jié)果排序(ORDERBY子句)4.使用LIMIT子句限制查詢結(jié)果(LIMIT子句)5.使用聚集函數(shù)6.分組查詢(GROUPBY子句)3.1掌握單表查詢ORDERBY子句可以按一個(gè)或多個(gè)屬性列排序升序:ASC;降序:DESC;缺省值為升序?qū)τ诳罩档呐判颍琈ySQL中設(shè)定空值為最小值,若按升序排列,則含空值的行排在最前面;若按降序排列,則含空值的元組排在最后。3.1.3對(duì)查詢結(jié)果排序3.1.3對(duì)查詢結(jié)果排序(續(xù))
【例3.23】查詢選修了c103號(hào)課程的學(xué)生的學(xué)號(hào)和成績(jī),查詢結(jié)果按分?jǐn)?shù)降序排列。
SELECTsno,gradeFROMscoreWHEREcno='c103'ORDERBYgradeDESC;【例3.24】查詢?nèi)w學(xué)生信息,查詢結(jié)果按專業(yè)升序排列,同一專業(yè)的學(xué)生按出生日期降序排列。SELECT*FROMstudentORDERBYspec,birthdayDESC;查詢僅涉及一個(gè)表1.SELECT…FROM基本子句的使用2.使用WHERE子句查詢滿足條件的行3.對(duì)查詢結(jié)果排序(ORDERBY子句)4.使用LIMIT子句限制查詢結(jié)果(LIMIT子句)5.使用聚集函數(shù)6.分組查詢(GROUPBY子句)3.1掌握單表查詢3.1.4使用LIMIT子句限制查詢結(jié)果
【例3.26】查詢c101號(hào)課程成績(jī)高于75分的行,按照成績(jī)降序排列,從編號(hào)2開始,查詢3條記錄。SELECT*FROMscoreWHEREcno='c101'ANDgrade>75ORDERBYgradeDESCLIMIT2,3;LIMIT子句用于限制查詢結(jié)果輸出行數(shù),可以指定查詢結(jié)果從第幾條記錄開始顯示,還可以指定共顯示多少條記錄?!纠?.25】查詢student表的學(xué)號(hào)、姓名、出生日期和專業(yè)信息,按照出生日期降序排列,顯示前3條記錄。SELECTsno,sname,birthday,specFROMstudentORDERBYbirthdayDESCLIMIT3;查詢僅涉及一個(gè)表1.SELECT…FROM基本子句的使用2.使用WHERE子句查詢滿足條件的行3.對(duì)查詢結(jié)果排序(ORDERBY子句)4.使用LIMIT子句限制查詢結(jié)果(LIMIT子句)5.使用聚集函數(shù)6.分組查詢(GROUPBY子句)3.1掌握單表查詢聚集函數(shù):統(tǒng)計(jì)元組個(gè)數(shù)COUNT(*)統(tǒng)計(jì)一列中值的個(gè)數(shù)COUNT([DISTINCT|ALL]<列名>)計(jì)算一列值的總和(此列必須為數(shù)值型)SUM([DISTINCT|ALL]<列名>) 計(jì)算一列值的平均值(此列必須為數(shù)值型)AVG([DISTINCT|ALL]<列名>)求一列中的最大值和最小值
MAX([DISTINCT|ALL]<列名>)
MIN([DISTINCT|ALL]<列名>)3.1.5使用聚集函數(shù)
聚集函數(shù)(續(xù))
【例3.27】
查詢學(xué)生總?cè)藬?shù)。
SELECTCOUNT(*)FROMStudent;
【例3.28】
查詢選修了課程的學(xué)生人數(shù)。
SELECTCOUNT(DISTINCTSno)FROMscore;
【例3.29】查詢選修了C101號(hào)課程的學(xué)生的平均成績(jī)。
SELECTAVG(Grade)FROMscoreWHERECno='C101';聚集函數(shù)(續(xù))
【例3.30】查詢選修了C101號(hào)課程的學(xué)生的最高分?jǐn)?shù)。SELECTMAX(Grade)FROMscoreWHERECno='C101';
【例3.31】查詢“20231012101”學(xué)生的總成績(jī)和平均成績(jī)。
SELECT
SUM(grade),AVG(grade)FROMscoreWHERESno='20231012101';查詢僅涉及一個(gè)表1.SELECT…FROM基本子句的使用2.使用WHERE子句查詢滿足條件的行3.對(duì)查詢結(jié)果排序(ORDERBY子句)4.使用LIMIT子句限制查詢結(jié)果(LIMIT子句)5.使用聚集函數(shù)6.分組查詢(GROUPBY子句)3.1掌握單表查詢GROUPBY子句分組:
GROUPBY子句將查詢結(jié)果按某一列或多列的值分組,值相等的為一組。
對(duì)查詢結(jié)果分組是為了細(xì)化聚集函數(shù)的作用對(duì)象。如果未對(duì)查詢結(jié)果分組,則聚集函數(shù)將作用于整個(gè)查詢結(jié)果。分組后,聚集函數(shù)將作用于每一組。3.1.6分組查詢
GROUPBY子句(續(xù))【例3.32】求每門課程的平均分?jǐn)?shù)。
SELECTcno,AVG(grade)FROMscoreGROUPBYcno;
【例3.33】求各門課程的選課人數(shù)。SELECTcno,COUNT(sno)
FROMscoreGROUPBYcno;
GROUPBY子句(續(xù))【例3.34】查詢選課人數(shù)超過(guò)50人的課程號(hào)。SELECTcnoFROMscoreGROUPBYcnoHAVINGcount(*)>=50;
如果分組后還要按一定的條件對(duì)這些組進(jìn)行篩選,最終只輸出滿足指定條件的組,則可使用HAVING短語(yǔ)指定篩選條件。WHERE子句與HAVING短語(yǔ)都用于篩選,區(qū)別在于作用對(duì)象不同。WHERE子句作用于基本表或視圖,從中選擇滿足條件的行。HAVING短語(yǔ)作用于組,從中選擇滿足條件的組?!纠?.35】查詢成績(jī)不及格學(xué)生的不及格科目數(shù)。SELECTsno,COUNT(cno)FROMscoreWHEREgrade<60GROUPBYsno;【例3.36】查詢平均成績(jī)大于或等于90分的學(xué)生的學(xué)號(hào)和平均成績(jī)。SELECTsno,AVG(grade)FROMscoreGROUPBYsnoHAVINGAVG(grade)>=90;
查詢教學(xué)管理數(shù)據(jù)表3.1掌握單表查詢3.2掌握連接查詢3.3掌握嵌套查詢
掌握連接查詢(續(xù))1.內(nèi)連接2.自連接3.外連接4.多表連接連接查詢:同時(shí)涉及兩個(gè)以上的表的查詢連接條件或連接謂詞:用來(lái)連接兩個(gè)表的條件
一般格式:[<表名1>.]<列名1><比較運(yùn)算符>[<表名2>.]<列名2>[<表名1>.]<列名1>BETWEEN[<表名2>.]<列名2>AND[<表名2>.]<列名3>連接字段:連接謂詞中的列名稱連接條件中的各連接字段類型必須是可比的,但名字不必相同3.2.1內(nèi)連接
3.2.1內(nèi)連接
在MySQL中有兩種語(yǔ)法實(shí)現(xiàn)連接:一種是將連接條件放在WHERE子句中;另一種是使用
JOIN…ON系列語(yǔ)句實(shí)現(xiàn)連接。1.使用WHERE子句實(shí)現(xiàn)連接當(dāng)連接運(yùn)算符為“=”時(shí),該連接稱為等值連接。使用其他運(yùn)算符的連接稱為非等值連接?!纠?.37】查詢每個(gè)學(xué)生及其選修課程的情況。SELECTstudent.*,score.*FROMstudent,scoreWHEREstudent.sno=score.sno;若在等值連接中把目標(biāo)列中的重復(fù)列去掉,則該連接為自然連接?!纠?.38】用自然連接完成例3.37。SELECTstudent.sno,sname,sex,birthday,spec,cno,gradeFROMstudent,scoreWHEREstudent.sno=score.sno;3.2.1內(nèi)連接
【例3.39】查詢選修了c102號(hào)課程的學(xué)生的學(xué)號(hào)、姓名和成績(jī)。SELECTsno,sname,gradeFROMstudent,scoreWHEREstudent.sno=score.snoANDo='c102';2.使用JOIN…ON系列語(yǔ)句實(shí)現(xiàn)內(nèi)連接語(yǔ)法格式:FROM<表名1>INNERJOIN<表名2>ON<連接條件>【例3.40】用JOIN…ON…語(yǔ)句實(shí)現(xiàn)例3.38中的查詢。SELECTstudent.sno,sname,sex,birthday,spec,cno,gradeFROMstudentINNERJOINscoreONstudent.sno=score.sno;【例3.41】用JOIN…ON…語(yǔ)句實(shí)現(xiàn)例3.39中的查詢。SELECTsno,sname,gradeFROMstudentINNERJOINscoreONstudent.sno=score.snoWHEREo='c102';掌握連接查詢(續(xù))1.內(nèi)連接2.自連接3.外連接4.多表連接自連接:一個(gè)表與其自身進(jìn)行連接。自連接可以看作一張表的兩個(gè)副本進(jìn)行的連接。在自連接中,必須為表指定兩個(gè)別名,使之在邏輯上看起來(lái)是兩張表?!纠?.42】查詢與張?zhí)m在同一專業(yè)學(xué)習(xí)的學(xué)生的學(xué)號(hào)、姓名及專業(yè)。
3.2.2自連接
SELECTsecond.sno,second.sname,second.specFROMstudentfirst,studentsecondWHEREfirst.spec=second.specANDfirst.sname='張?zhí)m'ANDsecond.sname!='張?zhí)m';【例3.43】用INNERJOIN…ON…語(yǔ)句實(shí)現(xiàn)例3.42,語(yǔ)句如下。SELECTsecond.sno,second.sname,second.specFROMstudentfirstINNERJOINstudentsecondONfirst.spec=second.specWHEREfirst.sname='張?zhí)m'ANDsecond.sname!='張?zhí)m';自連接(續(xù))FIRST表(student表)SECOND表(student表)學(xué)號(hào)sno姓名sname性別ssex出生日期birthday專業(yè)spec20231012101李偉男2002-09-06計(jì)算機(jī)應(yīng)用20231012102張?zhí)m女2003-03-09軟件技術(shù)20231012103王芳女2003-05-06通信技術(shù)20231012104劉勇男2003-06-16軟件技術(shù)學(xué)號(hào)sno姓名sname性別ssex出生日期birthday專業(yè)spec20231012101李偉男2002-09-06計(jì)算機(jī)應(yīng)用20231012102張?zhí)m女2003-03-09軟件技術(shù)20231012103王芳女2003-05-06通信技術(shù)20231012104劉勇男2003-06-16軟件技術(shù)掌握連接查詢(續(xù))1.內(nèi)連接
2.自連接3.外連接4.多表連接3.2.3
外連接外連接與普通連接的區(qū)別普通連接操作只輸出滿足連接條件的行外連接操作以指定表為連接主體,將主體表中不滿足連接條件的行一并輸出
左外連接列出左邊表中所有的行右外連接列出右邊表中所有的行
外連接(續(xù))
【例3.44】利用左外連接改寫例3.38。SELECTstudent.sno,sname,sex,birthday,spec,cno,gradeFROMstudentLEFTJOINscoreONstudent.sno=score.sno;
語(yǔ)法格式:FROM<表名1>LEFT|RIGHT|FULL[OUTER]JOIN<表名2>ON<連接條件>掌握連接查詢(續(xù))1.內(nèi)連接
2.自連接
3.外連接4.多表連接3.2.4
多表連接多表連接:兩個(gè)以上的表進(jìn)行連接【例3.45】查詢每個(gè)學(xué)生的學(xué)號(hào)、姓名、專業(yè)、選修的課程名及成績(jī)。
SELECTstudent.sno,sname,spec,cname,gradeFROMstudent,score,courseWHEREstudent.sno=score.snoANDo=o;【例3.46】用INNERJOIN…ON…語(yǔ)句改寫例3.45。SELECTstudent.sno,sname,spec,cname,gradeFROMstudentINNERJOINscoreONstudent.sno=score.snoINNERJOINcourseONo=o;
查詢教學(xué)管理數(shù)據(jù)表3.1掌握單表查詢3.2掌握連接查詢3.3掌握嵌套查詢
3.3嵌套查詢嵌套查詢概述一個(gè)SELECT-FROM-WHERE語(yǔ)句稱為一個(gè)查詢塊將一個(gè)查詢塊嵌套在另一個(gè)查詢塊的WHERE子句或HAVING短語(yǔ)的條件中的查詢稱為嵌套查詢SELECTSname /*外層查詢/父查詢*/FROMStudentWHERESnoIN
(SELECTSno/*內(nèi)層查詢/子查詢*/FROMScoreWHERECno=‘c102’);
嵌套查詢(續(xù))上層的查詢塊稱為外層查詢或父查詢下層查詢塊稱為內(nèi)層查詢或子查詢SQL語(yǔ)言允許多層嵌套查詢即一個(gè)子查詢中還可以嵌套其他子查詢子查詢的限制不能使用ORDERBY子句3.3嵌套查詢1.不相關(guān)子查詢
1.帶有IN謂詞的子查詢
2.帶有比較運(yùn)算符的子查詢
3.帶有ANY或ALL謂詞的子查詢2.相關(guān)子查詢1.帶有比較運(yùn)算符的相關(guān)子查詢2.帶有EXISTS謂詞的相關(guān)子查詢
帶有IN謂詞的子查詢【例3.47】查詢選修了“高等數(shù)學(xué)”課程的學(xué)生的學(xué)號(hào)和成績(jī)
此查詢要求可以分步來(lái)完成
①
查詢出“高等數(shù)學(xué)”課程的課程號(hào)。
不相關(guān)子查詢是指子查詢的查詢條件不依賴于父查詢。它通常的執(zhí)行過(guò)程是,由內(nèi)向外,即先執(zhí)行子查詢,子查詢的查詢結(jié)果作為父查詢的查詢條件,再執(zhí)行父查詢。SELECTcnoFROMcourseWHEREcname='高等數(shù)學(xué)';查詢結(jié)果為c101。②查詢選修c101課程的學(xué)生的學(xué)號(hào)和成績(jī)SELECTsno,gradeFROMscoreWHEREcno='c101';帶有IN謂詞的子查詢(續(xù))將第一步查詢嵌入到第二步查詢的條件中
SELECTsno,gradeFROMscoreWHEREcnoIN(SELECTcnoFROMcourseWHEREcname='高等數(shù)學(xué)');也可以用連接查詢來(lái)完成本例題SELECTscore.sno,grade/*例3.47的解法二*/FROMscore,courseWHEREscore.sno=course.snoANDame='高等數(shù)學(xué)';帶有IN謂詞的子查詢(續(xù))【例3.48】查詢選修了“高等數(shù)學(xué)”課程的學(xué)生的學(xué)號(hào)和姓名。SELECTsno,sname③最后在student表中查詢出sno和snameFROMstudentWHEREsnoIN(SELECTsno②然后在score表中找出選修了c101號(hào)課程的學(xué)生學(xué)號(hào)FROMscoreWHEREcnoIN(SELECTcno①首先在course表中找出“高等數(shù)學(xué)”的課程號(hào),結(jié)果為c101FROMcourseWHEREcname='高等數(shù)學(xué)'));
本查詢同樣可以用連接查詢實(shí)現(xiàn)。SELECTstudent.sno,snameFROMstudent,score,courseWHEREstudent.sno=score.snoANDo=oANDame='高等數(shù)學(xué)';3.3嵌套查詢1.不相關(guān)子查詢
1.帶有IN謂詞的子查詢
2.帶有比較運(yùn)算符的子查詢
3.帶有ANY或ALL謂詞的子查詢2.相關(guān)子查詢1.帶有比較運(yùn)算符的相關(guān)子查詢2.帶有EXISTS謂詞的相關(guān)子查詢2.帶有比較運(yùn)算符的子查詢
當(dāng)能確切知道內(nèi)層查詢返回單值時(shí),可用比較運(yùn)算符(>,<,=,>=,<=,!=或<>)。在[例3.47]中,“高等數(shù)學(xué)”課程的課程號(hào)只能是一個(gè)值,則可以用=代替IN
:
SELECTsno,grade/*例3.47的解法三*/FROMscoreWHEREcno=(SELECTcnoFROMcourseWHEREcname='高等數(shù)學(xué)');3.3嵌套查詢1.不相關(guān)子查詢
1.帶有IN謂詞的子查詢
2.帶有比較運(yùn)算符的子查詢
3.帶有ANY或ALL謂詞的子查詢2.相關(guān)子查詢1.帶有比較運(yùn)算符的相關(guān)子查詢2.帶有EXISTS謂詞的相關(guān)子查詢帶有ANY(SOME)或ALL謂詞的子查詢(續(xù))使用ANY或ALL謂詞時(shí)必須同時(shí)使用比較運(yùn)算語(yǔ)義為:
>ANY
大于子查詢結(jié)果中的某個(gè)值
>ALL 大于子查詢結(jié)果中的所有值<ANY 小于子查詢結(jié)果中的某個(gè)值<ALL 小于子查詢結(jié)果中的所有值>=ANY 大于等于子查詢結(jié)果中的某個(gè)值>=ALL 大于等于子查詢結(jié)果中的所有值帶有ANY(SOME)或ALL謂詞的子查詢(續(xù))使用ANY或ALL謂詞時(shí)必須同時(shí)使用比較運(yùn)算語(yǔ)義為(續(xù))<=ANY 小于等于子查詢結(jié)果中的某個(gè)值<=ALL 小于等于子查詢結(jié)果中的所有值=ANY 等于子查詢結(jié)果中的某個(gè)值=ALL 等于子查詢結(jié)果中的所有值(通常沒(méi)有實(shí)際意義)!=(或<>)ANY 不等于子查詢結(jié)果中的某個(gè)值!=(或<>)ALL 不等于子查詢結(jié)果中的任何一個(gè)值帶有ANY(SOME)或ALL謂詞的子查詢(續(xù))[例3.50]查詢非計(jì)算機(jī)專業(yè)中比計(jì)算機(jī)專業(yè)任意一個(gè)學(xué)生年齡小的學(xué)生姓名和年齡
SELECTsname,2024-year(birthday)FROMstudentWHERE2024-year(birthday)<ANY(SELECT2024-year(birthday)FROMstudentWHEREspec='計(jì)算機(jī)應(yīng)用')ANDspec<>'計(jì)算機(jī)應(yīng)用';/*注意這是父查詢塊中的條件*/本查詢也可以用聚集函數(shù)來(lái)實(shí)現(xiàn)SELECTsname,2024-year(birthday)FROMstudentWHERE2024-year(birthday)<(SELECTMAX(2024-year(birthday))FROMstudentWHEREspec='計(jì)算機(jī)應(yīng)用')ANDspec<>'計(jì)算機(jī)應(yīng)用';帶有ANY(SOME)或ALL謂詞的子查詢(續(xù))[例3.51]查詢非計(jì)算機(jī)科學(xué)專業(yè)中比計(jì)算機(jī)科學(xué)專業(yè)所有學(xué)生年齡都小的學(xué)生姓名及年齡。方法一:用ALL謂詞
SELECTsname,2024-year(birthday)FROMstudentWHERE2024-year(birthday)<ALL(SELECT2024-year(birthday)FROMstudentWHEREspec='計(jì)算機(jī)應(yīng)用')ANDspec<>'計(jì)算機(jī)應(yīng)用';帶有ANY(SOME)或ALL謂詞的子查詢(續(xù))
方法二:用聚集函數(shù)
SELECTsname,2024-year(birthday)FROMstudentWHERE2024-year(birthday)<(SELECTMIN(2024-year(birthday))FROMstudentWHEREspec='計(jì)算機(jī)應(yīng)用')帶有ANY(SOME)或ALL謂詞的子查詢(續(xù)) 表3-8ANY(或SOME),ALL謂詞與聚集函數(shù)、IN謂詞的等價(jià)轉(zhuǎn)換關(guān)系
=
<>或!=<<=>>=ANY
IN
--
<MAX<=MAX>MIN>=MINALL--
NOTIN
<MIN<=MIN>MAX>=MAX謂詞3.3嵌套查詢1.不相關(guān)子查詢
1.帶有IN謂詞的子查詢
2.帶有比較運(yùn)算符的子查詢
3.帶有ANY或ALL謂詞的子查詢2.相關(guān)子查詢1.帶有比較運(yùn)算符的相關(guān)子查詢2.帶有EXISTS謂詞的相關(guān)子查詢3.3.2相關(guān)子查詢不相關(guān)子查詢:子查詢的查詢條件不依賴于父查詢由內(nèi)向外,即先執(zhí)行子查詢,子查詢的查詢結(jié)果作為父查詢的查詢條件,再執(zhí)行父查詢。相關(guān)子查詢:
子查詢的查詢條件依賴于父查詢。子查詢與父查詢的關(guān)系
比不相關(guān)子查詢要復(fù)雜。帶有比較運(yùn)算符的相關(guān)子查詢[例3.52]找出每個(gè)學(xué)生超過(guò)他自己選修課程平均成績(jī)的課程號(hào)。
相關(guān)子查詢SELECTsno,cnoFROMscorexWHEREgrade>=(SELECTAVG(grade)FROMscorey
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度分公司股權(quán)轉(zhuǎn)讓及利益再分配執(zhí)行合同
- 2025版房產(chǎn)交易合同規(guī)范范本
- 二零二五年度美容院美容護(hù)膚產(chǎn)品研發(fā)與推廣合作協(xié)議書
- 二零二五年度大型活動(dòng)贊助廣告合同協(xié)議
- 二零二五年度屋頂花園草皮供應(yīng)合同樣本
- 二零二五年度電子產(chǎn)品銷售與供應(yīng)鏈管理合同
- 二零二五年度環(huán)保科技廠房及場(chǎng)地租賃服務(wù)協(xié)議
- 二零二五年度特色餐廳承包與員工福利保障合同
- 早讀神器課件WPS
- 二零二五年度車輛抵押貸款擔(dān)保與金融創(chuàng)新合同
- GB/T 45000-2024表面活性劑蔗糖脂肪酸酯的組成分析液相色譜法
- 《高速公路邊坡光伏光環(huán)境影響評(píng)價(jià)方法》
- 氯化亞砜MSDS安全技術(shù)說(shuō)明書
- 腸梗阻護(hù)理新進(jìn)展
- 紅星美凱龍展廳租賃合同
- 單純皰疹患者的護(hù)理
- 養(yǎng)老護(hù)理員職責(zé)培訓(xùn)課件
- 酒店員工接待禮儀培訓(xùn)
- 車位租賃協(xié)議
- 醫(yī)療器械生產(chǎn)質(zhì)量管理手冊(cè)
- 2024年新滬教牛津版三年級(jí)上冊(cè)英語(yǔ)全冊(cè)教學(xué)課件
評(píng)論
0/150
提交評(píng)論