《MySQL》課件-第3章 MySQL查詢和視圖_第1頁(yè)
《MySQL》課件-第3章 MySQL查詢和視圖_第2頁(yè)
《MySQL》課件-第3章 MySQL查詢和視圖_第3頁(yè)
《MySQL》課件-第3章 MySQL查詢和視圖_第4頁(yè)
《MySQL》課件-第3章 MySQL查詢和視圖_第5頁(yè)
已閱讀5頁(yè),還剩85頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第3章MySQL查詢和視圖3.1MySQL數(shù)據(jù)庫(kù)查詢3.2MySQL視圖

3.1MySQL數(shù)據(jù)庫(kù)查詢SELECT語(yǔ)句可以從一個(gè)或多個(gè)表中選取符合某種條件的特定的行和列,結(jié)果通常是生成一個(gè)臨時(shí)表。下面介紹SELECT語(yǔ)句,它是SQL的核心。語(yǔ)法格式如下:SELECT[ALL|DISTINCT|DISTINCTROW]列...[FROM表...] [WHERE條件] [GROUPBY{列名|表達(dá)式|position}[ASC|DESC],...][HAVING條件] [ORDERBY{列名|表達(dá)式|position}[ASC|DESC],...][PROCEDURE存儲(chǔ)過(guò)程名(參數(shù)...)][INTOOUTFILE'文件名'[CHARACTERSET字符集]export_options|INTODUMPFILE'文件名'|INTO變量名...][FORUPDATE|LOCKINSHAREMODE]]3.1.1選擇輸出列1.選擇指定的列使用SELECT語(yǔ)句選擇一個(gè)表中的某些列,各列名之間要以逗號(hào)分隔,所有列用“*”表示。SELECT*|列名,列名,...from表名【例3.1】查詢xscj數(shù)據(jù)庫(kù)的xs表中各個(gè)同學(xué)的姓名、專業(yè)名和總學(xué)分。usexscjselect姓名,專業(yè)名,總學(xué)分fromxs;3.1.1選擇輸出列2.定義列別名當(dāng)希望查詢結(jié)果中的列顯示時(shí)使用自己選擇的列標(biāo)題,可以在列名之后使用AS子句。SELECT...列名[AS列別名]【例3.2】查詢xs表中計(jì)算機(jī)專業(yè)同學(xué)的學(xué)號(hào)、姓名和總學(xué)分,結(jié)果中各列的標(biāo)題分別指定為number、name和mark。select學(xué)號(hào)asnumber,姓名asname,總學(xué)分asmarkfromxswhere專業(yè)名='計(jì)算機(jī)';執(zhí)行結(jié)果:3.1.1選擇輸出列注意:當(dāng)自定義的列標(biāo)題中含有空格時(shí),必須使用引號(hào)將標(biāo)題括起來(lái)。例如:select學(xué)號(hào)as'studentnumber',姓名as'studentname',總學(xué)分asmarkfromxswhere專業(yè)名='計(jì)算機(jī)';說(shuō)明:不允許在WHERE子句中使用列別名。這是因?yàn)閳?zhí)行WHERE代碼時(shí),可能尚未確定列值。例如,這個(gè)查詢是非法的:select性別assexfromxswheresex=0;3.1.1選擇輸出列3.替換查詢結(jié)果中的數(shù)據(jù)要替換查詢結(jié)果中的數(shù)據(jù),則要使用查詢中的CASE表達(dá)式,格式為:CASEWHEN條件1

THEN表達(dá)式1WHEN條件2THEN表達(dá)式2...ELSE表達(dá)式nEND3.1.1選擇輸出列【例3.3】查詢xs表中計(jì)算機(jī)專業(yè)各同學(xué)的學(xué)號(hào)、姓名和總學(xué)分,對(duì)總學(xué)分按如下規(guī)則進(jìn)行替換:若總學(xué)分為空值,替換為“尚未選課”;若總學(xué)分小于50,替換為“不及格”;若總學(xué)分在50~52之間,替換為“合格”;若總學(xué)分大于52,替換為“優(yōu)秀”。總學(xué)分列的標(biāo)題更改為“等級(jí)”。select學(xué)號(hào),姓名,casewhen總學(xué)分isnullthen'尚未選課'when總學(xué)分<50then'不及格'when總學(xué)分>=50and總學(xué)分<=52then'合格'else'優(yōu)秀'endas等級(jí)fromxswhere專業(yè)名='計(jì)算機(jī)';執(zhí)行結(jié)果如右圖所示。

3.1.1選擇輸出列4.計(jì)算列值SELECT的輸出列可使用表達(dá)式:SELECT表達(dá)式...【例3.4】按120分制重新計(jì)算成績(jī),顯示xs_kc表中學(xué)號(hào)為081101的學(xué)生成績(jī)信息。select學(xué)號(hào),課程號(hào),成績(jī)*1.20as成績(jī)120fromxs_kcwhere學(xué)號(hào)='081101';執(zhí)行結(jié)果如圖所示。

3.1.1選擇輸出列5.消除結(jié)果集中的重復(fù)行可以使用DISTINCT或DISTINCTROW關(guān)鍵字消除結(jié)果集中的重復(fù)行。SELECTDISTINCT|DISTINCTROW列名...【例3.5】對(duì)xscj數(shù)據(jù)庫(kù)的xs表只選擇專業(yè)名和總學(xué)分,消除結(jié)果集中的重復(fù)行。

selectdistinct專業(yè)名,總學(xué)分fromxs;執(zhí)行結(jié)果如圖所示。3.1.1選擇輸出列6.聚合函數(shù)SELECT的輸出列還可以包含所謂的聚合函數(shù)。聚合函數(shù)常常用于對(duì)一組值進(jìn)行計(jì)算,然后返回單個(gè)值。除COUNT函數(shù)外,聚合函數(shù)都會(huì)忽略空值。函

數(shù)

名說(shuō)

明COUNT求組中項(xiàng)數(shù),返回int類型整數(shù)MAX求最大值MIN求最小值SUM返回表達(dá)式中所有值的和AVG求組中值的平均值STD或STDDEV返回給定表達(dá)式中所有值的標(biāo)準(zhǔn)差VARIANCE返回給定表達(dá)式中所有值的方差GROUP_CONCAT返回由屬于一組的列值連接組合而成的結(jié)果BIT_AND邏輯或BIT_OR邏輯與BIT_XOR邏輯異或3.1.1選擇輸出列(1)COUNT函數(shù)COUNT函數(shù)用于統(tǒng)計(jì)組中滿足條件的行數(shù)或總行數(shù),返回SELECT語(yǔ)句檢索到的行中非NULL值的數(shù)目,若找不到匹配的行,則返回0。語(yǔ)法格式:COUNT({[ALL|DISTINCT]表達(dá)式}|*)其中,表達(dá)式的數(shù)據(jù)類型可以是除BLOB或TEXT之外的任何類型。ALL表示對(duì)所有值進(jìn)行運(yùn)算,DISTINCT表示去除重復(fù)值,默認(rèn)為ALL。使用COUNT(*)時(shí)將返回檢索行的總數(shù)目,不論其是否包含NULL值。3.1.1選擇輸出列【例3.6】求學(xué)生的總?cè)藬?shù)。

selectcount(*)as'學(xué)生總數(shù)'fromxs;執(zhí)行結(jié)果如圖所示?!纠?.7】統(tǒng)計(jì)備注不為空的學(xué)生數(shù)目。

selectcount(備注)as'備注不為空的學(xué)生數(shù)目'fromxs;執(zhí)行結(jié)果如圖所示。注意:這里COUNT(備注)計(jì)算時(shí)備注為NULL的行被忽略,所以這里是7而不是22。3.1.1選擇輸出列【例3.8】統(tǒng)計(jì)總學(xué)分在50分以上的人數(shù)。selectcount(總學(xué)分)as'總學(xué)分50分以上的人數(shù)'

fromxswhere總學(xué)分>50;執(zhí)行結(jié)果如圖所示。3.1.1選擇輸出列(2)MAX和MINMAX和MIN分別用于求表達(dá)式中所有值項(xiàng)的最大值與最小值,語(yǔ)法格式為:MAX/MIN([ALL|DISTINCT]表達(dá)式)【例3.9】求選修101課程的學(xué)生的最高分和最低分。selectmax(成績(jī)),min(成績(jī))

fromxs_kcwhere課程號(hào)='101';執(zhí)行結(jié)果如圖所示。注意:當(dāng)給定列上只有空值或檢索出的中間結(jié)果為空時(shí),MAX和MIN函數(shù)的值也為空。3.1.1選擇輸出列(3)SUM函數(shù)和AVG函數(shù)SUM和AVG分別用于求表達(dá)式中所有值項(xiàng)的總和與平均值,語(yǔ)法格式為:SUM/AVG([ALL|DISTINCT]表達(dá)式)【例3.10】求學(xué)號(hào)081101的學(xué)生所學(xué)課程的總成績(jī)。selectsum(成績(jī))as'課程總成績(jī)'

fromxs_kcwhere學(xué)號(hào)='081101';執(zhí)行結(jié)果如圖所示。【例3.11】求選修101課程的學(xué)生的平均成績(jī)。selectavg(成績(jī))as'課程101平均成績(jī)'

fromxs_kcwhere課程號(hào)='101';執(zhí)行結(jié)果如圖所示。3.1.1選擇輸出列(4)VARIANCE和STDDEV(STD)函數(shù)VARIANCE和STDDEV函數(shù)分別用于計(jì)算特定的表達(dá)式中的所有值的方差和標(biāo)準(zhǔn)差。語(yǔ)法格式:VARIANCE/STDDEV([ALL|DISTINCT]表達(dá)式)【例3.12】求選修101課程的成績(jī)的方差。selectvariance(成績(jī))

fromxs_kc where課程號(hào)='101';執(zhí)行結(jié)果如圖所示。3.1.1選擇輸出列說(shuō)明:方差的計(jì)算按以下幾個(gè)步驟進(jìn)行。①計(jì)算相關(guān)列的平均值;②求列中的每一個(gè)值和平均值的差;③計(jì)算差值的平方的總和;④用總和除以(列中的)值的個(gè)數(shù)得結(jié)果。STDDEV函數(shù)用于計(jì)算標(biāo)準(zhǔn)差。標(biāo)準(zhǔn)差等于方差的平均根。所以,STDDEV(…)和SQRT(VARIANCE(…))這兩個(gè)表達(dá)式是相等的。3.1.1選擇輸出列【例3.13】求選修101課程的成績(jī)的標(biāo)準(zhǔn)差。selectstddev(成績(jī))

fromxs_kc where課程號(hào)='101';執(zhí)行結(jié)果如右圖所示。stddev可以縮寫為std,這對(duì)結(jié)果沒(méi)有影響。3.1.1選擇輸出列(5)GROUP_CONCAT函數(shù)MySQL支持一個(gè)特殊的聚合函數(shù)GROUP_CONCAT。該函數(shù)返回來(lái)自一個(gè)組指定列的所有非NULL值,這些值一個(gè)接著一個(gè)放置,中間用逗號(hào)隔開,并表示為一個(gè)長(zhǎng)長(zhǎng)的字符串。這個(gè)字符串的長(zhǎng)度是有限制的,標(biāo)準(zhǔn)值是1024。語(yǔ)法格式:GROUP_CONCAT({[ALL|DISTINCT]表達(dá)式}|*)【例3.14】求選修了206課程的學(xué)生的學(xué)號(hào)。selectgroup_concat(學(xué)號(hào)) fromxs_kc where課程號(hào)='206';執(zhí)行結(jié)果為:3.1.1選擇輸出列(6)BIT_AND、BIT_OR和BIT_XOR與二進(jìn)制運(yùn)算符|(或)、&(與)和^(異或)相對(duì)應(yīng)的聚合函數(shù)也存在,分別是BIT_OR、BIT_AND、BIT_XOR。語(yǔ)法格式:BIT_AND|BIT_OR|BIT_XOR({[ALL|DISTINCT]表達(dá)式}|*)【例3.15】有一個(gè)表bits,其中有一列bin_value上有3個(gè)INTEGER值:1、3、7,獲取在該列上執(zhí)行BIT_OR的結(jié)果,使用如下語(yǔ)句:selectbin(bit_or(bin_value))frombits;3.1.2數(shù)據(jù)來(lái)源:FROM子句1.引用一個(gè)表可以用兩種方式引用表:第一種方式是使用USE語(yǔ)句讓一個(gè)數(shù)據(jù)庫(kù)成為當(dāng)前數(shù)據(jù)庫(kù),F(xiàn)ROM子句中指定表名應(yīng)該屬于當(dāng)前數(shù)據(jù)庫(kù)。第二種方式是指定表名前帶上表所屬數(shù)據(jù)庫(kù)的名字。例如,假設(shè)當(dāng)前數(shù)據(jù)庫(kù)是db1,現(xiàn)在要顯示數(shù)據(jù)庫(kù)db2里的表tb的內(nèi)容,使用如下語(yǔ)句:SELECT*FROMdb2.tb;3.1.2數(shù)據(jù)來(lái)源:FROM子句2.多表連接如果要在不同表中查詢數(shù)據(jù),則必須在FROM子句中指定多個(gè)表,這時(shí)就要使用到連接。將不同列的數(shù)據(jù)組合到一個(gè)表中叫做表的連接。連接的方式有以下兩種。(1)全連接將各個(gè)表用逗號(hào)分隔,就指定了一個(gè)全連接。FROM子句產(chǎn)生的中間結(jié)果是一個(gè)新表,新表是每個(gè)表的每行都與其他表中的每行交叉以產(chǎn)生所有可能的組合。這種連接方式為可能得到的行數(shù)為每個(gè)表行數(shù)之積!使用WHERE子句設(shè)定條件將結(jié)果集減少為易于管理的大小,即為等值連接?!纠?.16】查找xscj數(shù)據(jù)庫(kù)中所有學(xué)生選過(guò)的課程名和課程號(hào)。使用如下語(yǔ)句:selectdistinctkc.課程名,xs_kc.課程號(hào)

fromkc,xs_kcwherekc.課程號(hào)=xs_kc.課程號(hào);執(zhí)行結(jié)果如圖所示。3.1.2數(shù)據(jù)來(lái)源:FROM子句(2)JOIN連接語(yǔ)法格式:JOIN表ON連接條件。使用JOIN關(guān)鍵字的連接主要分為三種:①

內(nèi)連接。指定了INNER關(guān)鍵字的連接是內(nèi)連接。【例3.17】查找xscj數(shù)據(jù)庫(kù)中所有學(xué)生選過(guò)的課程名和課程號(hào)??梢允褂靡韵抡Z(yǔ)句:selectdistinct課程名,xs_kc.課程號(hào)

fromkcinnerjoinxs_kcon(kc.課程號(hào)=xs_kc.課程號(hào));它的功能合并兩個(gè)表,返回滿足條件的行。內(nèi)連接是系統(tǒng)默認(rèn)的,可以省略INNER關(guān)鍵字。使用內(nèi)連接后,F(xiàn)ROM子句中ON條件主要用來(lái)連接表?!纠?.18】查找選修了206課程且成績(jī)?cè)?0分以上的學(xué)生姓名及成績(jī)。

select姓名,成績(jī)fromxsjoinxs_kconxs.學(xué)號(hào)=xs_kc.學(xué)號(hào)

where課程號(hào)='206'and成績(jī)>=80;執(zhí)行結(jié)果如圖所示。3.1.2數(shù)據(jù)來(lái)源:FROM子句【例3.19】查找選修了“計(jì)算機(jī)基礎(chǔ)”課程且成績(jī)?cè)?0分以上的學(xué)生學(xué)號(hào)、姓名、課程名及成績(jī)。selectxs.學(xué)號(hào),姓名,課程名,成績(jī)fromxsjoinxs_kconxs.學(xué)號(hào)=xs_kc.學(xué)號(hào)joinkconxs_kc.課程號(hào)=kc.課程號(hào)where課程名='計(jì)算機(jī)基礎(chǔ)'and成績(jī)>=80;執(zhí)行結(jié)果如下:3.1.2數(shù)據(jù)來(lái)源:FROM子句【例3.20】查找xscj數(shù)據(jù)庫(kù)中課程不同、成績(jī)相同的學(xué)生的學(xué)號(hào)、課程號(hào)和成績(jī)。selecta.學(xué)號(hào),a.課程號(hào),b.課程號(hào),a.成績(jī)fromxs_kcasajoinxs_kcasbona.成績(jī)=b.成績(jī)anda.學(xué)號(hào)=b.學(xué)號(hào)anda.課程號(hào)!=b.課程號(hào);執(zhí)行結(jié)果如右圖所示。

如果要連接的表中有列名相同,并且連接的條件就是列名相等,那么ON條件也可以換成USING子句。USING(兩表中相同的列名)子句用于為一系列的列進(jìn)行命名?!纠?.21】查找kc表中所有學(xué)生選過(guò)的課程名。select課程名fromkcinnerjoinxs_kcusing(課程號(hào));說(shuō)明:查詢的結(jié)果為xs_kc表中所有出現(xiàn)的課程號(hào)對(duì)應(yīng)的課程名。3.1.2數(shù)據(jù)來(lái)源:FROM子句②外連接。指定了OUTER關(guān)鍵字的連接為外連接,其中的OUTER關(guān)鍵字均可省略。外連接包括:左外連接(LEFTOUTERJOIN):結(jié)果表中除了匹配行外,還包括左表有的但右表中不匹配的行,對(duì)于這樣的行,從右表被選擇的列設(shè)置為NULL。右外連接(RIGHTOUTERJOIN):結(jié)果表中除了匹配行外,還包括右表有的但左表中不匹配的行,對(duì)于這樣的行,從左表被選擇的列設(shè)置為NULL。自然連接(NATURALJOIN):自然連接還有自然左外連接(NATURALLEFTOUTERJOIN)和自然右外連接(NATURALRIGHTOUTERJOIN)。NATURALJOIN的語(yǔ)義定義與使用了ON條件的INNERJOIN相同。3.1.2數(shù)據(jù)來(lái)源:FROM子句【例3.22】查找所有學(xué)生情況及他們選修的課程號(hào),若學(xué)生未選修任何課,也要包括其情況。selectxs.*,課程號(hào)fromxsleftouterjoinxs_kconxs.學(xué)號(hào)=xs_kc.學(xué)號(hào);說(shuō)明:本例結(jié)果中返回的行中有未選任何課程的學(xué)生信息,相應(yīng)行的課程號(hào)字段值為NULL。【例3.23】查找被選修了的課程的選修情況和所有開設(shè)的課程名。selectxs_kc.*,課程名fromxs_kcrightjoinkconxs_kc.課程號(hào)=kc.課程號(hào);結(jié)果顯示如下:3.1.2數(shù)據(jù)來(lái)源:FROM子句

【例3.24】使用自然連接查詢xscj數(shù)據(jù)庫(kù)中所有學(xué)生選過(guò)的課程名和課程號(hào)。。select課程名,課程號(hào)fromkc where課程號(hào)in (selectdistinct課程號(hào)fromkcnaturalrightouterjoinxs_kc);說(shuō)明:SELECT語(yǔ)句中只選取一個(gè)用來(lái)連接表的列時(shí),可以使用自然連接代替內(nèi)連接。用這種方法,可以用自然左外連接來(lái)替換左外連接,自然右外連接替換右外連接。3.1.2數(shù)據(jù)來(lái)源:FROM子句③交叉連接。指定了CROSSJOIN關(guān)鍵字的連接是交叉連接。在不包含連接條件時(shí),交叉連接結(jié)果表是由第一個(gè)表的每行與第二個(gè)表的每一行拼接后形成的表,因此結(jié)果表的行數(shù)等于兩個(gè)表行數(shù)之積。在MySQL中,CROSSJOIN語(yǔ)法上與INNERJOIN等同,兩者可以互換?!纠?.25】列出學(xué)生所有可能的選課情況。select學(xué)號(hào),姓名,課程號(hào),課程名fromxscrossjoinkc;另外,STRAIGHT_JOIN連接用法和INNERJOIN連接基本相同。不同的是,STRAIGHT_JOIN后不可以使用USING子句替代ON條件?!纠?.26】使用STRAIGHT_JOIN連接查找xscj數(shù)據(jù)庫(kù)中所有學(xué)生選過(guò)的課程名和課程號(hào)。selectdistinct課程名,xs_kc.課程號(hào)fromkcstraight_joinxs_kcon(kc.課程號(hào)=xs_kc.課程號(hào));3.1.3查詢條件:WHERE子句基本格式為:WHERE條件<條件>=:表達(dá)式<比較運(yùn)算符>表達(dá)式 /*比較運(yùn)算*/|邏輯表達(dá)式<邏輯運(yùn)算符>邏輯表達(dá)式|表達(dá)式[NOT]LIKE表達(dá)式[ESCAPE'esc字符'] /*LIKE運(yùn)算符*/ |表達(dá)式[NOT][REGEXP|RLIKE]表達(dá)式 /*REGEXP運(yùn)算符*/ |表達(dá)式[NOT]BETWEEN表達(dá)式AND表達(dá)式 /*指定范圍*/ |表達(dá)式IS[NOT]NULL /*是否空值判斷*/ |表達(dá)式[NOT]IN(子查詢|表達(dá)式[,…n]) /*IN子句*/ |表達(dá)式<比較運(yùn)算符>{ALL|SOME|ANY}(子查詢) /*比較子查詢*/ |EXIST(子查詢) /*EXIST子查詢*/WHERE子句會(huì)根據(jù)條件對(duì)FROM子句一行一行地進(jìn)行判斷,當(dāng)條件為TRUE的時(shí)候,一行就被包含到WHERE子句的中間結(jié)果中。3.1.3查詢條件:WHERE子句1.比較運(yùn)算比較運(yùn)算符用于比較兩個(gè)表達(dá)式值,當(dāng)兩個(gè)表達(dá)式值均不為空值(NULL)時(shí),比較運(yùn)算返回邏輯值TRUE(真)或FALSE(假);而當(dāng)兩個(gè)表達(dá)式值中有一個(gè)為空值或都為空值時(shí),將返回UNKNOWN。MySQL支持的比較運(yùn)算符有:=(等于)、<(小于)、<=(小于等于)、>(大于)、>=(大于等于)、<=>(相等或都等于空)、<>(不等于)、!=(不等于)?!纠?.27】查詢xscj數(shù)據(jù)庫(kù)xs表中學(xué)號(hào)為081101的學(xué)生的情況。select姓名,學(xué)號(hào),總學(xué)分

fromxswhere學(xué)號(hào)='081101';執(zhí)行結(jié)果如圖所示。3.1.3查詢條件:WHERE子句【例3.28】查詢xs表中總學(xué)分大于50分的學(xué)生的情況。select姓名,學(xué)號(hào),出生日期,總學(xué)分fromxswhere總學(xué)分>50;執(zhí)行結(jié)果如下圖所示。MySQL有一個(gè)特殊的等于運(yùn)算符“<=>”,當(dāng)兩個(gè)表達(dá)式彼此相等或都等于空值時(shí),它的值為TRUE,其中有一個(gè)空值或都是非空值但不相等,這個(gè)條件就是FALSE。沒(méi)有UNKNOWN的情況。3.1.3查詢條件:WHERE子句【例3.29】查詢xs表中備注為空的同學(xué)的情況。select姓名,學(xué)號(hào),出生日期,總學(xué)分fromxswhere備注<=>null;可以通過(guò)邏輯運(yùn)算符(AND、OR、XOR和NOT)組成更為復(fù)雜的查詢條件。查詢xs表中專業(yè)為計(jì)算機(jī),性別為女(0)的同學(xué)的情況。select姓名,學(xué)號(hào),性別,總學(xué)分

fromxswhere專業(yè)名='計(jì)算機(jī)'and性別=0;執(zhí)行結(jié)果如圖所示。3.1.3查詢條件:WHERE子句2.模式匹配(1)LIKE運(yùn)算符LIKE運(yùn)算符用于指出一個(gè)字符串是否與指定的字符串相匹配,其運(yùn)算對(duì)象可以是char、varchar、text、datetime等類型的數(shù)據(jù),返回邏輯值TRUE或FALSE。LIKE謂詞表達(dá)式的格式為:表達(dá)式[NOT]LIKE表達(dá)式[ESCAPE'esc字符']使用LIKE進(jìn)行模式匹配時(shí),常使用特殊符號(hào)_和%,可進(jìn)行模糊查詢。“%”代表0個(gè)或多個(gè)字符,“_”代表單個(gè)字符。由于MySQL默認(rèn)不區(qū)分大小寫,要區(qū)分大小寫時(shí)需要更換字符集的校對(duì)規(guī)則?!纠?.30】查詢xscj數(shù)據(jù)庫(kù)xs表中姓“王”的學(xué)生學(xué)號(hào)、姓名及性別。select學(xué)號(hào),姓名,性別

fromxswhere姓名like'王%';執(zhí)行結(jié)果如圖所示。3.1.3查詢條件:WHERE子句【例3.31】查詢xscj數(shù)據(jù)庫(kù)xs表中,學(xué)號(hào)倒數(shù)第二個(gè)數(shù)字為0的學(xué)生的學(xué)號(hào)、姓名及專業(yè)名。select學(xué)號(hào),姓名,專業(yè)名

fromxswhere學(xué)號(hào)like'%0_';執(zhí)行結(jié)果如右圖所示。如果我們想要查找特殊符號(hào)中的一個(gè)或全部(_和%),必須使用一個(gè)轉(zhuǎn)義字符?!纠?.32】查詢xs表中名字包含下畫線的學(xué)生學(xué)號(hào)和姓名。select學(xué)號(hào),姓名fromxswhere學(xué)號(hào)like'%#_%'escape'#';3.1.3查詢條件:WHERE子句(2)REGEXP運(yùn)算符REGEXP運(yùn)算符用來(lái)執(zhí)行更復(fù)雜的字符串比較運(yùn)算。REGEXP是正則表達(dá)式的縮寫,但它不是SQL標(biāo)準(zhǔn)的一部分。REGEXP運(yùn)算符的一個(gè)同義詞是RLIKE。語(yǔ)法格式:表達(dá)式[NOT][REGEXP|RLIKE]表達(dá)式REGEXP運(yùn)算符特殊含義的符號(hào)見表3.2。特殊字符含

義特

符含

義^匹配字符串的開始部分[abc]匹配方括號(hào)里出現(xiàn)的字符串a(chǎn)bc$匹配字符串的結(jié)束部分[a-z]匹配方括號(hào)里出現(xiàn)的a~z之間的1個(gè)字符.匹配任何一個(gè)字符(包括回車和新行)[^a-z]匹配方括號(hào)里出現(xiàn)的不在a~z之間的1個(gè)字符*匹配星號(hào)之前的0個(gè)或多個(gè)字符任何序列|匹配符號(hào)左邊或右邊出現(xiàn)的字符串+匹配加號(hào)之前的1個(gè)或多個(gè)字符的任何序列[[..]]匹配方括號(hào)里出現(xiàn)的符號(hào)(如空格、換行、括號(hào)、句號(hào)、冒號(hào)、加號(hào)、連字符等)?匹配問(wèn)號(hào)之前0個(gè)或多個(gè)字符[[:<:]和[[:>:]]匹配一個(gè)單詞的開始和結(jié)束{n}匹配括號(hào)前的內(nèi)容出現(xiàn)n次的序列[[::]匹配方括號(hào)里出現(xiàn)的字符中的任意一個(gè)字符()匹配括號(hào)里的內(nèi)容

3.1.3查詢條件:WHERE子句【例3.33】查詢姓李的同學(xué)的學(xué)號(hào)、姓名和專業(yè)名。select學(xué)號(hào),姓名,專業(yè)名

fromxswhere姓名regexp'^李';執(zhí)行結(jié)果如圖所示?!纠?.34】查詢學(xué)號(hào)里包含4、5、6的學(xué)生學(xué)號(hào)、姓名和專業(yè)名。

select學(xué)號(hào),姓名,專業(yè)名fromxswhere學(xué)號(hào)regexp'[4,5,6]';執(zhí)行結(jié)果如圖所示。3.1.3查詢條件:WHERE子句【例3.35】查詢學(xué)號(hào)以08開頭,以08結(jié)尾的學(xué)生學(xué)號(hào)、姓名和專業(yè)名。select學(xué)號(hào),姓名,專業(yè)名

fromxswhere學(xué)號(hào)regexp'^08.*08$';執(zhí)行結(jié)果如圖所示。3.1.3查詢條件:WHERE子句3.范圍比較用于范圍比較的關(guān)鍵字有兩個(gè):BETWEEN和IN??梢允褂肂ETWEEN關(guān)鍵字指出查詢范圍:表達(dá)式[NOT]BETWEEN表達(dá)式1AND表達(dá)式2當(dāng)不使用NOT時(shí),若表達(dá)式的值在表達(dá)式1與2之間(包括這兩個(gè)值),則返回TRUE,否則返回FALSE;使用NOT時(shí),返回值剛好相反。注意:表達(dá)式1的值不能大于表達(dá)式2的值。使用IN關(guān)鍵字可以指定一個(gè)值表,值表中列出所有可能的值。當(dāng)與值表中的任一個(gè)匹配時(shí),即返回TRUE,否則返回FALSE。表達(dá)式IN(表達(dá)式[,…n])3.1.3查詢條件:WHERE子句【例3.36】查詢xscj數(shù)據(jù)庫(kù)xs表中不在1993年出生的學(xué)生情況。select學(xué)號(hào),姓名,專業(yè)名,出生日期fromxswhere出生日期notbetween'1993-1-1'and'1993-12-31';執(zhí)行結(jié)果如下:3.1.3查詢條件:WHERE子句【例3.37】查詢xs表中專業(yè)名為“計(jì)算機(jī)”、“通信工程”或“無(wú)線電”的學(xué)生的情況。select*fromxswhere專業(yè)名in('計(jì)算機(jī)','通信工程','無(wú)線電');該語(yǔ)句與下句等價(jià):select*fromxswhere專業(yè)名='計(jì)算機(jī)'or專業(yè)名='通信工程'or專業(yè)名='無(wú)線電';說(shuō)明:IN關(guān)鍵字最主要的作用是表達(dá)子查詢。3.1.3查詢條件:WHERE子句4.空值比較當(dāng)需要判定一個(gè)表達(dá)式的值是否為空值時(shí),使用ISNULL關(guān)鍵字,格式為:表達(dá)式IS[NOT]NULL當(dāng)不使用NOT時(shí),若表達(dá)式表達(dá)式的值為空值,返回TRUE,否則返回FALSE;當(dāng)使用NOT時(shí),結(jié)果剛好相反。【例3.38】查詢xscj數(shù)據(jù)庫(kù)中總學(xué)分尚不定的學(xué)生情況。select*fromxswhere總學(xué)分isnull;本例即查找總學(xué)分為空的學(xué)生,結(jié)果為空。3.1.3查詢條件:WHERE子句5.子查詢?cè)诓樵儣l件中,可以使用另一個(gè)查詢的結(jié)果作為條件的一部分。例如,判定列值是否與某個(gè)查詢的結(jié)果集中的值相等,作為查詢條件一部分的查詢稱為子查詢。SQL標(biāo)準(zhǔn)允許SELECT多層嵌套使用,用來(lái)表示復(fù)雜的查詢。(1)IN子查詢IN子查詢用于進(jìn)行一個(gè)給定值是否在子查詢結(jié)果集中的判斷,格式為:表達(dá)式[NOT]IN(子查詢)當(dāng)表達(dá)式與子查詢結(jié)果表中的某個(gè)值相等時(shí),IN謂詞返回TRUE,否則返回FALSE;若使用了NOT,則返回的值剛好相反。3.1.3查詢條件:WHERE子句【例3.39】查找在xscj數(shù)據(jù)庫(kù)中選修了課程號(hào)為206的課程的學(xué)生的姓名、學(xué)號(hào)。

select姓名,學(xué)號(hào) fromxs where學(xué)號(hào)in (select學(xué)號(hào) fromxs_kc where課程號(hào)='206' );執(zhí)行結(jié)果如圖所示。3.1.3查詢條件:WHERE子句說(shuō)明:在執(zhí)行包含子查詢的SELECT語(yǔ)句時(shí),系統(tǒng)先執(zhí)行子查詢,產(chǎn)生一個(gè)結(jié)果表,再執(zhí)行外查詢。本例中,先執(zhí)行子查詢:select學(xué)號(hào)fromxs_kcwhere課程號(hào)='206';得到一個(gè)只含有學(xué)號(hào)列的表,xs_kc中的每個(gè)課程名列值為206的行在結(jié)果表中都有一行。再執(zhí)行外查詢,若xs表中某行的學(xué)號(hào)列值等于子查詢結(jié)果表中的任一個(gè)值,則該行就被選擇。注意:IN子查詢只能返回一列數(shù)據(jù)。對(duì)于較復(fù)雜的查詢,可使用嵌套的子查詢。3.1.3查詢條件:WHERE子句【例3.40】查找未選修離散數(shù)學(xué)的學(xué)生的姓名、學(xué)號(hào)、專業(yè)名。select姓名,學(xué)號(hào),專業(yè)名 fromxs

where學(xué)號(hào)notin ( select學(xué)號(hào) fromxs_kc where課程號(hào)in (select課程號(hào) fromkc where課程名='離散數(shù)學(xué)' ) );執(zhí)行結(jié)果如圖所示。3.1.3查詢條件:WHERE子句(2)比較子查詢這種子查詢可以認(rèn)為是IN子查詢的擴(kuò)展,它使表達(dá)式的值與子查詢的結(jié)果進(jìn)行比較運(yùn)算,格式為:表達(dá)式{<|<=|=|>|>=|!=|<>}{ALL|SOME|ANY}(子查詢)其中:ALL指定表達(dá)式要與子查詢結(jié)果集中的每個(gè)值都進(jìn)行比較,當(dāng)表達(dá)式與每個(gè)值都滿足比較的關(guān)系時(shí),才返回TRUE,否則返回FALSE。SOME或ANY是同義詞,表示表達(dá)式只要與子查詢結(jié)果集中的某個(gè)值滿足比較的關(guān)系時(shí),就返回TRUE,否則返回FALSE。如果子查詢的結(jié)果集只返回一行數(shù)據(jù)時(shí),可以通過(guò)比較運(yùn)算符直接比較。3.1.3查詢條件:WHERE子句【例3.41】查找選修了離散數(shù)學(xué)的學(xué)生學(xué)號(hào)。select學(xué)號(hào)

fromxs_kc where課程號(hào)= ( select課程號(hào) fromkc where課程名='離散數(shù)學(xué)' );執(zhí)行結(jié)果如圖所示。3.1.3查詢條件:WHERE子句【例3.42】查找xs表中比所有計(jì)算機(jī)系的學(xué)生年齡都大的學(xué)生學(xué)號(hào)、姓名、專業(yè)名、出生日期。select學(xué)號(hào),姓名,專業(yè)名,出生日期 fromxs

where出生日期<all ( select出生日期 fromxs where專業(yè)名='計(jì)算機(jī)' );執(zhí)行結(jié)果如圖所示。3.1.3查詢條件:WHERE子句【例3.43】查找xs_kc表中課程號(hào)206的成績(jī)不低于課程號(hào)101的最低成績(jī)的學(xué)生的學(xué)號(hào)。select學(xué)號(hào)

fromxs_kc where課程號(hào)='206'and成績(jī)>=any ( select成績(jī) fromxs_kc where課程號(hào)='101' );執(zhí)行結(jié)果如圖所示。3.1.3查詢條件:WHERE子句(3)EXISTS子查詢EXISTS謂詞用于測(cè)試子查詢的結(jié)果是否為空表,若子查詢的結(jié)果集不為空,則EXISTS返回TRUE,否則返回FALSE。EXISTS還可與NOT結(jié)合使用,即NOTEXISTS,其返回值與EXIST剛好相反。格式為:[NOT]EXISTS(subquery)【例3.44】查找選修206號(hào)課程的學(xué)生姓名。select姓名

fromxswhereexists(select*fromxs_kcwhere學(xué)號(hào)=xs.學(xué)號(hào)and課程號(hào)='206');執(zhí)行結(jié)果如圖所示。3.1.3查詢條件:WHERE子句【例3.45】查找選修了全部課程的同 學(xué)的姓名。select姓名fromxswherenotexists(select*fromkcwherenotexists(select*fromxs_kcwhere學(xué)號(hào)=xs.學(xué)號(hào)and課程號(hào)=kc.課程號(hào)));說(shuō)明:由于沒(méi)有人選了全部課程,所以結(jié)果為空。MySQL區(qū)分了4種類型的子查詢:a.回一個(gè)表的子查詢是表子查詢;b.返回帶有一個(gè)或多個(gè)值的一行的子查詢是行子查詢;c.返回一行或多行,但每行上只有一個(gè)值的是列子查詢;d.只返回一個(gè)值的是標(biāo)量子查詢。從定義上講,每個(gè)標(biāo)量子查詢都是一個(gè)列子查詢和行子查詢。3.1.3查詢條件:WHERE子句【例3.46】從xs表中查找總學(xué)分大于50分的男同學(xué)的姓名和學(xué)號(hào)。select姓名,學(xué)號(hào),總學(xué)分from(select姓名,學(xué)號(hào),性別,總學(xué)分

fromxswhere總學(xué)分>50)asstudentwhere性別='1';執(zhí)行結(jié)果如圖所示。說(shuō)明:在這個(gè)例子中,首先處理FROM子句中的子查詢,將結(jié)果放到一個(gè)中間表中,并為表定義一個(gè)名稱student,然后再根據(jù)外部查詢條件從student表中查詢出數(shù)據(jù)。另外,子查詢還可以嵌套使用。3.1.3查詢條件:WHERE子句【例3.47】從xs表中查找所有女學(xué)生的姓名、學(xué)號(hào),以及與081101號(hào)學(xué)生的年齡差距。select學(xué)號(hào),姓名,year(出生日期)-year(

(select出生日期fromxswhere學(xué)號(hào)='081101'))as年齡差距fromxswhere性別='0';執(zhí)行結(jié)果如圖所示。說(shuō)明:本例中子查詢返回值中只有一個(gè)值,所以這是一個(gè)標(biāo)量子查詢。YEAR函數(shù)用于取出DATE類型數(shù)據(jù)的年份。3.1.3查詢條件:WHERE子句【例3.48】查找與081101號(hào)學(xué)生性別相同、總學(xué)分相同的學(xué)生學(xué)號(hào)和姓名。select學(xué)號(hào),姓名

fromxswhere(性別,總學(xué)分)=(select性別,總學(xué)分fromxswhere學(xué)號(hào)='081101');執(zhí)行結(jié)果如圖所示。3.1.4分組:GROUPBY子句GROUPBY子句主要用于根據(jù)字段對(duì)行分組。語(yǔ)法格式如下:GROUPBY{列名|表達(dá)式|列順序}[ASC|DESC],...[WITHROLLUP]說(shuō)明:(1)可以根據(jù)一個(gè)或多個(gè)列進(jìn)行分組,也可以根據(jù)表達(dá)式進(jìn)行分組,經(jīng)常和聚合函數(shù)一起使用。GROUPBY子句可以在列的后面指定ASC(升序)或DESC(降序)。(2)如果選擇“順序號(hào)”,則分組的列是SELECT順序號(hào)對(duì)應(yīng)輸出列相同。(3)帶ROLLUP,指定在結(jié)果集內(nèi)不僅包含正常行,還包含匯總行。3.1.4分組:GROUPBY子句【例3.49】查詢各專業(yè)及其學(xué)生數(shù)。select專業(yè)名,count(*)as'學(xué)生數(shù)'

fromxsgroupby專業(yè)名;執(zhí)行結(jié)果如右圖所示。【例3.50】求被選修的各門課程的平均成績(jī)和選修該課程的人數(shù)。select課程號(hào),avg(成績(jī))as'平均成績(jī)',count(學(xué)號(hào))as'

選修人數(shù)'

fromxs_kcgroupby課程號(hào);執(zhí)行結(jié)果如圖所示。3.1.4分組:GROUPBY子句【例3.51】查詢每個(gè)專業(yè)的男生人數(shù)、女生人數(shù)、總

人數(shù),以及學(xué)生總?cè)藬?shù)。

select專業(yè)名,性別,count(*)as'人數(shù)'fromxsgroupby專業(yè)名,性別withrollup;執(zhí)行結(jié)果如圖所示。3.1.4分組:GROUPBY子句本例根據(jù)專業(yè)名和性別將xs表分為4組,使用ROLLUP后,先對(duì)性別字段產(chǎn)生了匯總行(針對(duì)專業(yè)名相同的行),然后對(duì)專業(yè)名與性別均不同的值產(chǎn)生了匯總行。所產(chǎn)生的匯總行中對(duì)應(yīng)具有不同列值的字段值將置為NULL。將上述語(yǔ)句與不帶ROLLUP操作符的GROUPBY子句的執(zhí)行情況作一個(gè)比較:select專業(yè)名,性別,count(*)as'人數(shù)'fromxsgroupby專業(yè)名,性別;執(zhí)行結(jié)果如右圖所示。

3.1.4分組:GROUPBY子句【例3.52】在xscj數(shù)據(jù)庫(kù)上產(chǎn)生一個(gè)結(jié)果集,包括每門課程各專業(yè)的平均成績(jī)、每門課程的總平均成績(jī)和所有課程的總平均成績(jī)。select課程名,專業(yè)名,avg(成績(jī))as'平均成績(jī)'fromxs_kc,kc,xswherexs_kc.課程號(hào)=kc.課程號(hào)andxs_kc.學(xué)號(hào)=xs.學(xué)號(hào)groupby課程名,專業(yè)名withrollup;執(zhí)行結(jié)果為:3.1.5分組條件:HAVING子句使用HAVING子句的目的與WHERE子句類似,不同的是WHERE子句是用來(lái)在FROM子句之后選擇行,而HAVING子句用來(lái)在GROUPBY子句后選擇行。語(yǔ)法格式:HAVING條件其中:條件的定義和WHERE子句中的條件類似,不過(guò)HAVING子句中的條件可以包含聚合函數(shù),而WHERE子句中則不可以。SQL標(biāo)準(zhǔn)要求HAVING必須引用GROUPBY子句中的列或用于聚合函數(shù)中的列。MySQL允許HAVING引用SELECT清單中的列和外部子查詢中的列。3.1.5分組條件:HAVING子句【例3.53】查找平均成績(jī)?cè)?5分以上的學(xué)生的學(xué)號(hào)和平均成績(jī)。select學(xué)號(hào),avg(成績(jī))as'平均成績(jī)'

fromxs_kcgroupby學(xué)號(hào)havingavg(成績(jī))>=85;執(zhí)行結(jié)果如圖所示。3.1.5分組條件:HAVING子句【例3.54】查找選修課程超過(guò)2門且成績(jī)都在80分以上的學(xué)生的學(xué)號(hào)。select學(xué)號(hào)fromxs_kc

where成績(jī)>=80groupby學(xué)號(hào)havingcount(*)>2;執(zhí)行結(jié)果如圖所示。3.1.5分組條件:HAVING子句【例3.55】查找通信工程專業(yè)平均成績(jī)?cè)?5分以上的學(xué)生的學(xué)號(hào)和平均成績(jī)。select學(xué)號(hào),avg(成績(jī))as'平均成績(jī)'fromxs_kcwhere學(xué)號(hào)in(select學(xué)號(hào)fromxswhere專業(yè)名='通信工程'

)groupby學(xué)號(hào)havingavg(成績(jī))>=85;執(zhí)行結(jié)果如圖所示。3.1.6排序:ORDERBY子句在一條SELECT語(yǔ)句中,如果不使用ORDERBY子句,結(jié)果中行的順序是不可預(yù)料的。使用ORDERBY子句后可以保證結(jié)果中的行按一定順序排列。語(yǔ)法格式:ORDERBY{列名|表達(dá)式|順序號(hào)}[ASC|DESC],...說(shuō)明:ORDERBY子句列意義與GROUPBY子句相同?!纠?.56】將通信工程專業(yè)的學(xué)生按出生日期先后排序。select學(xué)號(hào),姓名,專業(yè)名,出生日期fromxswhere專業(yè)名='通信工程'orderby出生日期;執(zhí)行結(jié)果如圖所示。3.1.6排序:ORDERBY子句【例3.57】將計(jì)算機(jī)專業(yè)學(xué)生的“計(jì)算機(jī)基礎(chǔ)”課程成績(jī)按降序排列。select姓名,課程名,成績(jī)

fromxs,kc,xs_kcwherexs.學(xué)號(hào)=xs_kc.學(xué)號(hào)andxs_kc.課程號(hào)=kc.課程號(hào)and課程名='計(jì)算機(jī)基礎(chǔ)'and專業(yè)名='計(jì)算機(jī)'orderby成績(jī)desc;執(zhí)行結(jié)果如圖所示。3.1.6排序:ORDERBY子句【例3.58】將計(jì)算機(jī)專業(yè)學(xué)生按其平均成績(jī)排列。

select學(xué)號(hào),姓名,專業(yè)名fromxswhere專業(yè)名='計(jì)算機(jī)'orderby(selectavg(成績(jī))fromxs_kcgroupbyxs_kc.學(xué)號(hào)havingxs.學(xué)號(hào)=xs_kc.學(xué)號(hào));執(zhí)行結(jié)果如圖所示。3.1.7輸出行限制:LIMIT子句LIMIT子句,主要用于限制被SELECT語(yǔ)句返回的行數(shù)。語(yǔ)法格式:LIMIT{[偏移量,]行數(shù)}【例3.59】查找xs表中學(xué)號(hào)最靠前的5位學(xué)生的信息。select學(xué)號(hào),姓名,專業(yè)名,性別,出生日期,總學(xué)分 fromxs orderby學(xué)號(hào) limit5;執(zhí)行結(jié)果為:3.1.7輸出行限制:LIMIT子句【例3.60】查找xs表中從第4位同學(xué)開始的5位學(xué)生的信息。select學(xué)號(hào),姓名,專業(yè)名,性別,出生日期,總學(xué)分 fromxs orderby學(xué)號(hào) limit3,5;執(zhí)行結(jié)果為:3.1.8聯(lián)合查詢:UNION語(yǔ)句使用UNION語(yǔ)句,可以把來(lái)自許多SELECT語(yǔ)句的結(jié)果組合到一個(gè)結(jié)果集合中。語(yǔ)法格式如下:SELECT...UNION[ALL|DISTINCT]SELECT...[UNION[ALL|DISTINCT]SELECT...]說(shuō)明:SELECT語(yǔ)句為常規(guī)的選擇語(yǔ)句,但是還必須遵守以下規(guī)則:列于每個(gè)SELECT語(yǔ)句的對(duì)應(yīng)位置的被選擇的列,應(yīng)具有相同的數(shù)目和類型。例如,被第一個(gè)語(yǔ)句選擇的第一列,應(yīng)當(dāng)和被其他語(yǔ)句選擇的第一列具有相同的類型。只有最后一個(gè)SELECT語(yǔ)句可以使用INTOOUTFILE。HIGH_PRIORITY不能與作為UNION一部分的SELECT語(yǔ)句同時(shí)使用。ORDERBY和LIMIT子句只能在整個(gè)語(yǔ)句最后指定,同時(shí)還應(yīng)對(duì)單個(gè)的SELECT語(yǔ)句加圓括號(hào)。排序和限制行數(shù)對(duì)整個(gè)最終結(jié)果起作用。3.1.8聯(lián)合查詢:UNION語(yǔ)句【例3.61】查找學(xué)號(hào)為081101和學(xué)號(hào)為081210的兩位同學(xué)的信息。select學(xué)號(hào),姓名,專業(yè)名,性別,出生日期,總學(xué)分 fromxs where學(xué)號(hào)='081101' union select學(xué)號(hào),姓名,專業(yè)名,性別,出生日期,總學(xué)分 fromxs where學(xué)號(hào)='081210';執(zhí)行結(jié)果為:3.1.9行瀏覽查詢:HANDLER語(yǔ)句1.打開一個(gè)表可以使用HANDLEROPEN語(yǔ)句打開一個(gè)表。語(yǔ)法格式:HANDLER表名OPEN[[AS]alias]說(shuō)明:可以使用AS子句給表定義一個(gè)別名。若打開表時(shí)使用別名,則在其他進(jìn)一步訪問(wèn)表的語(yǔ)句中也都要使用這個(gè)別名。3.1.9行瀏覽查詢:HANDLER語(yǔ)句2.瀏覽表中的行HANDLERREAD語(yǔ)句用于瀏覽一個(gè)已打開的表的數(shù)據(jù)行。語(yǔ)法格式:HANDLER表名READ{FIRST|NEXT}[WHERE條件][LIMIT...]說(shuō)明:FIRST|NEXT:這兩個(gè)關(guān)鍵字是HANDLER語(yǔ)句的讀取聲明,F(xiàn)IRST表示讀取第一行,NEXT表示讀取下一行。WHERE子句:如果想返回符合特定條件的行,可以加一條WHERE子句,這里的WHERE子句和SELECT語(yǔ)句中的WHERE子句具有相同的功能,但是這里的WHERE子句中不能包含子查詢、系統(tǒng)內(nèi)置函數(shù)、BETWEEN、LIKE和IN運(yùn)算符。LIMIT子句:若不使用LIMIT子句,HANDLER語(yǔ)句只取表中的一行數(shù)據(jù)。若要讀取多行數(shù)據(jù),則要添加LIMIT子句。這里的LIMIT子句和SELECT語(yǔ)句中的LIMIT子句不同。3.1.9行瀏覽查詢:HANDLER語(yǔ)句由于沒(méi)有其他的聲明,在讀取一行數(shù)據(jù)的時(shí)候行的順序是由MySQL決定的。如果要按某個(gè)順序來(lái)顯示,可以通過(guò)在HANDLERREAD語(yǔ)句中指定索引來(lái)實(shí)現(xiàn)。語(yǔ)法格式:HANDLER表名READ索引名{=|<=|>=|<|>}(值...)[WHERE條件][LIMIT...]HANDLER表名READ索引名{FIRST|NEXT|PREV|LAST}[WHERE條件][LIMIT...]說(shuō)明:第一種方式是使用比較運(yùn)算符為索引指定一個(gè)值,并從符合該條件的一行數(shù)據(jù)開始讀取表。如果是多列索引,則值為多個(gè)值的組合,中間用逗號(hào)隔開。第二種方式是使用關(guān)鍵字讀取行,F(xiàn)IRST表示第一行,NEXT表示下一行,PREV表示上一行,LAST表示最后一行。3.1.9行瀏覽查詢:HANDLER語(yǔ)句3.關(guān)閉打開的表行讀取完后必須使用HANDLERCLOSE語(yǔ)句來(lái)關(guān)閉表。語(yǔ)法格式:HANDLER表名CLOSE【例3.62】一行一行地瀏覽KC表中滿足要求的內(nèi)容,要求第一行為學(xué)分大于4的第一行數(shù)據(jù)。打開表:usexscjhandlerkcopen;讀取滿足條件的第一行:handlerkcreadfirstwhere學(xué)分>4;執(zhí)行結(jié)果為:3.1.9行瀏覽查詢:HANDLER語(yǔ)句讀取下一行:handlerkcreadnext;執(zhí)行結(jié)果為:關(guān)閉該表:handlerkcclose;3.2MySQL視圖3.2.1視圖的概念使用視圖有下列優(yōu)點(diǎn):(1)為用戶集中數(shù)據(jù),簡(jiǎn)化用戶的數(shù)據(jù)查詢和處理。有時(shí)用戶所需要的數(shù)據(jù)分散在多個(gè)表中,定義視圖可將它們集中在一起,從而方便用戶的數(shù)據(jù)查詢和處理。(2)屏蔽數(shù)據(jù)庫(kù)的復(fù)雜性。用戶不必了解復(fù)雜的數(shù)據(jù)庫(kù)中的表結(jié)構(gòu),并且數(shù)據(jù)庫(kù)表的更改也不影響用戶對(duì)數(shù)據(jù)庫(kù)的使用。(3)簡(jiǎn)化用戶權(quán)限的管理。只需授予用戶使用視圖的權(quán)限,而不必指定用戶只能使用表的特定列,也增加了安全性。(4)便于數(shù)據(jù)共享。各用戶不必都定義和存儲(chǔ)自己所需的數(shù)據(jù),可共享數(shù)據(jù)庫(kù)的數(shù)據(jù),這樣同樣的數(shù)據(jù)只需存儲(chǔ)一次。(5)可以重新組織數(shù)據(jù)以便輸出到其他應(yīng)用程序中。3.2.2創(chuàng)建視圖視圖在數(shù)據(jù)庫(kù)中是作為一個(gè)對(duì)象來(lái)存儲(chǔ)的。用戶創(chuàng)建視圖前,要保證自己已被數(shù)據(jù)庫(kù)所有者授權(quán)可以使用CREATEVIEW語(yǔ)句,并且有權(quán)操作視圖所涉及的表或其他視圖。語(yǔ)法格式:CREATE[ORREPLACE]VIEW視圖名[(列名...)]ASselect語(yǔ)句說(shuō)明:ORREPLACE:能夠替換已有的同名視圖。列名...:為視圖的列定義明確的名稱,由逗號(hào)隔開的列名。列名數(shù)目必須等于SELECT語(yǔ)句檢索的列數(shù)。若使用與源表或視圖中相同的列名時(shí)可以省略列名。select語(yǔ)句:用來(lái)創(chuàng)建視圖的SELECT語(yǔ)句,可在SELECT語(yǔ)句中查詢多個(gè)表或視圖。3.2.2創(chuàng)建視圖但對(duì)SELECT語(yǔ)句有以下的限制:(1)定義視圖的用戶必須對(duì)所參照的表或視圖有查詢(即可執(zhí)行SELECT語(yǔ)句)權(quán)限;(2)不能包含F(xiàn)ROM子句中的子查詢;(3)在定義中引用的表或視圖必須存在;(4)若引用不是當(dāng)前數(shù)據(jù)庫(kù)的表或視圖時(shí),要在表或視圖前加上數(shù)據(jù)庫(kù)的名稱;(5)在視圖定義中允許使用ORDERBY,但是,如果從特定視圖進(jìn)行了選擇,而該視圖使用了具有自己ORDERBY的語(yǔ)句,則視圖定義中的ORDERBY將被忽略。(6)對(duì)于SELECT語(yǔ)句中的其他選項(xiàng)或子句,若視圖中也包含了這些選項(xiàng),則效果未定義。例如,如果在視圖定義中包含LIMIT子句,而SELECT語(yǔ)句使用了自己的LIMIT子句,MySQL對(duì)使用哪個(gè)LIMIT未作定義。3.2.2創(chuàng)建視圖【例3.63】假設(shè)當(dāng)前數(shù)據(jù)庫(kù)是test,創(chuàng)建xscj數(shù)據(jù)庫(kù)上的cs_kc視圖,包括計(jì)算機(jī)專業(yè)各學(xué)生的學(xué)號(hào)、其選修的課程號(hào)及成績(jī)。要保證對(duì)該視圖的修改都符合專業(yè)名為“計(jì)算機(jī)”這個(gè)條件。createorreplaceviewxscj.cs_kcasselectxs.學(xué)號(hào),課程號(hào),成績(jī)fromxscj.xs,xscj.xs_kcwherexs.學(xué)號(hào)=xs_kc.學(xué)號(hào)andxs.專業(yè)名='計(jì)算機(jī)'withcheckoption;【例3.64】創(chuàng)建xscj數(shù)據(jù)庫(kù)上的計(jì)算機(jī)專業(yè)學(xué)生的平均成績(jī)視圖cs_kc_avg,包括學(xué)號(hào)(在視圖中列名為num)和平均成績(jī)(在視圖中列名為score_avg)。usexscjcreateviewcs_kc_avg(num,score_avg)asselect學(xué)號(hào),avg(成績(jī))fromcs_kcgroupby學(xué)號(hào);3.2.3查詢視圖視圖定義后,就可以如同查詢基本表那樣對(duì)視圖進(jìn)行查詢?!纠?.65】在視圖cs_kc中查找計(jì)算機(jī)專業(yè)的學(xué)生學(xué)號(hào)和選修的課程號(hào)。select學(xué)號(hào),課程號(hào)fromcs_kc;3.2.3查詢視圖【例3.66】查找平均成績(jī)?cè)?0分以上的學(xué)生的學(xué)號(hào)和平均成績(jī)。本例首先創(chuàng)建學(xué)生平均成績(jī)

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論