【文章內(nèi)容簡(jiǎn)介】
課程名稱⑤查詢所有學(xué)生的姓名、院系和年齡小知識(shí):在指定列查詢過(guò)程中,所指定列的順序可以與表中定義的順序不一致。查詢?nèi)康牧腥绻樵儽碇械娜苛?,可以使用兩種方法。一種是在目標(biāo)列名序列中列出所有的列名。另一種方法是簡(jiǎn)單在目標(biāo)列名序列中寫(xiě)星號(hào)“*”。查詢?nèi)w學(xué)生的信息。①使用第一種方法,即目標(biāo)列名序列中列出所有的列名。SELECT SNO, SNAME, SSEX, SAGE, SDEPT FROM STUDENT②使用第二種方法,即目標(biāo)列名序列用星號(hào)“*”來(lái)代替。SELECT * FROM STUDENT動(dòng)手做:③查詢選課表中的所有信息④查詢課程表中的全部信息查詢經(jīng)過(guò)計(jì)算的列①查詢?nèi)w學(xué)生的姓名及出生年份(提示:本年度(2006)—SAGE即為出生年份)SELECT SNAME,2006SAGE FROM STUDENT ②查詢?nèi)w學(xué)生的姓名和出生年份,并在年份前加一個(gè)列,此列的每行數(shù)據(jù)均為“出生年份是:”常量值。SELECT SNAME, 39。出生年份是:39。,2006SAGE FROM STUDENT注意:選擇列表中的常量和計(jì)算是對(duì)表中的每行進(jìn)行的。改變列標(biāo)題的語(yǔ)法格式為:列名 | 表達(dá)式 [AS] 列標(biāo)題 或 列標(biāo)題 = 列名 | 表達(dá)式 則查詢①可寫(xiě)為:SELECT SNAME, 2004SAGE 出生年份FROM STUDENT 或SELECT SNAME, 2006SAGE AS 出生年份 FROM STUDENT查詢②可寫(xiě)為:SELECT SNAME, 39。出生年份是:39。 AS 常量字段,2006SAGE AS 出生年份 FROM STUDENT二、選擇表中的若干元組DISTINCT和TOP的用法消除取值重復(fù)行的方法是使用DISTINCT語(yǔ)句。也可以使用TOP n 返回結(jié)果中的前n行數(shù)據(jù)。①查詢有選課的學(xué)生的學(xué)號(hào)SELECT DISTINCT SNO FROM SC ②查詢出前兩個(gè)選了課學(xué)生的學(xué)號(hào)SELECT DISTINCT TOP 2 SNO FROM SCWHERE 子句的使用(1)比較(比較運(yùn)算符)動(dòng)手做:①查詢管理系全體學(xué)生的姓名②查詢大于20歲學(xué)生的所有信息③查詢成績(jī)不及格的學(xué)生的學(xué)號(hào)④查詢年齡小于18歲的學(xué)生的姓名、院系⑤查詢學(xué)時(shí)小于40的全部課程信息(2)確定范圍動(dòng)手做:①查詢年齡在20~22歲之間的學(xué)生的姓名、所在系和年齡思考問(wèn)題:上面的查詢有幾種實(shí)現(xiàn)方法?②查詢課程的學(xué)時(shí)在4060分之間的課程信息(3)確定集合IN語(yǔ)法格式為:列名 [NOT] IN (常量1, 常量2, …, 常量n,) ①查詢管理系、經(jīng)濟(jì)系學(xué)生的姓名和性別 SELECT SNAME,SSEX FROM STUDENT WHERE SDEPT IN(39。管理系39。,39。經(jīng)濟(jì)系39。)②查詢不是管理系、經(jīng)濟(jì)系學(xué)生的姓名和性別SELECT SNAME,SSEX FROM STUDENT WHERE SDEPT NOT IN(39。管理系39。,39。經(jīng)濟(jì)系39。)動(dòng)手做:③查詢年齡為19,22,38歲的所有學(xué)生的信息④查詢成績(jī)?yōu)?8,79,89分的選課信息⑤查詢課程名稱為數(shù)據(jù)庫(kù)原理,稅法,財(cái)務(wù)管理的課程信息(4)字符匹配動(dòng)手做:①查詢姓“張”的學(xué)生的詳細(xì)信息②查詢學(xué)生表中姓“張”、姓“李”和姓“劉”的學(xué)生的情況③查詢名字中第2個(gè)字為“小”或“大”字的學(xué)生的姓名和學(xué)號(hào)④查詢所有不姓“劉”的學(xué)生的情況⑤查詢學(xué)生表中學(xué)生的學(xué)號(hào)最后一位不是2,3,5 學(xué)生的情況⑥查詢課程表中第一個(gè)字是數(shù),財(cái)?shù)恼n程信息⑦用SQL語(yǔ)句看看是否有人與你的第二個(gè)字相同⑧查詢學(xué)生姓名中帶有文字的學(xué)生信息⑨查詢學(xué)生的學(xué)號(hào)最后一位是/不是1,3,5,7,9的學(xué)生的學(xué)號(hào)和姓名小知識(shí):如果在所要查找的字符中存在%或_應(yīng)該如何去查找?如查找課程名稱為“DB_”開(kāi)頭的課程。 解:使用轉(zhuǎn)意字符ESCAPE39。轉(zhuǎn)換字符39。SELECT * FROM COURSE WHERE CNAME LIKE 39。DB\_%39。 ESCAPE 39。\39。ESCAPE 39。\39。短語(yǔ)表示\為轉(zhuǎn)換字符,在表達(dá)示中\(zhòng)后面的_或%不再具有通配符的含義,轉(zhuǎn)義為普通的“_”字符。查詢情況如圖48所示。(5)多重條件(邏輯謂詞)AND表示只有在全部滿足所有條件時(shí)結(jié)果才為T(mén)RUE,OR表示只要滿足其中一個(gè)條件結(jié)果即為T(mén)RUE查詢管理系年齡在22歲以下的學(xué)生的姓名、年齡和學(xué)號(hào)SELECT SNAME,SAGE,SNO FROM STUDENT WHERE SDEPT=39。管理系39。 AND SAGE22三、排序排序的語(yǔ)法格式為:ORDER BY 列名[ASC|DESC] [,…n]動(dòng)手做:①將學(xué)生按年齡的升序排序②查詢選修課程號(hào)為0503030502的學(xué)生的學(xué)號(hào)和成績(jī),查詢結(jié)果按成績(jī)降序排序。③查詢?nèi)w學(xué)生的信息,查詢結(jié)果按院系名升序排序,同系的學(xué)生按年齡降序排序。④查詢選課的成績(jī),結(jié)果按成績(jī)降序排列⑤查詢管理學(xué)院的女生信息,結(jié)果按年齡升序排序⑥查詢課程的所有信息,結(jié)果按學(xué)時(shí)降序排序,課程名升序排序?qū)嵱?xùn)五 數(shù)據(jù)表的高級(jí)查詢【實(shí)訓(xùn)目的】(1)掌握計(jì)算函數(shù)的使用方法(2)掌握分組的含義及使用方法(3)掌握多表查詢的方式(4)理解子查詢的運(yùn)用【實(shí)訓(xùn)要求】(1)使用查詢分析器完成以下各種操作(2)按要求完成每一個(gè)實(shí)訓(xùn)項(xiàng)目(3)及時(shí)保存SQL語(yǔ)句,實(shí)訓(xùn)結(jié)束后統(tǒng)一上教源代碼【實(shí)訓(xùn)學(xué)時(shí)】2學(xué)時(shí) 實(shí)訓(xùn)教師可以根據(jù)學(xué)生實(shí)際情況進(jìn)行適當(dāng)?shù)恼{(diào)整,也可要求學(xué)生在課下完成部分實(shí)訓(xùn)任務(wù)【實(shí)訓(xùn)內(nèi)容與步驟】說(shuō)明:本實(shí)訓(xùn)使用信息管理與信息系統(tǒng)實(shí)訓(xùn)室機(jī)器中已安裝好的數(shù)據(jù)庫(kù)XKDB,數(shù)據(jù)庫(kù)中存有與實(shí)訓(xùn)二中相同的數(shù)據(jù)表。一、計(jì)算函數(shù)匯總數(shù)據(jù)動(dòng)手做:①統(tǒng)計(jì)學(xué)生總?cè)藬?shù)②統(tǒng)計(jì)選修了課程的學(xué)生的人數(shù)③計(jì)算學(xué)號(hào)為“0305030128”的學(xué)生的考試各科成績(jī)之和④計(jì)算課程“0503030505”的學(xué)生的考試平均成績(jī)⑤查詢選修了課程“0503030505”的學(xué)生的最高分和最低分思考問(wèn)題:計(jì)算函數(shù)能不能出現(xiàn)在WHERE子句中,例如查詢年齡最大學(xué)生的姓名是否可以寫(xiě)成: SELECT SNAME STUDENT WHERE SAGE=MAX(SAGE)請(qǐng)通過(guò)上機(jī)驗(yàn)證后說(shuō)明。二、分組計(jì)算GROUP BY 語(yǔ)法格式為:GROUP BY 分組依據(jù)列 [,…n] HAVING組提取條件注意:分組依據(jù)列不能是text、ntext、image和bit類型的列。①統(tǒng)計(jì)每門(mén)課程的選課人數(shù),列出課程號(hào)和人數(shù)。SELECT CNO,COUNT(SNO)FROM SC GROUP BY CNO分析:該語(yǔ)句首先查詢結(jié)果按CNO的值分組,所有CNO值相同的元組歸為一組,然后再用COUNT函數(shù)對(duì)每一組進(jìn)行計(jì)算,求得每組的學(xué)生人數(shù)。動(dòng)手做:②查詢每名學(xué)生的選課門(mén)數(shù)和所有成績(jī)的平均值③查詢選修了3門(mén)以上課程的學(xué)生的學(xué)號(hào)④查詢選取課門(mén)數(shù)等于或大于4門(mén)的學(xué)生的平均成績(jī)和選課門(mén)數(shù)SELECT SNO,AVG(GRADE),COUNT(*) FROM SCGROUP BY SNO HAVING COUNT(*)三、多表聯(lián)接查詢內(nèi)連接內(nèi)連接的格式為:FROM 表1 [INNER JOIN] 表2 ON 連接條件內(nèi)聯(lián)接條件格式為:[表名1﹒][列名]比較運(yùn)算符[表名2﹒][列名2]①查詢管理系學(xué)生的選課情況,要求列出學(xué)生的姓名、所修課的課號(hào)和成績(jī)。SELECT SNAME,CNO,GRADE FROM STUDENT JOIN SC ON = WHERE SDEPT=39。管理系39。下面的語(yǔ)句也可以實(shí)現(xiàn)上面的功能:SELECT SNAME,CNO,GRADE FROM STUDENT,SC WHERE = AND SDEPT=39。管理系39。動(dòng)手做:②查詢管理學(xué)院選修“計(jì)算機(jī)網(wǎng)絡(luò)”課程的學(xué)生的姓名,課程名和成績(jī)。③查詢所有選修“計(jì)算機(jī)網(wǎng)絡(luò)”課程的學(xué)生的情況,要求列出學(xué)生的姓名和所在系。④查詢課程的成績(jī)情況,要求列出課程的名稱和成績(jī)自聯(lián)接它是一種特殊的內(nèi)聯(lián)接,它是指相互聯(lián)接的表在物理上為同一張表,但可以在連輯上分為兩張表。使用自聯(lián)接必須為表取兩個(gè)別名,使之在邏輯上成為兩張表。①查詢與李勇在同一個(gè)系學(xué)習(xí)的學(xué)生的姓名和所在的系SELECT , FROM STUDENT S1 JOIN STUDENT S2 ON =WHERE =’李勇’ AND != ’李勇’動(dòng)手做:②查詢與你本人在一個(gè)學(xué)院學(xué)習(xí)的學(xué)生姓名、性別和年齡外連接ANSI方式的外連接的語(yǔ)法格式為:FROM 表1 LEFT|RIGHT [OUTER] JOIN 表2 ON 連接條件①查詢學(xué)生的選課情況(學(xué)號(hào),姓名,課程號(hào),成績(jī)),包括選課和沒(méi)有選課的學(xué)生。SELECT ,SNAME,CNO,GRADE FROM STUDENT LEFT OUTER JOIN SC ON =動(dòng)手做:②查詢計(jì)算機(jī)學(xué)院學(xué)生的選課情況,包括選課和沒(méi)有選課的學(xué)生。思考問(wèn)題:試比較三種聯(lián)接查詢方式不同之處及外聯(lián)接查詢中三種查詢方式的不同之處。四、子查詢使用子查詢進(jìn)行基于集合的測(cè)試①查詢與吳賓在同一個(gè)系的學(xué)生SELECT SNO,SNAME,SDEPT FROM STUDNT WHERE SDEPT IN (SELECT SDEPT FROM STUDENT WHERE SNAME=39。吳賓39。)②查詢成績(jī)大于90分的學(xué)生的學(xué)號(hào)和姓名SELECT SNO,SNAME FROM STUDENT WHERE SNO IN (SELECT SNO FROM SC WHERE GRADE90)或SELECT SNO,SNAME FROM STUDENT,SC WHERE = AND GRADE90③查詢了選修了“數(shù)據(jù)庫(kù)原理及應(yīng)用”課程的學(xué)生的學(xué)號(hào)和姓名。SELECT SNO,SNAME FROM STUDENT WHERE SNO IN (SELECT SNO FROM SC WHERE CNO IN (SELECT CNO FRON COURSE WHERE CNAME=39。數(shù)據(jù)庫(kù)原理及應(yīng)用39。))或SELECT ,SNAME FROM STUDENT,SC,COURSE WHERE = AND = AND CNAME=39。數(shù)據(jù)庫(kù)原理及應(yīng)用39。④查詢年齡最大學(xué)生的姓名SELECT SNAME FROM STUDENT WHERE SAGE IN (SELECT MAX(SAGE) FROM STUDENT)思考問(wèn)題:這里的IN能不能用=來(lái)代替。使用子查詢進(jìn)行比較測(cè)試使用子查詢進(jìn)行比較測(cè)試時(shí),要求子查詢語(yǔ)句必須是返回單值的查詢語(yǔ)句。①查詢選修了課程號(hào)為“0502050502”且成績(jī)高于此課程的平均成績(jī)的學(xué)生的學(xué)號(hào)和成績(jī)。SELECT SNO,GRADE FROM SC WHERE CNO=39。050205050239。 AND GRADE(SELECT AVG(GRADE) FROM SC WHERE CNO=39。050205050239。)動(dòng)手做:②查詢學(xué)生年齡低于平均年齡的學(xué)生學(xué)號(hào)、姓名、性別和年齡。使用子查詢進(jìn)行存在性測(cè)試小知識(shí):由于帶EXISTS的子查詢只能返回真或假值,因此在子查詢中指定的列名是沒(méi)有意義的。所以在有EXISTS的子查詢中,其目標(biāo)列名序列通常都用“*”。①查詢選修了課程“0502050502”的學(xué)生姓名和系。SELECT SNAME,SDEPT FROM STDENT WHERE EXISTS (SELECT * FROM SC WHERE SNO= AND CNO=39。050205050239。)②查詢沒(méi)有選修0502050502的學(xué)生的學(xué)號(hào)、姓名和所在系。SELECT SNO,SNAME,SDEPT FROM STUDENT WHERE NOT EXISTS(SELECT * FROM SC WHERE SNO= AND CNO=39。050205050239。) 實(shí)訓(xùn)六 數(shù)據(jù)完整性約束【實(shí)訓(xùn)目的】掌握數(shù)據(jù)完整性約束的作用及實(shí)現(xiàn)方法【實(shí)訓(xùn)要求】(1)使用查詢分析器完成以下各種操作(2)自學(xué)本實(shí)訓(xùn)中涉及到的相關(guān)內(nèi)容(3)根據(jù)實(shí)訓(xùn)要求創(chuàng)建所用到的關(guān)系表【實(shí)訓(xùn)學(xué)時(shí)】2學(xué)時(shí) 實(shí)訓(xùn)教師可以根據(jù)學(xué)生實(shí)際情況進(jìn)行適當(dāng)?shù)恼{(diào)整,也可要求學(xué)生在課下完成部分實(shí)訓(xùn)任務(wù)【實(shí)訓(xùn)內(nèi)容與步驟】說(shuō)明:本實(shí)訓(xùn)使用信息管理與信息系統(tǒng)實(shí)訓(xùn)室機(jī)器中已安裝好的數(shù)據(jù)庫(kù)XKDB。第一步:打開(kāi)“查詢分析器”。建立下面的表USE XKDBGOCREATE TABLE student_p(Sno CHAR(10) NOT NULL,Sname CHAR (10) ,Ssex CHAR (2) ,Sage TINYINT ,S