前面一篇SQL語句復(fù)習(xí)的文章復(fù)習(xí)了本學(xué)期需要掌握的6條SQL語句中的5條,今天主要復(fù)習(xí)一下需要掌握的另一條SQL語句:Select語句。 Select語句,稱為查詢語句,其作用是從一個(gè)或多個(gè)表中檢索數(shù)據(jù),其結(jié)果依然是一個(gè)表(關(guān)系)。由于這個(gè)語句涉及的子句較多,在我們現(xiàn)用教材上僅僅表示語法就書寫了12行,所以不建議一次性全把語法背下來,而是通過一些例子逐漸掌握各個(gè)子句的作用。為便于實(shí)驗(yàn),請(qǐng)?jiān)谀愕哪J(rèn)路徑下準(zhǔn)備如下三張表: 結(jié)構(gòu):學(xué)號(hào) C(5),姓名 C(6),性別 C(2),出生日期 D,班級(jí) C(14) 結(jié)構(gòu):課程號(hào) C(3),課程名 C(14),學(xué)分 N(3,1),任課教師 C(6) 結(jié)構(gòu):學(xué)號(hào) C(5),課程號(hào) C(3),成績(jī) N(5,1) 既然Select語句執(zhí)行的結(jié)果也是一張表,那么它的語句中就應(yīng)該指明產(chǎn)生這張表的字段和記錄。Select關(guān)鍵詞后指明所需要的字段,F(xiàn)rom關(guān)鍵詞指明數(shù)據(jù)的來源。 例1:找出所有學(xué)生的姓名及他們各自所在的班級(jí)。 語句:select 姓名,班級(jí) from 學(xué)生 注:字段的順序任意,各字段間用逗號(hào)隔開。此語句會(huì)顯示“學(xué)生”表中所有學(xué)生的姓名及班級(jí)。 例2:顯示學(xué)生表中所有內(nèi)容。 語句:Select * from 學(xué)生 注:如果需要顯示一張表中的所有字段,并且字段的顯示順序與表中原順序一致,則不需要將字段名像例1那樣全部羅列一遍,而是用一個(gè)星號(hào)(*)代表所有字段 前面兩個(gè)例子主要是說明字段的選取和書寫方式,這是從一個(gè)表的列(字段)方面在考慮,對(duì)行(記錄)方面作出限制則使用where關(guān)鍵字,再加上限制條件即可。 例3:顯示學(xué)生表中所有男生的姓名和班級(jí)。 語句:select 姓名,班級(jí) from 學(xué)生 where 性別='男' 在一張表中不能出現(xiàn)完全相同的記錄,但當(dāng)選擇一個(gè)表的部分字段時(shí)可能出現(xiàn)完全相同的記錄的,想去除重復(fù)的記錄,可在Select后加上Distinct。 例4:顯示學(xué)生表中所有的班級(jí)名。 Select distinct 班級(jí) from 學(xué)生 注:學(xué)生表中有6條記錄,但他們實(shí)際來自于3個(gè)班,上例中若不使用distinct則顯示6行結(jié)果(相同班級(jí)可能顯示多次),加上distinct之后則只顯示3行結(jié)果,符合實(shí)際需要。 將查詢結(jié)果進(jìn)行排序,則需要用到order by子句。語法:order by 字段1 ASC|DESC,字段2 ASC|DESC...。ASC表示升序排列,DESC表示降序排列,默認(rèn)是升序。只有當(dāng)?shù)谝粋€(gè)字段值相同時(shí),才考慮第二個(gè)排序字段...。 例5:查詢“成績(jī)”表中所有“D01”課程的成績(jī),并按升序顯示查詢結(jié)果。 語句:select * from 成績(jī) where 課程號(hào)='D01' order by 成績(jī) 有時(shí)候可能需要將一個(gè)表中的數(shù)據(jù)進(jìn)行分組計(jì)算,例如:如果想知道每門課的最高分怎么辦?這時(shí)候不是首先看哪個(gè)值最大,而是應(yīng)該將所有成績(jī)按課程號(hào)分成不同的組,只有相同課程號(hào)的成績(jī)相互比較才有意義。Select語句中使用“group by 字段名”,按指定的字段名分組計(jì)算。 例6:查詢各課程號(hào)的最高分。 語句:Select 課程號(hào),max(成績(jī)) 最高分 from 成績(jī) group by 課程號(hào) 注:max(成績(jī)) 最高分,最高分是作為max(成績(jī))的別名,另一種寫法是:max(成績(jī)) as 最高分。 需要注意的是,如果想篩選通過分組計(jì)算的結(jié)果,不能使用where子名,而是使用Having子句??梢赃@樣理解:where是對(duì)表的原始記錄做限定,Having是對(duì)分組的計(jì)算結(jié)果進(jìn)行限定,Having不能單獨(dú)使用,只能用在Group by之后。 例7:查詢除“D03“以外的所有課程的最高分,并顯示最高分超過80分的課程。 語句:Select 課程號(hào),max(成績(jī)) 最高分 from 成績(jī) group by 課程號(hào) having 最高分>80 where 課程號(hào)<>'D03' 注:這里有兩個(gè)限定:課程號(hào)不是D03,也就是對(duì)原始記錄作出篩選,where子句將不是D03的記錄選出來進(jìn)行分組;另一個(gè)限定條件是最高分大于80,這個(gè)條件在原表中是無法直接表達(dá)的,只有分組后用Max函數(shù)才能計(jì)算得到,對(duì)分組計(jì)算結(jié)果篩選,這就要用Having子句了。 前面的例子的數(shù)據(jù)來源都來自于一張表,若數(shù)據(jù)來源于多張表,則需要做表的連接查詢。連接的方法可以是where子句簡(jiǎn)單連接,也可以是join子句的超連接。超連接中用得最多的內(nèi)連接,它跟where子句達(dá)到的效果是一致的,所以大部分時(shí)間你可以自由選擇這兩種方法。當(dāng)一個(gè)字段名在多個(gè)表中出現(xiàn)時(shí),需要指明字段所在的表:表名 .字段名。 例8:查詢各個(gè)學(xué)生的姓名、成績(jī)。 語句1:select 姓名,成績(jī) from 學(xué)生,成績(jī) where 學(xué)生.學(xué)號(hào)=成績(jī).學(xué)號(hào) 語句2:select 姓名,成績(jī) from 學(xué)生 join 成績(jī) on 學(xué)生.學(xué)號(hào)=成績(jī).學(xué)號(hào) 例9:查詢各個(gè)學(xué)生所修課程的課程名、成績(jī) 語句1:select 姓名,課程名,成績(jī) from 學(xué)生,成績(jī),課程 where 學(xué)生.學(xué)號(hào)=成績(jī).學(xué)號(hào) and 成績(jī).課程號(hào)=課程.課程號(hào) 語句2:select 姓名,課程名,成績(jī) from 學(xué)生 join 成績(jī) join 課程 on 成績(jī).課程號(hào)=課程.課程號(hào) on 學(xué)生.學(xué)號(hào)=成績(jī).學(xué)號(hào) 如果一個(gè)查詢的條件需要另一個(gè)查詢?nèi)カ@取,則一個(gè)查詢中需要包含另一個(gè)查詢語句,稱為嵌套查詢。 例10:查詢“代非”所在班的全體學(xué)生信息。 語句:select * from 學(xué)生 where 班級(jí)=(select 班級(jí) from 學(xué)生 where 姓名='代非') 注:括號(hào)內(nèi)的select語句就是一個(gè)子查詢,它的作用是找出“代非”所在班級(jí)的班級(jí)名。 例11:查詢成績(jī)表中女生的成績(jī)信息。 語句1:select 成績(jī).學(xué)號(hào),課程號(hào),成績(jī) from 成績(jī) where 學(xué)號(hào) in (select 學(xué)號(hào) from 學(xué)生 where 性別='女') 語句2:select * from 成績(jī) where 學(xué)號(hào) in (select 學(xué)號(hào) from 學(xué)生 where 性別='女') 注:這里語句2使用了子查詢來找出所有的女生的學(xué)號(hào),然后再在成績(jī)表中找出這些學(xué)號(hào)對(duì)應(yīng)的成績(jī)。仔細(xì)觀察例10和例11兩個(gè)子查詢的區(qū)別。例10的子查詢結(jié)果只有一個(gè)值這里用了“=”號(hào);例11的子查詢的結(jié)果可能是多個(gè)值,這里用了in運(yùn)算符。有興趣的同學(xué)還可以去查查什么時(shí)候用exist。 最后說一說查詢的去向,默認(rèn)情況下都是并查詢結(jié)果以瀏覽窗口的形式顯示出來。也可以自定義查詢?nèi)ハ?。常用的有?/span> into table 表名 將查詢結(jié)果存入“表名”所指的表中(自動(dòng)創(chuàng)建表,不需要預(yù)先創(chuàng)建,同名的表將被覆蓋)。 into cursor 臨時(shí)表名 將查詢結(jié)果存到內(nèi)存中的臨時(shí)表中 to file 文件名 將查詢結(jié)果存到文本文件中 這里并沒有包含Select語句的所有用法,可在瀏覽完本文后再閱讀一下教材。 公眾號(hào):CDUT-Computer
|
|