![MySQL數(shù)據(jù)庫教程課件_第1頁](http://file4.renrendoc.com/view11/M02/0C/1C/wKhkGWeAvBOAK4fCAAMtgxpezvM053.jpg)
![MySQL數(shù)據(jù)庫教程課件_第2頁](http://file4.renrendoc.com/view11/M02/0C/1C/wKhkGWeAvBOAK4fCAAMtgxpezvM0532.jpg)
![MySQL數(shù)據(jù)庫教程課件_第3頁](http://file4.renrendoc.com/view11/M02/0C/1C/wKhkGWeAvBOAK4fCAAMtgxpezvM0533.jpg)
![MySQL數(shù)據(jù)庫教程課件_第4頁](http://file4.renrendoc.com/view11/M02/0C/1C/wKhkGWeAvBOAK4fCAAMtgxpezvM0534.jpg)
![MySQL數(shù)據(jù)庫教程課件_第5頁](http://file4.renrendoc.com/view11/M02/0C/1C/wKhkGWeAvBOAK4fCAAMtgxpezvM0535.jpg)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第5章數(shù)據(jù)查詢【學習目標】掌握SELECT語句的語法。熟練運用SELECT實現(xiàn)單表的查詢。熟練運用聚合函數(shù)實現(xiàn)統(tǒng)計查詢。熟練掌握多表的連接操作,實現(xiàn)多表的查詢。掌握子查詢和聯(lián)合查詢。5.1數(shù)據(jù)查詢語句數(shù)據(jù)查詢使用的SQL語句是SELECT語句,SELECT語句是從數(shù)據(jù)表檢索記錄的命令,該命令可以實現(xiàn)對表中記錄的選擇、投影和連接等運算,返回指定的數(shù)據(jù)表中的全部或部分滿足條件的記錄集合。功能:
從FROM子句指定的數(shù)據(jù)源中返回滿足WHERE子句指定條件的記錄集,該記錄集中只包含SELECT語句中指定的字段或表達式?;菊Z法格式如下。SELECT[ALL|DISTINCT]字段名稱1或表達式1[,字段名稱2或表達式2…][FROM表名1[,表名2…]][WHERE條件][GROUPBY字段名稱1或表達式1或字段編號1[,字段名稱2或表達式2或字段編號2…][HAVING條件][ORDERBY字段名稱1或表達式1或字段編號1[ASC|DESC][,…]][LIMIT{[偏移量,]行數(shù)
行數(shù)OFFSET偏移量}];說明:(1)SELECT子句:指定查詢結果中要顯示的字段或表達式。查詢結果是滿足條件的全部記錄,默認是ALL;DISTINCT的含義是查詢結果不包含重復行的記錄。(2)FROM子句:指定查詢的數(shù)據(jù)源。數(shù)據(jù)源可以是一張表或多張表,也可以是視圖。(3)WHERE子句:指定查詢的條件,篩選出滿足條件的記錄行。(4)GROUPBY子句:指定對記錄進行分組的方式。(5)HAVING子句:指定分組滿足的條件,必須與GROUPBY一起使用。(6)ORDERBY子句:指定查詢結果的排序方式。ASC表示升序,是默認值;DESC表示降序。(7)LIMIT子句:指定查詢結果集所包含的記錄行數(shù)。SELECT語句中各個子句的執(zhí)行順序:FROM
WHERE
GROUPBY
HAVING
SELECT
DISTINCT
ORDERBY。5.2單表查詢5.2.1簡單數(shù)據(jù)查詢簡單數(shù)據(jù)查詢是在FORM子句指定的表中顯示SELECT子句中指定的字段或表達式語法格式:SELECT[ALL|DISTINCT]字段名稱1或表達式1[,字段名稱2或表達式2…]FROM表名;1.顯示指定的字段列
顯示指定的字段列是進行投影運算,查詢結果中只顯示指定的字段或表達式。(1)顯示全部字段列SELECT子句使用“*”號時,表示查詢結果包括表中的所有字段列。+----------+------------------+-------+|cno|cname|hours|+----------+------------------+-------+|10101400|學術英語|64||10101410|通用英語|48||10300710|現(xiàn)代控制理論|40||10400350|模擬電子技術基礎|56||10500131|證券投資學|32||10600200|高級語言程序設計|56||10600450|無線網(wǎng)絡安全|32||10600611|數(shù)據(jù)庫應用|56||10700053|大學物理|56||10700140|高等數(shù)學|64||10700462|線性代數(shù)|48|+----------+------------------+-------+【例5-1】查詢課程表course中的全部字段。mysql>SELECT*FROMcourse;(2)顯示指定的字段列在SELECT之后列出需要顯示的字段名稱,多個字段名稱之間用英文逗號進行分隔。
+--------------+--------+------------+|sno|sname|birthdate|+--------------+--------+------------+|120211010103|宋洪博|2003-05-15||120211010105|劉向志|2002-10-08||120211010230|李媛媛|2003-09-02||120211030110|王琦|2003-01-23||120211030409|張虎|2003-07-18||120211040101|王曉紅|2002-09-02||120211040108|李明|2002-12-27||120211041102|李華|2003-01-01||120211041129|侯明斌|2002-12-03||120211050101|張函|2003-03-07||120211050102|唐明卿|2002-10-15||120211060104|王剛|2004-01-12||120211060206|趙壯|2003-03-13||120211070101|李淑子|2003-06-14||120211070106|劉麗|2002-11-17|+--------------+--------+------------+【例5-2】查詢學生表student中所有學生的學號sno、姓名sname和出生日期birthdate。mysql>SELECTsno,sname,birthdate->FROMstudent;2.顯示字段列的別名
查詢結果默認的列標題是字段名稱本身,也可以使用AS指定顯示結果的列標題名稱。
例如,表中的字段名稱都是英文的,為了方便用戶直觀理解字段的含義,可以使用AS指定中文別名。
【例5-3】查詢學生表student中所有學生的學號sno、姓名sname和出生日期birthdate,分別為這三列指定中文別名。mysql>SELECTsnoAS學號,snameAS姓名,birthdateAS出生日期->FROMstudent;+--------------+--------+------------+|學號|姓名|出生日期|+--------------+--------+------------+|120211010103|宋洪博|2003-05-15||120211010105|劉向志|2002-10-08||120211010230|李媛媛|2003-09-02||120211030110|王琦|2003-01-23||120211030409|張虎|2003-07-18||120211040101|王曉紅|2002-09-02||120211040108|李明|2002-12-27||120211041102|李華|2003-01-01||120211041129|侯明斌|2002-12-03||120211050101|張函|2003-03-07||120211050102|唐明卿|2002-10-15||120211060104|王剛|2004-01-12||120211060206|趙壯|2003-03-13||120211070101|李淑子|2003-06-14||120211070106|劉麗|2002-11-17|+--------------+--------+------------+3.顯示計算的列值
查詢結果的列可以是表中的字段,也可以是加(+)、減(
)、乘(*)、除(/)等算術運算符構成的計算表達式對字段進行計算的結果。
【例5-4】查詢課程表course中全部課程的學分。在課程表course中沒有學分字段,可以根據(jù)學時數(shù)計算出學分,每16學時為1學分,一門32學時的課程的學分為2學分。mysql>SELECTcnoAS課程編號,cnameAS課程名稱,hoursAS學時,hours/16AS學分->FROMcourse;+----------+------------------+------+--------+|課程編號|課程名稱|學時|學分|+----------+------------------+------+--------+|10101400|學術英語|64|4.0000||10101410|通用英語|48|3.0000||10300710|現(xiàn)代控制理論|40|2.5000||10400350|模擬電子技術基礎|56|3.5000||10500131|證券投資學|32|2.0000||10600200|高級語言程序設計|56|3.5000||10600450|無線網(wǎng)絡安全|32|2.0000||10600611|數(shù)據(jù)庫應用|56|3.5000||10700053|大學物理|56|3.5000||10700140|高等數(shù)學|64|4.0000||10700462|線性代數(shù)|48|3.0000|+----------+------------------+------+--------+4.消除查詢結果集中的重復行
查詢結果是滿足條件的全部記錄,默認就是ALL。使用DISTINCT參數(shù)可以消除查詢結果中重復的行,保證行的唯一性?!纠?-5】查詢學生表student中所包含的班級classno。
mysql>SELECTDISTINCTclassnoFROMstudent;
一個班級中有多名學生,所以學生表student中的班級名稱classno字段可能存在多個相同的值。使用DISTINCT來消除查詢結果中重復的班級classno記錄。
+----------+
|classno|
+----------+
|英語2101|
|英語2102|
|機械2101|
|機械2104|
|電氣2101|
|電氣2111|
|財務2101|
|計算2101|
|計算2102|
|物理2101|
+----------+
5.限制查詢結果集中的行數(shù)
使用LIMIT來控制查詢結果返回的行數(shù)。【例5-6】查詢學生表student中前3個學生的學號sno、姓名sname和出生日期birthdate。mysql>SELECTsno,sname,birthdate->FROMstudent->LIMIT3;+--------------+--------+------------+|sno|sname|birthdate|+--------------+--------+------------+|120211010103|宋洪博|2003-05-15||120211010105|劉向志|2002-10-08||120211010230|李媛媛|2003-09-02|+--------------+--------+------------+【例5-7】查詢教師表teacher中從第4條記錄開始的2個教師的教師工號tno、姓名tname和職稱title。如果初始記錄行不是從頭開始,則要使用兩個參數(shù):偏移量、行數(shù)。需要注意的是初始記錄行的偏移量為0,不是1,因此第4條記錄的偏移量為3。mysql>SELECTtno,tname,title->FROMteacher->LIMIT3,2;該語句的含義是顯示從第4條記錄開始的2條記錄,即第4、5條記錄。+----------+--------+--------+|tno|tname|title|+----------+--------+--------+|10423769|林達|教授||10501561|趙曉麗|副教授|+----------+--------+--------+6.查詢結果的排序
ORDERBY子句用于對查詢結果進行排序。
ORDERBY子句后可以是一個或多個字段、表達式或正整數(shù),正整數(shù)表示按照結果中該位置上的字段列排序。
ASC表示升序排列,是系統(tǒng)默認的排序方式;DESC表示降序排序。
【例5-8】查詢課程表course的課程編號cno、課程名稱cname和學時hours,結果按照學時hours的升序排序。mysql>SELECTcno,cname,hours->FROMcourse->ORDERBYhours;或mysql>SELECTcno,cname,hours->FROMcourse->ORDERBY3;+----------+------------------+-------+|cno|cname|hours|+----------+------------------+-------+|10500131|證券投資學|32||10600450|無線網(wǎng)絡安全|32||10300710|現(xiàn)代控制理論|40||10101410|通用英語|48||10700462|線性代數(shù)|48||10400350|模擬電子技術基礎|56||10600200|高級語言程序設計|56||10600611|數(shù)據(jù)庫應用|56||10700053|大學物理|56||10101400|學術英語|64||10700140|高等數(shù)學|64|+----------+------------------+-------+【例5-9】查詢學生表student的學號sno、姓名sname、班級classno和入學總分enterscore,結果先按照班級classno的升序排序,班級classno相同時再按照入學總分enterscore的降序排序。mysql>SELECTsno,sname,classno,enterscore->FROMstudent->ORDERBYclassno,enterscoreDESC;+--------------+--------+----------+------------+|sno|sname|classno|enterscore|+--------------+--------+----------+------------+|120211030110|王琦|機械2101|600||120211030409|張虎|機械2104|650||120211070106|劉麗|物理2101|620||120211070101|李淑子|物理2101|589||120211040108|李明|電氣2101|650||120211040101|王曉紅|電氣2101|630||120211041102|李華|電氣2111|648||120211041129|侯明斌|電氣2111|617||120211010103|宋洪博|英語2101|698||120211010105|劉向志|英語2101|625||120211010230|李媛媛|英語2102|596||120211060104|王剛|計算2101|678||120211060206|趙壯|計算2102|605||120211050101|張函|財務2101|663||120211050102|唐明卿|財務2101|548|+--------------+--------+----------+------------+查詢結果中班級并未按照漢語拼音升序排序,原因是MySQL默認的字符集不是中文字符集,可以使用CONVERT函數(shù)強制按中文字符集GBK來排序。mysql>SELECTsno,sname,classno,enterscore->FROMstudent->ORDERBYCONVERT(classnoUSINGGBK),enterscoreDESC;+--------------+--------+----------+------------+|sno|sname|classno|enterscore|+--------------+--------+----------+------------+|120211050101|張函|財務2101|663||120211050102|唐明卿|財務2101|548||120211040108|李明|電氣2101|650||120211040101|王曉紅|電氣2101|630||120211041102|李華|電氣2111|648||120211041129|侯明斌|電氣2111|617||120211030110|王琦|機械2101|600||120211030409|張虎|機械2104|650||120211060104|王剛|計算2101|678||120211060206|趙壯|計算2102|605||120211070106|劉麗|物理2101|620||120211070101|李淑子|物理2101|589||120211010103|宋洪博|英語2101|698||120211010105|劉向志|英語2101|625||120211010230|李媛媛|英語2102|596|+--------------+--------+----------+------------+5.2.2條件數(shù)據(jù)查詢在實際的數(shù)據(jù)表中包含了大量的記錄,通常只需要查詢滿足特定條件的記錄,可以使用WHRER子句對記錄進行選擇運算,按照指定條件篩選出滿足條件的記錄并顯示出來。條件表達式中可以包含比較運算、邏輯運算、指定范圍、模式匹配、空值判斷等。如果條件表達式成立,則返回TRUE,否則返回FALSE。WHERE子句對表中記錄行逐條進行判斷,當條件表達式的結果為TRUE時,該行記錄被包含到結果集中。1.比較運算運算符功能運算符功能=等于<
小于>
大于<=大于或等于>=大于或等于<>、!=不等于【例5-10】查詢學生表student中入學總分enterscore在600分及以上的學號sno、姓名sname、性別sex和入學總分enterscore。mysql>SELECTsno,sname,sex,enterscoreFROMstudent->WHEREenterscore>=600;+--------------+--------+------+------------+|sno|sname|sex|enterscore|+--------------+--------+------+------------+|120211010103|宋洪博|男|698||120211010105|劉向志|男|625||120211030110|王琦|男|600||120211030409|張虎|男|650||120211040101|王曉紅|女|630||120211040108|李明|男|650||120211041102|李華|女|648||120211041129|侯明斌|男|617||120211050101|張函|女|663||120211060104|王剛|男|678||120211060206|趙壯|男|605||120211070106|劉麗|女|620|+--------------+--------+------+------------+【例5-11】查詢教師表teacher中所有“教授”的教師工號tno、姓名tname、性別sex和職稱title。mysql>SELECTtnoAS教師工號,tnameAS姓名,sexAS性別,titleAS職稱
FROMteacher->WHEREtitle="教授";+----------+--------+------+-------+|tno|tname|sex|title|+----------+--------+------+-------+|10112583|周家羅|男|教授||10309242|宋江科|男|教授||10423769|林達|女|教授||10610910|王平|男|教授||10710050|朱軍|男|教授|+----------+--------+------+-------+2.邏輯運算通過邏輯運算符可以將多個表達式組合成更加復雜的查詢條件。邏輯運算的結果為TRUE(1)或FALSE(0)。NOT優(yōu)先級最高,AND優(yōu)先級次之,OR優(yōu)先級最低。同時出現(xiàn)多種運算符時,先執(zhí)行NOT運算,然后執(zhí)行算術運算、比較運算、AND運算,最后執(zhí)行OR運算。運算符功能NOT非運算,當表達式的值為真時,結果為假;否則結果為真AND與運算,當連接的兩個表達式的值均為真時,結果為真;否則結果為假OR或運算,當連接的兩個表達式的值均為假時,結果為假;否則結果為真【例5-12】查詢學生表student中入學總分enterscore在600及以上的“男”學生的學號sno、姓名sname、性別sex和入學總分enterscore。mysql>SELECTsno,sname,sex,enterscoreFROMstudent->WHEREenterscore>=600ANDsex="男";+--------------+--------+------+------------+|sno|sname|sex|enterscore|+--------------+--------+------+------------+|120211010103|宋洪博|男|698||120211010105|劉向志|男|625||120211030110|王琦|男|600||120211030409|張虎|男|650||120211040108|李明|男|650||120211041129|侯明斌|男|617||120211060104|王剛|男|678||120211060206|趙壯|男|605|+--------------+--------+------+------------+3.指定范圍指定范圍運算符可以表示查詢條件在特定的范圍中運算符功能BETWEENaANDb如果在a與b之間的范圍內(nèi),結果為真,否則結果為假。要求a與b類型相同,且包含a和b這兩個臨界值NOTBETWEENaANDb如果不在a與b之間的范圍內(nèi),結果為真,否則結果為假。要求a與b類型相同,且包含a和b這兩個臨界值IN(列表)如果在列表中,結果為真,否則結果為假NOTIN(列表)如果不在列表中,結果為真,否則結果為假【例5-13】查詢學生表student中出生日期在2003-1-1至2004-12-31之間的學生的學號sno、姓名sname和出生日期birthdatemysql>SELECTsno,sname,birthdate->FROMstudent->WHEREbirthdateBETWEEN"2003-1-1"AND"2004-12-31";+--------------+--------+------------+|sno|sname|birthdate|+--------------+--------+------------+|120211010103|宋洪博|2003-05-15||120211010230|李媛媛|2003-09-02||120211030110|王琦|2003-01-23||120211030409|張虎|2003-07-18||120211041102|李華|2003-01-01||120211050101|張函|2003-03-07||120211060104|王剛|2004-01-12||120211060206|趙壯|2003-03-13||120211070101|李淑子|2003-06-14|+--------------+--------+------------+【例5-14】查詢學生表student中“英語2101”“機械2101”和“財務2101”這3個班學生的學號sno、姓名sname和班級classno。mysql>SELECTsno,sname,classnoFROMstudent->WHEREclassnoIN("英語2101","機械2101","財務2101");+--------------+--------+----------+|sno|sname|classno| +--------------+--------+----------+|120211010103|宋洪博|英語2101||120211010105|劉向志|英語2101||120211030110|王琦|機械2101||120211050101|張函|財務2101||120211050102|唐明卿|財務2101|+--------------+--------+----------+4.模式匹配運算符功能LIKE如果符合指定的模式,結果為真,否則結果為假NOTLIKE如果不符合指定的模式,結果為真,否則結果為假模式匹配運算中可以使用的通配符有“_”和“%”?!?”表示0個或多個字符;“_”表示一個字符?!纠?-15】查詢學生表student中姓名sname只有2個漢字且姓“李”的學生的學號sno、姓名sname、性別sex和入學總分enterscore。mysql>SELECTsno,sname,sex,enterscoreFROMstudent->WHEREsnameLIKE"李_";+--------------+-------+------+------------+|sno|sname|sex|enterscore|+--------------+-------+------+------------+|120211040108|李明|男|650||120211041102|李華|女|648|+--------------+-------+------+------------+【例5-16】查詢教師表teacher中姓名的最后一個字是“麗”的“副教授”的教師工號tno、姓名tname、性別sex和職稱title。mysql>SELECTtno,tname,sex,titleFROMteacher->WHEREtnameLIKE"%麗"ANDtitle="副教授";+----------+--------+------+--------+|tno|tname|sex|title|+----------+--------+------+--------+|10100391|楊麗|女|副教授||10501561|趙曉麗|女|副教授|+----------+--------+------+--------+5.空值判斷空值判斷運算符可以判斷表達式的值是否為空值空值的含義是沒有任何值,不等于空格和0。運算符功能ISNULL如果是空值,結果為真,否則結果為假ISNOTNULL如果不是空值,結果為真,否則結果為假【例5-17】查詢學生表student中班級classno為空值的學生的學號sno和姓名sname。mysql>SELECTsno,snameFROMstudent->WHEREclassnoISNULL;Emptyset(0.00sec)查詢結果為空集,表示所有的學生均有隸屬的班級,不存在沒有班級的學生。5.3聚合函數(shù)和數(shù)據(jù)分組查詢5.3.1聚合函數(shù)聚合函數(shù)可以實現(xiàn)數(shù)據(jù)的統(tǒng)計與計算,用于計算表中的一組數(shù)據(jù)并返回單個計算結果。函數(shù)名功能COUNT()求一組數(shù)據(jù)的個數(shù)AVG()求一組數(shù)據(jù)的平均值SUM()求一組數(shù)據(jù)的總和MAX()求一組數(shù)據(jù)的最大值MIN()求一組數(shù)據(jù)的最小值(1)COUNT函數(shù)COUNT函數(shù)統(tǒng)計表中滿足條件的行數(shù)或總行數(shù),返回SELECT語句檢索到的行的數(shù)目,若找不到匹配的行,則返回0。語法格式:COUNT({[ALL
DISTINCT]表達式}
*)說明:(1)表達式:可以是常量、字段名稱、函數(shù)或表達式。(2)ALL
DISTINCT:ALL表示對所有值進行運算,是默認值;DISTINCT表示去除重復值。(3)*:表示返回檢索到的行的總數(shù)目?!纠?-18】統(tǒng)計學生表student中的學生人數(shù)。mysql>SELECTCOUNT(*)AS學生人數(shù)FROMstudent;+----------+|學生人數(shù)|+----------+|15|+----------+【例5-19】統(tǒng)計學生表student中的班級數(shù)。學生表student中的班級classno字段中有重復的值,需要使用DISTINCT去除重復值。mysql>SELECTCOUNT(DISTINCTclassno)AS班級數(shù)FROMstudent;+--------+|班級數(shù)|+--------+|10|+--------+【例5-20】統(tǒng)計教師表teacher中男教師的人數(shù)。mysql>SELECTCOUNT(tno)AS男教師人數(shù)FROMteacherWHEREsex="男";+------------+|男教師人數(shù)|+------------+|6|+------------+(2)SUM函數(shù)和AVG函數(shù)SUM函數(shù)用于求出一組數(shù)據(jù)的總和,AVG函數(shù)用于求出一組數(shù)據(jù)的平均值。語法格式:SUM
AVG([ALL
DISTINCT]表達式)說明:①
表達式的數(shù)據(jù)類型只能是數(shù)值類型。
②
計算時會忽略空值?!纠?-21】查詢課程表course中總學時數(shù)和平均學時數(shù)。mysql>SELECTSUM(hours)AS總學時數(shù),AVG(hours)AS平均學時數(shù)->FROMcourse;+----------+------------+|總學時數(shù)|平均學時數(shù)|+----------+------------+|552|50.1818|+----------+------------+(3)MAX函數(shù)和MIN函數(shù)MAX函數(shù)用于求出一組數(shù)據(jù)的最大值,MIN函數(shù)用于求出一組數(shù)據(jù)的最小值。其語法格式:MAX
MIN([ALL
DISTINCT]表達式)MAX函數(shù)和MIN函數(shù)參數(shù)與COUNT函數(shù)類似?!纠?-22】在學生表student中統(tǒng)計入學總分enterscore的最高分和最低分。mysql>SELECTMAX(enterscore)AS最高分,MIN(enterscore)AS最低分->FROMstudent;+--------+--------+|最高分|最低分|+--------+--------+|698|548|+--------+--------+5.3.2數(shù)據(jù)分組統(tǒng)計查詢中通常進行的是分類統(tǒng)計,GROUPBY子句可以實現(xiàn)數(shù)據(jù)分組功能,首先按照指定字段進行分組,然后對每個組內(nèi)的記錄利用聚合函數(shù)統(tǒng)計出結果。舉一個簡單的例子來說明,一個盒中有紅色、黃色和藍色的小球,要求統(tǒng)計出各色小球的數(shù)量??梢韵热∪齻€空盒子,然后將顏色相同小球放在同一個盒子中(分組),最后分別對每個盒子中的小球計數(shù)(聚合函數(shù))就可以得到各色小球的數(shù)量。分組計數(shù)3541.單字段分組如果GROUPBY子句中只有一個字段,則記錄將按照該字段的值進行分組。【例5-23】統(tǒng)計學生表student中不同政治面貌party的人數(shù)。分析:首先需要使用“GROUPBYparty”子句進行分組,將表中數(shù)據(jù)按照party分成三組:“黨員”組共4條記錄;“團員”組共9條記錄;“群眾”組共2條記錄。然后使用聚合函數(shù)COUNT(sno)來統(tǒng)計每個組中的記錄個數(shù)。mysql>SELECTpartyAS政治面貌,COUNT(sno)AS人數(shù)FROMstudent->GROUPBYparty;+----------+------+|政治面貌|人數(shù)|+----------+------+|黨員|4||團員|9||群眾|2|+----------+------+GROUPBYparty【例5-24】統(tǒng)計教師表teacher中不同職稱title的人數(shù)。mysql>SELECTtitleAS職稱,COUNT(tno)AS職稱人數(shù)FROMteacher->GROUPBYtitle;+--------+----------+|職稱|職稱人數(shù)|+--------+----------+|教授|5||副教授|2||講師|3|+--------+----------+【例5-25】分別統(tǒng)計學生表student中男生和女生入學總分enterscore的最高分、最低分和平均分(保留2位小數(shù))。mysql>SELECTsex,MAX(enterscore)AS最高分,MIN(enterscore)AS最低分,ROUND(AVG(enterscore),2)AS平均分->FROMstudent->GROUPBYsex;ROUND函數(shù)可以將結果進行四舍五入,其中的參數(shù)2表示保留2位小數(shù)。+------+--------+--------+--------+|sex|最高分|最低分|平均分|+------+--------+--------+--------+|男|698|600|640.38||女|663|548|613.43|+------+--------+--------+--------+(2)多字段分組如果GROUPBY子句中有多個字段,則記錄將依次按照字段的值進行多次分組。首先按照第一個字段分組,然后在每個組內(nèi)再按照第二個字段進行分組,以此類推?!纠?-26】在學生表student中按照性別sex分類統(tǒng)計各種政治面貌party的學生人數(shù)。mysql>SELECTsexAS性別,partyAS政治面貌,COUNT(sno)AS人數(shù)FROMstudent->GROUPBYsex,partyORDERBYsex;GROUPBY子句先按照性別sex字段進行分組,具有相同性別的記錄被分配在同一個組中;然后分別在女生組和男生組內(nèi)按照政治面貌party再次分組。SELECT前兩個字段與GROUPBY指定的兩個分組字段是一致的,第三個使用聚合函數(shù)COUNT()。+------+----------+------+|性別|政治面貌|人數(shù)|+------+----------+------+|女|黨員|1||女|團員|5||女|群眾|1||男|黨員|3||男|團員|4||男|群眾|1|+------+----------+------+3.HAVING子句HAVING子句必須和GROUPBY子句配合使用,用于指定分組需滿足條件。注意HAVING子句與WHERE子句有3點不同之處。(1)WHERE子句在GROUPBY分組之前起作用;HAVING子句在GROUPBY分組之后起作用。(2)WHERE子句作用于表,從表中選擇滿足條件的記錄;HAVING子句作用于GROUPBY分組,從分組中選擇滿足條件的組。(3)WHERE子句中不能使用聚合函數(shù),HAVING子句可以使用聚合函數(shù)。【例5-27】查詢選修成績表score中平均成績在75分以上的學生的學號sno和平均分AVG(grade)。mysql>SELECTsnoAS學號,AVG(grade)AS平均分FROMscore->GROUPBYsnoHAVINGAVG(grade)>=75;+--------------+---------+|學號|平均分|+--------------+---------+|120211010103|84.0000||120211010105|80.7500||120211030110|88.0000||120211041102|81.7500||120211041129|78.5000||120211050101|80.5000||120211050102|77.0000||120211070101|75.5000|+--------------+---------+5.4多表連接查詢?nèi)绻樵兘Y果的字段來自于多張不同的表,則需要通過連接運算將多張表進行連接。在第1章的關系運算中已經(jīng)介紹了連接運算的概念5.4.1連接運算連接運算主要分為交叉連接、內(nèi)連接和外連接。1.交叉連接交叉連接又稱為笛卡兒連接,是指兩張表之間做笛卡兒積運算,結果集是由第1張表中的每一條記錄與第2張表中的每一條記錄的笛卡兒積所形成的表,其總的記錄行數(shù)是兩張表記錄數(shù)的乘積。語法格式:SELECT{*
字段列表}FROM表1CROSSJOIN表2;或SELECT{*
字段列表}FROM表1,表2;【例5-29】將教師表teacher和課程表course進行交叉連接,查詢出教師和課程所有可能的組合。mysql>SELECT*->FROMteacherCROSSJOINcourse;或mysql>SELECT*->FROMteacher,course;教師表teacher中有10條記錄,課程表course中有11條記錄,交叉連接的結果集中的記錄行數(shù)為10
11=110行,顯示查詢結果為“110rowsinset(0.00sec)”。因為一個教師不可能教授所有的課程,所以其結果集中許多記錄沒有意義,因此在實際中很少使用交叉連接。2.內(nèi)連接內(nèi)連接是應用最廣泛的連接運算,使用INNERJOIN就可以將兩張表內(nèi)連接在一起。內(nèi)連接有兩種連接方式。方法一:使用INNERJOINSELECT{*
字段列表}FROM表1[INNER]JOIN表2ON連接條件[WHERE篩選條件];內(nèi)連接是系統(tǒng)默認的,可以省略關鍵字INNER。方法二:使用WHERE定義連接條件SELECT{*
字段列表}FROM表1,表2WHERE連接條件[AND篩選條件];該方法中的WHERE可以是連接條件,也可以是篩選條件連接條件的格式:[表名1.]字段1比較運算符[表名2.]字段2說明:(1)對于多張表中共有的字段,該字段前必須加表名,中間用“.”間隔格式為:表名.字段名稱例如,學生表student和院系表department中都有deptno字段,在使用deptno字段時,必須加上表名,寫成“student.deptno”和“department.deptno”。對于非共有的字段,可以直接寫字段名稱。(2)比較運算符:=、<、<=、>、>=、!=、<>等。(3)內(nèi)連接類型。①
等值連接:表之間通過等號運算符“=”進行連接,結果集中只包含兩張表中連接字段值相同的記錄行。②
非等值連接:兩張表之間通過除了等號運算符“=”以外的其他比較運算符進行連接?!纠?-30】顯示所有學生的學號sno、姓名sname、性別sex、院系代碼deptno、院系名稱deptname、班級classno和入學總分enterscore。分析:涉及到student表和department表,所以這兩張表需要進行等值連接。mysql>SELECTsno,sname,sex,student.deptno,deptname,classno,enterscore->FROMstudentINNERJOINdepartmentOnstudent.deptno=department.deptno;院系代碼deptno是student和department表共有的字段,所以必須加上表名;其他字段均不同名,可以省略表名。按照語句的執(zhí)行順序,先執(zhí)行INNERJOIN內(nèi)連接操作,將student表和department表按deptno字段進行等值連接。+--------------+--------+------+--------+------------------------+----------+------------+|sno|sname|sex|deptno|deptname|classno|enterscore|+--------------+--------+------+--------+------------------------+----------+------------+|120211010103|宋洪博|男|101|外國語學院|英語2101|698||120211010105|劉向志|男|101|外國語學院|英語2101|625||120211010230|李媛媛|女|101|外國語學院|英語2102|596||120211030110|王琦|男|103|能源動力與機械工程學院|機械2101|600||120211030409|張虎|男|103|能源動力與機械工程學院|機械2104|650||120211040101|王曉紅|女|104|電氣與電子工程學院|電氣2101|630||120211040108|李明|男|104|電氣與電子工程學院|電氣2101|650||120211041102|李華|女|104|電氣與電子工程學院|電氣2111|648||120211041129|侯明斌|男|104|電氣與電子工程學院|電氣2111|617||120211050101|張函|女|105|經(jīng)濟與管理學院|財務2101|663||120211050102|唐明卿|女|105|經(jīng)濟與管理學院|財務2101|548||120211060104|王剛|男|106|控制與計算機工程學院|計算2101|678||120211060206|趙壯|男|106|控制與計算機工程學院|計算2102|605||120211070101|李淑子|女|107|數(shù)理學院|物理2101|589||120211070106|劉麗|女|107|數(shù)理學院|物理2101|620|+--------------+--------+------+--------+------------------------+----------+------------+【例5-31】按院系名稱統(tǒng)計各個學院男同學入學平均分,并按照平均分的降序顯示。mysql>SELECTdeptnameAS院系名稱,AVG(enterscore)AS平均分->FROMdepartmentJOINstudentOndepartment.deptno=student.deptno->WHEREsex="男"->GROUPBYdeptname->ORDERBYAVG(enterscore)DESC;+------------------------+----------+|院系名稱|平均分|+------------------------+----------+|外國語學院|661.5000||控制與計算機工程學院|641.5000||電氣與電子工程學院|633.5000||能源動力與機械工程學院|625.0000|+------------------------+----------+如果要連接的表的條件字段名稱相同,ON條件可以換成USING子句。USING(字段名稱),其中字段名稱必須是兩個表中都有的相同字段。mysql>SELECTdeptnameAS院系名稱,AVG(enterscore)AS平均分->FROMdepartmentJOINstudentUSING(deptno)->WHEREsex="男"->GROUPBydeptname->ORDERBYAVG(enterscore)DESC;也可以使用WHERE子句來定義連接條件。mysql>SELECTdeptnameAS院系名稱,AVG(enterscore)AS平均分->FROMdepartment,student->WHEREdepartment.deptno=student.deptnoANDsex="男"->GROUPBYdeptname->ORDERBYAVG(enterscore)DESC;自連接一張表與自身進行連接。使用自連接時需要為表指定兩個別名,使之成為邏輯上的兩張表,且對所有查詢字段的引用必須使用表的別名進行限定?!纠?-32】查詢選修成績表score中同時選修了課程編號cno為“10101400”和“10600611”兩門課程的學號sno。為選修成績表score指定別名a和b,將表a和表b進行連接。mysql>SELECTa.sno->FROMscoreaJOINscorebONa.sno=b.sno->WHEREo="10101400"ANDo="10600611";+--------------+|sno|+--------------+|120211010103||120211010105||120211010230||120211050101|+--------------+【例5-33】查詢選修成績表score中課程編號cno為“10600611”的課程成績高于學號sno為“120211030110”的學生。使用自連接時為選修成績表score指定了兩個別名a和bmysql>SELECTa.sno,o,a.grade->FROMscoreaJOINscorebONa.grade>b.grade->WHEREo="10600611"ANDo="10600611"ANDb.sno="120211030110"->ORDERBYa.gradeDESC;或mysql>SELECTa.sno,o,a.grade->FROMscorea,scoreb->WHEREa.grade>b.gradeANDo="10600611"ANDo="10600611"ANDb.sno="120211030110"->ORDERBYa.gradeDESC;+--------------+----------+-------+|sno|cno|grade|+--------------+----------+-------+|120211050101|10600611|95||120211010105|10600611|90||120211041102|10600611|90|+--------------+----------+-------+3.外連接外連接是指從一張表中選擇全部的記錄行,從另一張表中只選擇與連接字段匹配的記錄行。有兩種外連接的方式:左外連接和右外連接。(1)左外連接使用關鍵字LEFTJOIN定義左外連接的語法格式:SELECT{*
字段列表}FROM左表LEFT[OUTER]JOIN右表ON連接條件;左外連接的結果集中包含左表所有的記錄行,當右表中沒有匹配的記錄時,右表對應字段會被設置為空值NULL。如果需要顯示全部院系名稱deptname的信息,包括那些沒有學生的院系,則需要使用左外連接(LEFTJOIN)的形式,表示包含左表(department)中的全部記錄,以及右表(student)中具有相同院系代碼deptno的記錄。mysql>SELECTsno,sname,deptname,classno->FROMdepartmentLEFTJOINstudentONdepartment.deptno=student.deptno;+--------------+--------+------------------------+----------+|sno|sname|deptname|classno|+--------------+--------+------------------------+----------+|120211010230|李媛媛|外國語學院|英語2102||120211010105|劉向志|外國語學院|英語2101||120211010103|宋洪博|外國語學院|英語2101||NULL|NULL|可再生能源學院|NULL||120211030409|張虎|能源動力與機械工程學院|機械2104||120211030110|王琦|能源動力與機械工程學院|機械2101||120211041129|侯明斌|電氣與電子工程學院|電氣2111||120211041102|李華|電氣與電子工程學院|電氣2111||120211040108|李明|電氣與電子工程學院|電氣2101||120211040101|王曉紅|電氣與電子工程學院|電氣2101||120211050102|唐明卿|經(jīng)濟與管理學院|財務2101||120211050101|張函|經(jīng)濟與管理學院|財務2101||120211060206|趙壯|控制與計算機工程學院|計算2102||120211060104|王剛|控制與計算機工程學院|計算2101||120211070106|劉麗|數(shù)理學院|物理2101||120211070101|李淑子|數(shù)理學院|物理2101|+--------------+--------+------------------------+----------+(2)右外連接使用關鍵字RIGHTJOIN定義右外連接的語法格式。SELECT{*
字段表}FROM左表RIGHT[OUTER]JOIN右表ON連接條件;右外連接的結果集中包含右表所有的記錄行,當
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2031年中國鐵基/銅基粉末冶金含油軸承行業(yè)投資前景及策略咨詢研究報告
- 2025至2030年中國預制混凝土構件數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國螺旋波節(jié)管換熱器數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國啤酒花數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國六角蜂窩斜管數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國LED標志字牌數(shù)據(jù)監(jiān)測研究報告
- 2025年中國高速翅片沖壓全自動生產(chǎn)線市場調查研究報告
- 2025年中國離心式風幕機市場調查研究報告
- 2025年中國電子火花機市場調查研究報告
- 2025年中國電動助力車用鉛酸蓄電池市場調查研究報告
- 2025民政局離婚協(xié)議書范本(民政局官方)4篇
- 2024年03月四川農(nóng)村商業(yè)聯(lián)合銀行信息科技部2024年校園招考300名工作人員筆試歷年參考題庫附帶答案詳解
- 小學一年級數(shù)學上冊口算練習題總匯
- 睡眠專業(yè)知識培訓課件
- 潤滑油知識-液壓油
- 2024年江蘇省中醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 臨床思維能力培養(yǎng)
- 人教版高中物理必修第三冊第十章靜電場中的能量10-1電勢能和電勢練習含答案
- 《工程勘察設計收費標準》(2002年修訂本)
- 中國宗教文化 中國古代宗教文化的特點及現(xiàn)代意義
- 2024年四川省巴中市級事業(yè)單位選聘15人歷年高頻難、易錯點練習500題附帶答案詳解
評論
0/150
提交評論