SQL第08章數(shù)據(jù)檢索.ppt_第1頁
SQL第08章數(shù)據(jù)檢索.ppt_第2頁
SQL第08章數(shù)據(jù)檢索.ppt_第3頁
SQL第08章數(shù)據(jù)檢索.ppt_第4頁
SQL第08章數(shù)據(jù)檢索.ppt_第5頁
已閱讀5頁,還剩41頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第8章數(shù)據(jù)檢索,8.1SELECT語句8.2使用SELECT語句進(jìn)行簡單查詢8.3使用T-SQL語句進(jìn)行高級查詢8.4使用企業(yè)管理器進(jìn)行查詢8.5綜合練習(xí),返回目錄,2,8.1SELECT語句,8.1.1SELECT語句的基本語法SELECTALL|DISTINCTcolumn_listINTOnew_table_nameFROMtable_listWHEREsearch_conditionGROUPBYgroup_by_listHAVINGsearch_conditionORDERBYorder_listASC|DESC8.1.2SELECT語句中各子句的說明SELECT:此關(guān)鍵字用于從數(shù)據(jù)庫中檢索數(shù)據(jù)。ALL|DISTINCT:ALL指定在結(jié)果集中可以包含重復(fù)行,ALL是默認(rèn)設(shè)置;關(guān)鍵字DISTINCT指定SELECT語句的檢索結(jié)果不包含重復(fù)的行。,3,column_list:描述進(jìn)入結(jié)果集的列,它是由逗號分隔的表達(dá)式的列表。每個(gè)列表中表達(dá)式通常是對從中獲取數(shù)據(jù)的源表或視圖的列的引用,但也可能是其它表達(dá)式,例如常量或Transact-SQL函數(shù)。如果select_list使用*,表明指定返回源表中的所有列。INTOnew_table_name:指定查詢到的結(jié)果集存放到一個(gè)新表中。new_table_name為指定新表的名稱。FROMtable_list:用于指定產(chǎn)生檢索結(jié)果集的源表的列表。這些源表包括:SQLServer的本地服務(wù)器中的基表、本地SQLServer中的視圖、鏈接表。SQLServer將一個(gè)視圖引用內(nèi)部解析為針對組成視圖的一個(gè)或多個(gè)基表的引用,鏈接表是從SQLServer進(jìn)行訪問的OLEDB數(shù)據(jù)源中的表,這種訪問方式稱為分布式查詢。有關(guān)視圖的概念將在第九章中介紹。,4,WHEREsearch_condition:用于指定檢索的條件,它定義了源表中的行數(shù)據(jù)進(jìn)入結(jié)果集所要滿足的條件,只有滿足條件的行才能出現(xiàn)在結(jié)果集中。GROUPBYgroup_by_list:GROUPBY子句根據(jù)group_by_list列中的值將結(jié)果集分成組。HAVINGsearch_condition:HAVING子句是應(yīng)用于結(jié)果集的附加篩選。從邏輯上講,HAVING子句從中間結(jié)果集對行進(jìn)行篩選,這些中間結(jié)果集是用SELECT語句中的FROM、WHERE或GROUPBY子句創(chuàng)建的。HAVING子句通常與GROUPBY子句一起使用,盡管HAVING子句前面不必有GROUPBY子句。ORDERBYorder_listASC|DESC:ORDERBY子句定義結(jié)果集中的行排列的順序。order_list指定依據(jù)哪些列來進(jìn)行排序。ASC和DESC關(guān)鍵字用于指定結(jié)果集是按升序還是按降序排序,DESC降序排序,ASC升序排序。ORDERBY是一個(gè)重要的子句,要想獲得有序的查詢結(jié)果,必須使用ORDERBY子句,因?yàn)殛P(guān)系理論規(guī)定表中的數(shù)據(jù)行是沒有次序的。,5,在使用SELECT語句時(shí)應(yīng)注意如下幾點(diǎn):必須按照正確的順序指定SELECT語句中的子句。對數(shù)據(jù)庫對象的每個(gè)引用必須具有唯一性。在系統(tǒng)中,可能有多個(gè)數(shù)據(jù)庫對象帶有相同的名稱。例如,User1和User2可能都創(chuàng)建了一個(gè)名為Table_0的表。在引用表Table_0時(shí),為了區(qū)分引用的是User1的Table_0表,還是引用的是User2的Table_0,就必須對引用名稱有所限定,如:User1.Table_0,User2.Table_0。在執(zhí)行SELECT語句時(shí),對象所駐留的數(shù)據(jù)庫不一定總是當(dāng)前數(shù)據(jù)庫。若要確??偸鞘褂谜_的對象,則不論當(dāng)前數(shù)據(jù)庫是如何設(shè)置的,均應(yīng)使用數(shù)據(jù)庫和所有者來限定對象名稱,如:JWGL.dbo.student。在FROM子句中所指定的表或視圖可能有相同的列名,外鍵很可能和相關(guān)主鍵同名。加上對象名稱來限定列名可解決重復(fù)列名稱的問題,如:department.department_no、teacher.department_no。,本章首頁,6,8.2.1最基本的SQL查詢語句8.2.2改變列標(biāo)題的顯示8.2.3使用WHERE子句的查詢8.2.4TOP和DISTINCT關(guān)鍵字8.2.5使用ORDERBY子句對結(jié)果進(jìn)行排序8.2.6計(jì)算列的使用8.2.7基于多個(gè)檢索條件的查詢,8.2使用SELECT語句進(jìn)行簡單查詢,本章首頁,7,8.2.1最基本的SQL查詢語句,SQL語言中最主要、最核心的部分是它的查詢功能。查詢語言用來對已經(jīng)存在于數(shù)據(jù)庫中的數(shù)據(jù)按照特定的組合、條件表達(dá)式或次序進(jìn)行檢索。8.2.1最基本的SQL查詢語句格式:SELECT*|column_name,.nFROMtable_name功能:從指定表中查詢所有信息或指定列的信息。【例8-1】從student表中分別檢索出學(xué)生的所有信息及學(xué)號、姓名信息。USEjwglGOSELECT*FROMstudentSELECTstudent_id,student_nameFROMstudent注意:在SELECT后的列名的順序決定了顯示結(jié)果中的列序在查找多列內(nèi)容時(shí),用,將各字段分開,本節(jié)首頁,8,在缺省情況下,執(zhí)行上面的SQL語句后,查詢結(jié)果中顯示的列標(biāo)題是列名??梢栽赟ELECT語句中用列標(biāo)題=列名或列標(biāo)題AS列名來改變列標(biāo)題的顯示。【例8-2】從student表中分別檢索出學(xué)生的學(xué)號、姓名信息并分別加上“學(xué)生”、“學(xué)號”的標(biāo)題信息。USEjwglGOSELECT學(xué)號=student_id,姓名=student_nameFROMstudentSELECTstudent_idAS學(xué)號,student_nameAS姓名FROMstudent,8.2.2改變列標(biāo)題的顯示,本節(jié)首頁,9,大部分查詢都不是針對表中所有行的查詢,而是從整個(gè)表中選出符合條件的信息,要實(shí)現(xiàn)這樣的查詢就要用到WHERE子句。1.WHERE子句的語法形式WHERE子句的語法形式如下:SELECTselctc_listFROMtable_listWHEREselect_condition其中SQLServer支持的搜索條件如下:比較:=、=、范圍:BETWEEN(在某個(gè)范圍內(nèi))、NOTBETWEEN(不在某個(gè)范圍內(nèi)),8.2.3使用WHERE子句的查詢,10,列表:IN(在某個(gè)列表中)、NOTIN(不在某個(gè)列表中)字符串匹配:LIKE(和指定字符串匹配)、NOTLIKE(和指定字符串不匹配)空值判斷:ISNULL(為空)、ISNOTNULL(不為空)組合條件:AND(與)、OR(或)取反:NOT要注意的是,應(yīng)該避免使用否定條件,查詢優(yōu)化器不能識別否定條件。2.基于比較條件的WHERE子句使用基于比較條件的WHERE子句對表中數(shù)據(jù)進(jìn)行查詢,系統(tǒng)在執(zhí)行這種條件查詢時(shí),逐行地對表中的數(shù)據(jù)進(jìn)行比較,檢查它們是否滿足條件。,11,如果滿足條件,則取出該行,如果不滿足條件則不取該行。使用WHERE子句時(shí),若該列為字符型,需要使用單引號將字符串括起來,而且應(yīng)該注意單引號內(nèi)的字符串要區(qū)分大小寫形式?!纠?-3】從student_course表中檢索成績小于60分的學(xué)生信息。USEjwglGOSELECT*FROMstudent_courseWHEREgrade=80ANDgrade、=、。search_condition:表中行數(shù)據(jù)進(jìn)入結(jié)果集所應(yīng)滿足的條件。2.進(jìn)行連接查詢的要點(diǎn):一般而言,基于主鍵和外鍵指定查詢條件,連接條件可使用“主鍵=外鍵”。如果一個(gè)表有復(fù)合關(guān)鍵字,在連接表時(shí),必須引用整個(gè)關(guān)鍵字。應(yīng)盡可能限制連接語句中表的數(shù)目,連接的表越多,查詢處理的時(shí)間越長。對于連接表的兩個(gè)列應(yīng)有相同或類似的數(shù)據(jù)類型。不要使用空值作為連接條件,因?yàn)榭罩涤?jì)算不會和其它任何值相等。,27,【例8-13】從student及student_course兩個(gè)表中檢索學(xué)生的學(xué)號、姓名、學(xué)習(xí)課程號及課程成績。USEjwglGOselectstudent.student_id,student.student_name,student_course.course_id,student_course.gradefromstudent,student_courseWHEREstudent.student_id=student_course.student_id,28,【例8-14】從student、course及student_course三個(gè)表中檢索學(xué)生的學(xué)號、姓名、學(xué)習(xí)課程號、學(xué)習(xí)課程名及課程成績。USEjwglGOSELECTstudent.student_id,student.student_name,student_course.course_id,course.course_name,student_course.gradefromstudent,student_course,courseWHEREstudent.student_id=student_course.student_idANDcourse.course_id=student_course.course_id,本節(jié)首頁,29,8.3.2使用UNION子句,UNION子句的作用是把兩個(gè)或多個(gè)SELECT語句查詢的結(jié)果組合成一個(gè)結(jié)果集。這里查詢的多個(gè)表不要求有關(guān)聯(lián)。UNION子句的語法形式如下:Select_statementUNIONALLSelect_statementn使用UNION時(shí),請注意以下4點(diǎn):UNION中從源表選擇的所有列表必須具有相同列數(shù)、相似數(shù)據(jù)類型和相同的列序。列名來自第一個(gè)SELECT語句。如果希望整個(gè)結(jié)果集以特定的順序出現(xiàn),則UNION中應(yīng)使用ORDERBY子句來指定對結(jié)果集的排序順序。在合并結(jié)果時(shí),將從結(jié)果集中刪除重復(fù)行。若使用ALL,結(jié)果集中包含所有的行。,30,【例8-15】用UNION子句將student表中學(xué)生的學(xué)號、姓名及teacher表中教師號、教師姓名組合在一個(gè)結(jié)果集中。USEjwglGOSELECTstudent_id,student_nameFROMstudentUNIONSELECTteacher_id,teacher_nameFROMteacher,本節(jié)首頁,31,8.3.3使用GROUP子句和GROUPBY子句,如果要在數(shù)據(jù)檢索時(shí)對表中數(shù)據(jù)按照一定條件進(jìn)行分組匯總或求平均值,就要在SELECT語句中與GROUPBY子句一起使用集合函數(shù)。使用GROUPBY子句進(jìn)行數(shù)據(jù)檢索可得到數(shù)據(jù)分類的匯總統(tǒng)計(jì)、平均值或其它統(tǒng)計(jì)信息。1.GROUPBY子句的語法形式GROUPBY子句的語法形式如下:SELECTcolumn_name_listFROMtable_nameWHEREsearch_conditionGROUPBYALLaggregate_expressionnHAVINGsearch_condition,32,其中:aggregate_expression:分組表達(dá)式search_condition:對分組匯總后數(shù)據(jù)進(jìn)入結(jié)果集的篩選條件在使用GROUPBY子句時(shí),注意以下幾點(diǎn):SQLServer為每個(gè)定義的組產(chǎn)生一個(gè)列值,每個(gè)組只返回一行,不返回詳細(xì)信息。如果包括WHERE子句,SQLServer只分組匯總滿足WHERE條件的行。在包含GROUPBY子句的查詢語句中,SELECT子句后的所有字段列表,除集合函數(shù)外,都應(yīng)包含在GROUPBY子句中,否則將出錯(cuò)。GROUPBY子句的列表中最多只能有8060個(gè)字節(jié)。不要在含有空值的列上使用GROUPBY子句,因?yàn)榭罩祵⒆鳛橐粋€(gè)組來處理。如果GROUPBY子句使用ALL關(guān)鍵字,WHERE子句將不起作用。HAVING子句排除不滿足條件的組。,33,2.不帶HAVING的GROUPBY子句的用法使用GROUPBY子句進(jìn)行分組查詢,SQLServer把查詢到的數(shù)據(jù)劃分成多個(gè)組,并且為每個(gè)組返回一個(gè)結(jié)果。GROUPBY子句是按列或表達(dá)式分組匯總,為每組產(chǎn)生一個(gè)值,一般和集合函數(shù)一起使用。【例8-16】用GROUPBY句匯總出student_course表中學(xué)生的學(xué)號及總成績。USEjwglGOSELECT學(xué)號=student_id,總成績=sum(grade)FROMstudent_courseGROUPBYstudent_id,34,3.帶HAVING的GROUPBY子句的用法對數(shù)據(jù)分組匯總時(shí),也可以用HAVING子句對分組匯總后進(jìn)入結(jié)果集的各組進(jìn)行限制。HAVING子句的作用同WHERE子句相似,都是給出查詢條件。所不同的是,WHERE子句是檢查每條記錄是否滿足條件,而HAVING子句是檢查分組匯總之后的各組匯總數(shù)據(jù)是否滿足條件。HAVING子句是針對GROUPBY子句的,沒有GROUPBY子句時(shí)使用HAVING子句是沒有意義的?!纠?-17】用GROUPBY句匯總出student_course表中總分大于450分的學(xué)生的學(xué)號及總成績。USEjwglGOSELECT學(xué)號=student_id,總成績=sum(grade)FROMstudent_courseGROUPBYstudent_idHAVINGsum(grade)450,本節(jié)首頁,35,8.3.4使用COMPUTE和COMPUTEBY子句,使用GROUP子句對查詢出來的數(shù)據(jù)做分類求和或求平均值,只能顯示統(tǒng)計(jì)的結(jié)果,看不到具體的數(shù)據(jù)。使用COMPUTE和COMPUTEBY就既能瀏覽數(shù)據(jù)又看到統(tǒng)計(jì)的結(jié)果。COMPUTEBY子句的語法形式如下:COMPUTErow_aggregate(column_name)nBYcolumn_name_list【例8-18】用COMPUTE子句匯總出student_course表中每個(gè)學(xué)生的學(xué)號及總成績。USEjwglGOSELECT學(xué)號=student_id,成績=gradeFROMstudent_courseORDERBYstudent_idCOMPUTESUM(grade),36,COMPUTE類似于總計(jì)。如在COMPUTE后加上BY關(guān)鍵字,則查詢的結(jié)果為帶具體內(nèi)容的分類統(tǒng)計(jì)。【例8-19】用COMPUTEBY子句按學(xué)號匯總出student_course表中每個(gè)學(xué)生的的學(xué)號及總成績。USEjwglGOSELECT學(xué)號=student_id,成績=gradeFROMstudent_courseORDERBYstudent_idCOMPUTESUM(grade)BYstudent_id,37,值得注意的是,在使用COMPUTE和COMPUTEBY時(shí),有如下限制:DISTINCT不允許同集合函數(shù)一起用,不能包含text、ntext、image數(shù)據(jù)類型。COMPUTE子句中的列必須在SELECT后面的選擇列表中。SELECTINTO不與COMPUTE子句一起使用。若使用了COMPUTEBY,則必須使用ORDERBY。COMPUTEBY后出現(xiàn)的列必須與ORDERBY后出現(xiàn)的列相同,或者是它的子集。它必須具有相同的從左到右順序并且以相同的表達(dá)式開頭,不能跳過任何表達(dá)式。,本節(jié)首頁,38,8.3.5嵌套查詢,如果先通過一個(gè)查詢查出一個(gè)結(jié)果集,再在這個(gè)結(jié)果集中進(jìn)行查詢的話就是嵌套查詢。嵌套查詢是用一條SELECT語句作為另一條SELECT語句的一部分。外層的SELECT語句叫外部查詢,內(nèi)層的SELECT語句叫內(nèi)部查詢(或子查詢)。嵌套查詢的執(zhí)行流程是,首先執(zhí)行內(nèi)部查詢,它查詢出來的數(shù)據(jù)并不被顯示出來,而是傳遞給外層SELECT語句,作為該SELECT語句的查詢條件使用。子查詢可以多層嵌套。1.使用IN或NOTIN關(guān)鍵字單值子查詢是指子查詢只返回一行數(shù)據(jù)。多值子查詢是指子查詢返回的不是一行而是一組行數(shù)據(jù)。前者可以用“=”、IN或NOTIN和其外部查詢相聯(lián)系,后者則必須使用IN或NOTIN和其外部查詢相聯(lián)系。IN表示屬于的關(guān)系,即是否在所選數(shù)據(jù)集合之中。NOTIN則表示不屬于集合或不是集合的成員。,39,【例8-20】查詢出“g99402”班所有男生的學(xué)號、課程號及相應(yīng)的成績。USEjwglGOSELECTstudent_course.student_id,student_course.course_id,student_course.gradeFROMstudent_courseWHEREstudent_idIN(SELECTstudent_idFROMstudentWHEREclass_id=g99402ANDsex=1),40,2.使用EXSISTS或NOTEXSISTS關(guān)鍵字EXISTS關(guān)鍵字用來確定數(shù)據(jù)是否在查詢列表中存在。EXISTS表示一個(gè)子查詢至少返回一行時(shí)條件成立。和使用IN關(guān)鍵字不同的是,IN連接的是表中的列,而EXISTS連接的是表和表,通常不需要特別指出列名,可以直接使用*。由于EXISTS連接的是表,所以,子查詢中必須加入表與表之間的連接條件?!纠?-21】使用EXSISTS關(guān)鍵字查詢出“g99403”班學(xué)生的學(xué)號、課程號及相應(yīng)的成績。USEjwglGOSELECTstudent_course.student_id,student_course.course_id,student_course.gradeFROMstudent_courseWHEREEXISTS(SELECT*FROMstudentWHEREstudent_course.student_id=student.student_idANDstudent.class_id=g99403),41,3.使用嵌套子查詢的幾點(diǎn)說明:首先對子查詢(內(nèi)部查詢)求值。外部查詢依賴于子查詢的求值結(jié)果。子查詢必須被括在圓括號內(nèi)。以比較操作符引導(dǎo)的子查詢的選擇列表只能包括一個(gè)表達(dá)式或列名。否則SQLServer會報(bào)錯(cuò)。,本節(jié)首頁,42,8.3.6在查詢的基礎(chǔ)上創(chuàng)建新表,SELECTINTO的作用是,在查詢的基礎(chǔ)上創(chuàng)建新表。若建臨時(shí)表,必須在表前設(shè)置#(局部臨時(shí)表)或#(全局臨時(shí)表)。新表的行和列是來自查詢結(jié)果,臨時(shí)表是創(chuàng)建在tempdb數(shù)據(jù)庫上。【例8-22】創(chuàng)建#temp_grade的臨時(shí)表,該臨時(shí)表有兩個(gè)列:student_id,grade,要求學(xué)生的成績grade大于95分。然后,再從臨時(shí)表#temp_grade查詢數(shù)據(jù)。USEjwglGOSELECTstudent_id,gradeinto#temp_gradeFROMstudent_courseWHEREgrade=95USEtempdbGOSELECT*FROM#temp_grade,43,也可以用SELECT語句創(chuàng)建一個(gè)永久表。永久表是創(chuàng)建在基表所在的數(shù)據(jù)庫里?!纠?-23】創(chuàng)建grade_table的永久表,該臨時(shí)表有兩個(gè)列:student_id,grade.要求學(xué)生的成績grade大于95分。USEjwglGOSE

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論