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

下載本文檔

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

文檔簡介

1、本章小結(jié)SQL Server 2005中可用的索引類型有:聚集索引、非聚集索引、唯一索引、包含性列索引、索引視圖、全文索引等??梢岳肧QL Server Management Studio及CREATE INDEX語句創(chuàng)建索引可以利用SQL Server Management Studio及DROP INDEX語句刪除索引數(shù)據(jù)完整性分為實(shí)體完整性、域完整性、引用完整性和用戶定義完整性等四類。主鍵約束定義了表的主鍵,指定表的一列或幾列組合的值在表中具有唯一性,即能唯一地指定一行記錄,它能夠強(qiáng)制實(shí)體完整性。每個(gè)表中只能定義一個(gè)主鍵約束。本章小結(jié)外鍵可由一個(gè)或多個(gè)列構(gòu)成,用來實(shí)現(xiàn)表與表之間的數(shù)據(jù)聯(lián)

2、系,它們的值與另一個(gè)表中的主鍵相匹配。當(dāng)創(chuàng)建或修改表時(shí)可通過定義外鍵約束來創(chuàng)建外鍵。一個(gè)表可以同時(shí)包含多個(gè)外鍵約束。使用 UNIQUE 約束能夠確保在非主鍵列中不輸入重復(fù)的值。CHECK 約束通過限制列可接受的值,強(qiáng)制域的完整性??梢允褂肅REATE RULE創(chuàng)建規(guī)則。可以使用系統(tǒng)存儲過程sp_bindrule將規(guī)則綁定到列或用戶自定義數(shù)據(jù)類型上。本章小結(jié)使用系統(tǒng)存儲過程sp_help能夠查看規(guī)則的擁有者、創(chuàng)建時(shí)間等信息。使用系統(tǒng)存儲過程sp_unbindrule可以將綁定到列或用戶自定數(shù)據(jù)類型上的規(guī)則解除。使用DROP RULE語句來刪除當(dāng)前數(shù)據(jù)庫中的一個(gè)或多個(gè)規(guī)則。可以使用SQL Serv

3、er Management Studio在“結(jié)果”窗格中添加、修改和刪除記錄。使用Transact-SQL語句:INSERT向表中添加記錄、UPDATE修改記錄和DELETE刪除記錄。第第5章章 數(shù)據(jù)檢索數(shù)據(jù)檢索5.1 SELECT 語句語句5.2 使用使用SELECT 語句進(jìn)行簡單查詢語句進(jìn)行簡單查詢5.3 使用使用T-SQL語句進(jìn)行高級查詢語句進(jìn)行高級查詢5.4 用戶定義函數(shù)在數(shù)據(jù)檢索中的應(yīng)用用戶定義函數(shù)在數(shù)據(jù)檢索中的應(yīng)用5.5 數(shù)據(jù)查詢的優(yōu)化數(shù)據(jù)查詢的優(yōu)化5.6 分布式查詢簡介分布式查詢簡介返回目錄55.1 SELECT 語句SELECT 語句的基本語法SELECT ALL|DISTIN

4、CT column_listINTO new_table_nameFROM table_listWHERE search_conditionGROUP BY group_by_listHAVING search_conditionORDER BY order_list ASC | DESC SELECT語句中各子句的說明6qSELECT:此關(guān)鍵字用于從數(shù)據(jù)庫中檢索數(shù)據(jù)。q ALL|DISTINCT:ALL指定在結(jié)果集中可以包含重復(fù)行,ALL 是默認(rèn)設(shè)置;關(guān)鍵字DISTINCT指定SELECT 語句的檢索結(jié)果不包含重復(fù)的行。q column_list:描述進(jìn)入結(jié)果集的列,它是由逗號分隔的表達(dá)式的

5、列表。每個(gè)列表中表達(dá)式通常是對從中獲取數(shù)據(jù)的源表或視圖的列的引用,但也可能是其它表達(dá)式,例如常量或 Transact-SQL 函數(shù)。如果select_list使用 *,表明指定返回源表中的所有列。qINTO new_table_name :指定查詢到的結(jié)果集存放到一個(gè)新表中。new_table_name為指定新表的名稱。q FROM table_list:用于指定產(chǎn)生檢索結(jié)果集的源表的列表。這些源表包括:SQL Server的本地服務(wù)器中的基表、本地 SQL Server 中的視圖、鏈接表。SQL Server 將一個(gè)視圖引用內(nèi)部解析為針對組成視圖的一個(gè)或多個(gè)基表的引用,鏈接表是從SQL Se

6、rver 進(jìn)行訪問的 OLE DB 數(shù)據(jù)源中的表,這種訪問方式稱為分布式查詢。有關(guān)視圖的概念將在第九章中介紹。7q WHERE search_condition:用于指定檢索的條件,它定義了源表中的行數(shù)據(jù)進(jìn)入結(jié)果集所要滿足的條件,只有滿足條件的行才能出現(xiàn)在結(jié)果集中。qGROUP BY group_by_list:GROUP BY子句根據(jù)group_by_list 列中的值將結(jié)果集分成組。qHAVING search_condition:HAVING子句是應(yīng)用于結(jié)果集的附加篩選。從邏輯上講,HAVING子句從中間結(jié)果集對行進(jìn)行篩選,這些中間結(jié)果集是用SELECT語句中的 FROM、WHERE或G

7、ROUP BY子句創(chuàng)建的。HAVING 子句通常與 GROUP BY 子句一起使用,盡管HAVING子句前面不必有GROUP BY子句。q ORDER BY order_list ASC | DESC :ORDER BY子句定義結(jié)果集中的行排列的順序。order_list 指定依據(jù)哪些列來進(jìn)行排序。ASC和DESC關(guān)鍵字用于指定結(jié)果集是按升序還是按降序排序,DESC降序排序,ASC升序排序。ORDER BY 是一個(gè)重要的子句,要想獲得有序的查詢結(jié)果,必須使用ORDER BY子句,因?yàn)殛P(guān)系理論規(guī)定表中的數(shù)據(jù)行是沒有次序的。8n在使用在使用SELECT語句時(shí)應(yīng)注意如下幾點(diǎn)語句時(shí)應(yīng)注意如下幾點(diǎn): 必

8、須按照正確的順序指定 SELECT 語句中的子句。 對數(shù)據(jù)庫對象的每個(gè)引用必須具有唯一性。 在系統(tǒng)中,可能有多個(gè)數(shù)據(jù)庫對象帶有相同的名稱。例如,架構(gòu)1和架構(gòu)2可能都擁有一個(gè)名為Table_0的表。在引用表Table_0時(shí),為了區(qū)分引用的表,應(yīng)對引用名稱有所限定,如:架構(gòu)1. Table_0,架構(gòu)2. Table_0。 在執(zhí)行SELECT 語句時(shí),對象所駐留的數(shù)據(jù)庫不一定總是當(dāng)前數(shù)據(jù)庫。若要確??偸鞘褂谜_的對象,則不論當(dāng)前數(shù)據(jù)庫是如何設(shè)置的,均可使用數(shù)據(jù)庫和架構(gòu)來限定對象名稱,如:xsgl.dbo.student。 在 FROM 子句中所指定的表或視圖可能有相同的列名,通過對象名稱來限定列名可

9、解決列名重復(fù)的問題,如:department.department_no、teacher. department_no。95.2.1 最基本的SQL查詢語句5.2.2 改變列標(biāo)題的顯示5.2.3 計(jì)算列的使用5.2.4 TOP和DISTINCT關(guān)鍵字5.2.5 使用WHERE子句的查詢5.2.6 使用ORDER BY子句對結(jié)果進(jìn)行排序5.2 使用SELECT語句進(jìn)行簡單查詢105.2.1 最基本的最基本的SQL查詢語句查詢語句nSQL語言中最主要、最核心的部分是它的查詢功能。查詢語言用來對已經(jīng)存在于數(shù)據(jù)庫中的數(shù)據(jù)按照特定的組合、條件表達(dá)式或次序進(jìn)行檢索。 格式:SELECT *|column_

10、name,.n FROM table_namen功能:從指定表中查詢所有信息或指定列的信息?!纠?-1】從teacher表中分別檢索出教師的所有信息,及教師、教師姓名信息。USE jwglGOSELECT * FROM student SELECT teacher_id , teacher_name FROM teachern注意:q在SELECT后的列名的順序決定了顯示結(jié)果中的列序q在查找多列內(nèi)容時(shí),用,將各字段分開 本節(jié)首頁11n在缺省情況下,執(zhí)行上面的SQL語句后,查詢結(jié)果中顯示的列標(biāo)題是列名??梢栽赟ELECT語句中用列標(biāo)題=列名或列標(biāo)題AS 列名 來改變列標(biāo)題的顯示?!纠?-2】從t

11、eacher表中分別檢索出教師的教師號、教師姓名信息并分別加上“教師”、“教師號”的標(biāo)題信息。USE jwglGOSELECT 教師號=teacher_id , 教師姓名 = teacher_name FROM teacherSELECT teacher_id AS 教師號, teacher_name AS 教師姓名 FROM teacher5.2.2 改變列標(biāo)題的顯示本節(jié)首頁12n查詢數(shù)據(jù)時(shí),經(jīng)常需要對表中數(shù)據(jù)計(jì)算后才能得到滿意的結(jié)果,SQL Server在數(shù)據(jù)查詢中提供了計(jì)算的能力?!纠?-11】從表book中查詢書本價(jià)格打九折后的書本信息。USE jwglGOSELECT book_id

12、,book_name,price*0.9 FROM book示例:求年齡SELECT 學(xué)號, 姓名, 獎(jiǎng)學(xué)金, year(getdate()-year(生日) AS age FROM stu5.2.3 計(jì)算列的使用本節(jié)首頁131. TOP 關(guān)鍵字n使用TOP 關(guān)鍵字可以返回表中前n行或前一個(gè)百分?jǐn)?shù)的數(shù)據(jù)。n與Access不同,無論是否有重復(fù)值,只確切顯示前n條n【例5-5】分別從teacher表中檢索出前5個(gè)及表中前面20%的教師的信息。USE jwglGOSELECT top 5 * FROM teacher SELECT top 20 PERCENT * FROM teacher2. DI

13、STINCT關(guān)鍵字n有時(shí),一個(gè)許多列的值不是唯一的,在進(jìn)行數(shù)據(jù)檢索時(shí),可以用DISTINCT消除重復(fù)行。使用DISTINCT關(guān)鍵字的語法形式如下:5.2.4 TOP和DISTINCT關(guān)鍵字14SELECT ALL|DISTINCT select_listFROM table_nameWHERE search_conditionn其中:qALL|DISTINCT:如使用ALL則檢索出全部信息,如使用DISTINCT則剔除重復(fù)信息【例5-9】從teacher表中檢索出所有姓名不重復(fù)的教師的信息。USE jwglGOSELECT DISTINCT teacher_name FROM teacher本

14、節(jié)首頁15n大部分查詢都不是針對表中所有行的查詢,而是從整個(gè)表中選出符合條件的信息,要實(shí)現(xiàn)這樣的查詢就要用到WHERE子句。1. WHERE子句的語法形式nWHERE子句的語法形式如下:SELECT selctc_listFROM table_listWHERE select_conditionn其中SQL Server支持的搜索條件如下:q比較: =、=、=、!=q范圍:BETWEENAND(在某個(gè)范圍內(nèi)) 、NOT BETWEENAND(不在某個(gè)范圍內(nèi))q列表列表:IN(在某個(gè)列表中)、NOT IN(不在某個(gè)列表中)q字符串匹配字符串匹配:LIKE(和指定字符串匹配)、NOT LIKE(和

15、指定字符串不匹配)q空值判斷空值判斷:IS NULL(為空)、 IS NOT NULL(不為空)q組合條件組合條件:AND(與)、 OR(或)q取反取反:NOTn要注意的是,應(yīng)該避免使用否定條件,查詢優(yōu)化器不能識別否定條件。5.2.3 使用WHERE子句的查詢162. 基于比較條件的WHERE子句n使用基于比較條件的WHERE子句對表中數(shù)據(jù)進(jìn)行查詢,系統(tǒng)在執(zhí)行這種條件查詢時(shí),逐行地對表中的數(shù)據(jù)進(jìn)行比較,檢查它們是否滿足條件。n如果滿足條件,則取出該行,如果不滿足條件則不取該行。n使用WHERE子句時(shí),若該列為字符型,需要使用單引號將字符串括起來,而且應(yīng)該注意單引號內(nèi)的字符串要區(qū)分大小寫形式。n

16、【例5-3】從book表中檢索出價(jià)格小于15元的書本信息。USE jwglGOSELECT * FROM book WHERE price 1970-12-31)n在寫基于比較條件的選擇行的SELECT句子時(shí),要注意以下幾點(diǎn): 表達(dá)式可以是嵌套查詢,也可以包含常量、列名和函數(shù)。 對CHAR、VARCHAR、TEXT、DATETIME和SMALLDATETIME類型的值要用單引號引起來。186. 基于空值判斷的WHERE子句n空值通常用NULL表示,它僅僅是一個(gè)符號,既不等于0,也不等于空格,它不能像0那樣進(jìn)行算術(shù)運(yùn)算。n使用空值判斷的SELECT語句的語法形式如下:SELECT select_

17、listFROM tableWHERE column_name IS NOT NULL【例5-7】從student表中檢索出家庭地址列為空值的同學(xué)的信息。USE jwglGOSELECT * FROM student WHERE home_addr IS NULL本節(jié)首頁193. 基于BETWEEN關(guān)鍵字的WHERE子句n使用基于BETWEEN關(guān)鍵字的WHERE子句是為了對表中某一范圍內(nèi)的數(shù)據(jù)進(jìn)行查詢,BETWEEN關(guān)鍵字一般應(yīng)用于數(shù)字型數(shù)據(jù)。nBETWEEN子句的語法形式如下:SELECT select_listFROM table_nameWHERE expression NOT BETW

18、EEN expression1 AND expression2 【例5-4】從book 表中檢索價(jià)格介于15至20元之間的書本信息。USE jwglGOSELECT * FROM book where price BETWEEN 15 AND 20204. 基于IN關(guān)鍵字的WHERE子句n使用基于IN關(guān)鍵字的WHERE子句對表中數(shù)據(jù)進(jìn)行查詢,系統(tǒng)將逐行檢查表中的數(shù)據(jù)是否在/不在IN關(guān)鍵字設(shè)定的列表內(nèi)。nIN關(guān)鍵字一般應(yīng)用于字符型數(shù)據(jù)。nIN子句的語法形式如下:SELECT select_listFROM table_nameWHERE expression NOT IN (value_list

19、)【例5-5】從student_course表中檢索學(xué)號為g9940202,g9940204,g9940206的學(xué)生信息。USE jwglGOSELECT * FROM student_courseWHERE student_id IN (g9940202,g9940204,g9940206)215. 基于LIKE關(guān)鍵字的WHERE子句n使用基于LIKE關(guān)鍵字的WHERE子句對表中數(shù)據(jù)進(jìn)行查詢,系統(tǒng)將逐行對表中的數(shù)據(jù)進(jìn)行字符串的模糊匹配。nLIKE 子句的語法形式如下: SELECT select_listFROM table_nameWHERE expression NOT LIKE str

20、ingn在SQL Server中,共提供了4個(gè)通配符 :q:代表任意多個(gè)字符(Access為*)q: 代表一個(gè)任意字符(Access為?)q: 代表方括號內(nèi)的任意一個(gè)字符(與Access相同)q表示任意一個(gè)在方括號內(nèi)沒有的字符(Access為!)統(tǒng)配符描述示例%包括0個(gè)或任意多個(gè)字符_(下劃線)任何單個(gè)字符 指定范圍a-f或集合abc123def中的任何單個(gè)字符 :表示任意一個(gè)在方括號內(nèi)沒有的字符22【例5-6】從student表中分別檢索出姓張的所有同學(xué)的資料; 姓名為兩個(gè)字符的紀(jì)錄 名字的第二個(gè)字是“紅”或“虹”的所有同學(xué)的資料; 名字的第二個(gè)字不是“紅”或“虹”的同學(xué)的資料;李紅大 (s

21、tudent表中 有兩個(gè)學(xué)生“李紅”同名同姓,分別以李紅大、 李紅小加以區(qū)分)同學(xué)的信息。SELECT * FROM student WHERE student_name LIKE 張%SELECT * FROM student WHERE student_name LIKE _紅虹%SELECT * FROM student WHERE student_name LIKE _紅虹%n注意:1.含通配符的字符串須用單引號引起來。2.使用使用 ESCAPE 子句的模式匹配子句的模式匹配qESCAPE用于聲明轉(zhuǎn)義字符,在like 后的字符串中,轉(zhuǎn)義字符后的任何字符均作為普通字符處理SELECT *

22、 FROM student WHERE student_name LIKE 李紅b小b escape bn放在 中百分號 (%)、下劃線 (_) 和左括號 () 等通配符也作常規(guī)字符處理,如:qWHERE comment LIKE %30%qselect * from stu where 地址 like %_%如果使用的匹配字符中含有通配符,可以使用轉(zhuǎn)義字符。在上例的最后一個(gè)查詢語句中,在ESCAPE子句中,定義“b”為轉(zhuǎn)義字符,這樣,LIKE子句中緊跟字符“b”后面的字符被定義為匹配字符而不再是通配符。24n前面介紹的數(shù)據(jù)檢索所查詢出來的數(shù)據(jù)都沒有經(jīng)過排序,這不利于對數(shù)據(jù)結(jié)果的查看。通過OR

23、DER BY子句,可以改變查詢結(jié)果的顯示順序。nORDER BY 子句的語法形式如下:SELECT column_listFROM table_nameORDER BY column_name|expression ASC|DESC,column_name|expression ASC|DESC.n在使用ORDER BY時(shí),請注意以下幾點(diǎn): 如果沒有指定是升序,還是降序,則缺省為升序。 可以對多達(dá)16個(gè)列執(zhí)行ORDER BY語句。 ORDER BY結(jié)果依賴于安裝時(shí)確定的排序規(guī)則?!纠?-10】從book表中按價(jià)格順序檢索出所有書本的信息。USE jwglGOSELECT * FROM book

24、 ORDER BY price5.2.5 使用使用ORDER BY子句對結(jié)果進(jìn)行排序子句對結(jié)果進(jìn)行排序255.3 T-SQL語句高級查詢5.3.1 多表查詢5.3.2 使用UNION子句5.3.3 使用GROUP BY子句5.3.4 使用COMPUTE和COMPUTE BY子句5.3.5 嵌套查詢5.3.6 在查詢的基礎(chǔ)上創(chuàng)建新表26n5.3.1 多表查詢n 用于用于WHERE子句的子句的SQL Server 連接的語法形式連接的語法形式nSQL Server 連接語法形式:SELECT column_listFROM table_listWHERE table_name.column_nam

25、e JOIN_OPERATOR table_name.columnn and search_conditionnSQL Server的語法形式中:q FROM子句:列出連接時(shí)使用到的全部表名。q JOIN_OPERATOR連接操作符為:=、 =、 =、。q search_condition:表中行數(shù)據(jù)進(jìn)入結(jié)果集所應(yīng)滿足的條件。272. 進(jìn)行連接查詢的要點(diǎn):一般而言,基于主鍵和外鍵指定查詢條件,連接條件可使用“主鍵=外鍵”。 如果一個(gè)表有復(fù)合關(guān)鍵字,在連接表時(shí),必須引用整個(gè)關(guān)鍵字。 應(yīng)盡可能限制連接語句中表的數(shù)目,連接的表越多,查詢處理的時(shí)間越長。 對于連接表的兩個(gè)列應(yīng)有相同或類似的數(shù)據(jù)類型。

26、不要使用空值作為連接條件,因?yàn)榭罩涤?jì)算不會和其它任何值相等。28【例5-13】從student及student_course兩個(gè)表中檢索學(xué)生的學(xué)號、姓名、學(xué)習(xí)課程號及課程成績。USE jwglGOselect student.student_id , student.student_name , student_course.course_id , student_course.grade from student , student_courseWHERE student.student_id = student_course.student_id29【例5-14】從student、cour

27、se及student_course三個(gè)表中檢索學(xué)生的學(xué)號、姓名、學(xué)習(xí)課程號、學(xué)習(xí)課程名及課程成績。USE jwglGOSELECT student.student_id , student.student_name , student_course.course_id ,course.course_name , student_course.grade from student , student_course , courseWHERE student.student_id = student_course.student_idAND course.course_id = student_c

28、ourse.course_id303. 使用別名方法一: use jwgl select s.student_id , s.student_name , s_c.course_id , s_c.grade from student s , student_course s_cWHERE s.student_id = s_c.student_id方法二:select s.student_id , s.student_name , s_c.course_id , s_c.grade from student AS s , student_course AS s_cWHERE s.student_i

29、d = s_c.student_id 本節(jié)首頁315.3.1 多表查詢1. 連接查詢的連接查詢的ANSI連接語法形式和連接語法形式和SQL Server語法形式語法形式 用于用于FROM子句的子句的ANSI連接語法形式連接語法形式SELECT column_listFROM table_name join_type JOIN table_name ON connection_conditionWHERE search_conditionANSI的語法形式中: FROM子句:通過JOIN子句給出連接時(shí)使用到的表名。 join_type:連接的類型:inner,left outer, right

30、outer,full outer connection_condition:表與表之間的連接條件。 search_condition:表中行數(shù)據(jù)進(jìn)入結(jié)果集所應(yīng)滿足的條件。n在ANSI標(biāo)準(zhǔn)中,連接的類型有如下三種:q內(nèi)連接(INNER JOIN):內(nèi)連接返回的結(jié)果集中只包括滿足連接條件的行。q交叉連接(CROSS JOIN):交叉連接包括兩個(gè)表中所有行的笛卡兒積。如一個(gè)表有10條記錄,另如一個(gè)表有20條記錄,交叉連接后將會產(chǎn)生200條記錄。q外連接(OUTER JOIN):外連接除了包括滿足連接條件的行外,還包括其中某個(gè)表的全部行。nSQL Server 2005中默認(rèn)的連接方式是內(nèi)連接。外部連

31、接(outer join)n1.左外部連接(left outer join)不論第二個(gè)表中是否有匹配的紀(jì)錄,結(jié)果中都包含第一個(gè)表中所有的行n2.右外部連接(right outer join)n不論第一個(gè)表中是否有匹配的紀(jì)錄,結(jié)果中都包含第二個(gè)表中所有的行n3.完全外部連接(full outer join)n不論兩個(gè)表中是否有匹配的紀(jì)錄,結(jié)果中都包含兩個(gè)表中所有的行例: 查詢所有學(xué)生選課的信息,要求對已選課的學(xué)生列出每個(gè)學(xué)生的基本情況及選課 情況,對未選課的學(xué)生只列出基本情況,其選課信息為空值.nselect student.*, student_course.*nfrom student le

32、ft outer join student_course on student.student_id=student_course.student_id345.3.2 使用UNION子句nUNION子句的作用是把兩個(gè)或多個(gè)SELECT語句查詢的結(jié)果組合成一個(gè)結(jié)果集。UNION子句的語法形式如下: Select_statement UNION ALL Select_statement nn使用UNION時(shí),請注意以下4點(diǎn): UNION中從源表選擇的所有列表必須具有相同列數(shù)、相似數(shù)據(jù)類型和相同的列序。 列名來自第一個(gè)SELECT語句。 如果希望整個(gè)結(jié)果集以特定的順序出現(xiàn),則UNION中應(yīng)使用ORD

33、ER BY子句來指定對結(jié)果集的排序順序,使用第一個(gè)SELECT語句中的列名。 在合并結(jié)果時(shí),將從結(jié)果集中刪除重復(fù)行。若使用ALL,結(jié)果集中包含所有的行。35【例5-15】用UNION子句將student表中學(xué)生的學(xué)號、姓名及teacher表中教師號、教師姓名組合在一個(gè)結(jié)果集中。USE jwglGOSELECT student_id , student_name FROM studentUNIONSELECT teacher_id , teacher_name FROM teacher【例】 student表中女學(xué)生的姓名及teacher表中女教師姓名組合在一個(gè)結(jié)果集中select studen

34、t_name from jwgl.student where sex=0union allselect teacher_name from jwgl.teacher where sex=0本節(jié)首頁365.3.3 使用GROUP BY子句n使用GROUP BY子句進(jìn)行數(shù)據(jù)檢索可得到數(shù)據(jù)分類的匯總統(tǒng)計(jì)、平均值或其它統(tǒng)計(jì)信息。1. GROUP BY子句的語法形式nGROUP BY子句的語法形式如下:SELECT column_name_listFROM table_nameWHERE search_conditionGROUP BY ALL aggregate_expressionnHAVING s

35、earch_condition37n其中:q aggregate_expression:分組表達(dá)式q search_condition:對分組匯總后數(shù)據(jù)進(jìn)入結(jié)果集的篩選條件n在使用GROUP BY 子句時(shí),注意以下幾點(diǎn): SQL Server為每個(gè)定義的組產(chǎn)生一個(gè)列值,每個(gè)組只返回一行,不返回詳細(xì)信息。 如果包括WHERE子句,SQL Server只分組匯總滿足WHERE條件的行,如基于grade的表求每個(gè)學(xué)生55分以上的科目數(shù)。 在包含GROUP BY子句的查詢語句中,SELECT子句后的所有字段列表,除集合函數(shù)外,都應(yīng)包含在GROUP BY子句中,否則將出錯(cuò)。 GROUP BY子句的列表中

36、最多只能有5060個(gè)字節(jié)。 不要在含有空值的列上使用GROUP BY子句,因?yàn)榭罩祵⒆鳛橐粋€(gè)組來處理。 如果GROUP BY子句使用ALL關(guān)鍵字,WHERE子句將不起作用。 HAVING子句排除不滿足條件的組。nselect * from student_coursen group by course_idn不執(zhí)行不執(zhí)行:select course_id from student_course group by course_id聚合函數(shù)聚合函數(shù)對一組值執(zhí)行計(jì)算并返回單一的值。除 COUNT 函數(shù)之外,聚合函數(shù)忽略空值。聚合函數(shù)經(jīng)常與SELECT語句的GROUP BY子句一同使用,常用的聚合函

37、數(shù)如表所示。函函 數(shù)數(shù)功功 能能 描描 述述SUM (Distinct|All)返回表達(dá)式中所有值的和,或只返回 DISTINCT 值。SUM 只能用于數(shù)字列,空值將被忽略。AVG(Distinct|All)計(jì)算一列數(shù)據(jù)的平均值。COUNT (Distinct|All)COUNT(Distinct|All *)統(tǒng)計(jì)一列中值的個(gè)數(shù)。統(tǒng)計(jì)元組個(gè)數(shù)MAX (Distinct|All)返回表達(dá)式的最大值。MIN (Distinct|All)返回表達(dá)式的最小值。例:查詢學(xué)生總?cè)藬?shù):Select count(*) from student402. 不帶HAVING的GROUP BY 子句的用法nGROUP

38、 BY子句是按列或表達(dá)式分組匯總,為每組產(chǎn)生一個(gè)值,一般和集合函數(shù)一起使用?!纠?-16】檢索出student_course表中每個(gè)學(xué)生的總成績。USE jwglGOSELECT 學(xué)號 = student_id , 總成績 = sum(grade) FROM student_course GROUP BY student_id413. 帶HAVING的GROUP BY 子句的用法n可以用HAVING子句對分組匯總后進(jìn)入結(jié)果集的各組進(jìn)行限制。 HAVING子句是針對GROUP BY子句的,沒有GROUP BY子句時(shí)使用HAVING子句是沒有意義的?!纠?-17】用GROUP BY句匯總出stud

39、ent_course表中總分大于450分的學(xué)生的學(xué)號及總成績SELECT 學(xué)號 = student_id , 總成績 = sum(grade) FROM student_course GROUP BY student_id having sum(grade) 450統(tǒng)計(jì)每個(gè)學(xué)生選修課程考試分?jǐn)?shù)高于50分的課程的門數(shù)本節(jié)首頁425.3.4 使用使用COMPUTE和和COMPUTE BY子句子句nCOMPUTE子句用于分類匯總n使用COMPUTE和COMPUTE BY就既能瀏覽數(shù)據(jù)又看到統(tǒng)計(jì)的結(jié)果,所生成的匯總值在查詢結(jié)果中顯示為分離的結(jié)果集.nCOMPUTE BY子句的語法形式如下:COMPUT

40、E row_aggregate (column_name ) ,nBY column_name_list即: COMPUTE 聚合函數(shù) (列名 ) ,n BY 列名,n【例】用COMPUTE子句匯總出student_course表中總學(xué)分并顯示每個(gè)學(xué)生的學(xué)號及課程學(xué)分,。SELECT student_id, credit FROM student_course COMPUTE SUM(credit) 43nCOMPUTE類似于總計(jì),如在COMPUTE后加上BY關(guān)鍵字,則查詢的結(jié)果為帶具體內(nèi)容的分類統(tǒng)計(jì)。n使用COMPUTE 聚合函數(shù) BY(字段)子句前必須使用order by (字段) 排序【

41、例】用COMPUTE BY子句出student_course表中每個(gè)學(xué)生的學(xué)號及總學(xué)分SELECT student_id, credit FROM student_course order by student_idCOMPUTE SUM(credit) by student_idn值得注意的是,在使用COMPUTE和COMPUTE BY時(shí),有如下限制: DISTINCT不能包含text、ntext、image數(shù)據(jù)類型。SELECT INTO不與COMPUTE子句一起使用。若使用了COMPUTE BY,則必須使用ORDER BY。COMPUTE BY后出現(xiàn)的列必須與ORDER BY后出現(xiàn)的列相

42、同,或者是它的子集。它必須具有相同的從左到右順序并且以相同的表達(dá)式開頭,不能跳過任何表達(dá)式。q正確:SELECT 姓名, 獎(jiǎng)學(xué)金 FROM stu order by 民族,性別COMPUTE SUM(獎(jiǎng)學(xué)金) by 民族錯(cuò)誤:SELECT 姓名, 獎(jiǎng)學(xué)金 FROM stu order by 性別,民族COMPUTE SUM(獎(jiǎng)學(xué)金) by 民族44n查詢每一門課的間接先修課(既先修課的先修課)Select o,Second.cpnoFrom course first,course secondWhere first.cpno=o465.3.5 嵌套查詢n亦稱子查詢,指一個(gè)SELECTFROMW

43、HERE查詢塊可以嵌入在另一個(gè)查詢塊中;嵌套查詢是用一條SELECT語句作為另一條SELECT語句的一部分。外層的SELECT語句叫外部查詢,內(nèi)層的SELECT語句叫內(nèi)部查詢(或子查詢)。 n即先通過一個(gè)查詢查出一個(gè)結(jié)果集,再在這個(gè)結(jié)果集中進(jìn)行查詢的話就是嵌套查詢。n嵌套查詢的執(zhí)行流程是,首先執(zhí)行內(nèi)部查詢,它查詢出來的數(shù)據(jù)并不被顯示出來,而是傳遞給外層SELECT語句,作為該SELECT語句的查詢條件使用。子查詢可以多層嵌套。n【例】在課程表中查詢課程成績大于總平均分的學(xué)生的學(xué)號、課程號及成績 n錯(cuò)誤:Select * from student_course where grade=avg(g

44、rade)nSelect * from student_course where grade=(select avg(grade) from student_course )1. 使用IN或NOT IN關(guān)鍵字【例】在課程表中查詢既選修了dep04_s001課程又選dep04_b001課程的學(xué)生Select student_id,course_id from student_course Where course_id=dep04_s001 and course_id=dep04_b001Select student_id from student_course Where student_id

45、 in(Select student_id from student_course Where course_id=dep04_s001) and course_id=dep04_b001n單值子查詢是指子查詢只返回一行數(shù)據(jù)。多值子查詢是指子查詢返回的不是一行而是一組行數(shù)據(jù)。前者可以用“=”、IN 或NOT IN和其外部查詢相聯(lián)系,后者則必須使用IN 或NOT IN和其外部查詢相聯(lián)系。IN表示屬于的關(guān)系,即是否在所選數(shù)據(jù)集合之中。NOT IN則表示不屬于集合或不是集合的成員。4748 2. 使用EXSISTS 或NOT EXSISTS關(guān)鍵字nEXISTS關(guān)鍵字用來確定數(shù)據(jù)是否在查詢列表中存在。

46、EXISTS表示一個(gè)子查詢至少返回一行時(shí)條件成立?!纠?使用EXSISTS關(guān)鍵字查詢出”g99403”班學(xué)生的學(xué)號、課程號及相應(yīng)的成績。select * from student_course where exists(select * from studentwhere student.class_id=g99403 and student_course.student_id=student.student_id)n和使用IN關(guān)鍵字不同的是,IN連接的是表中的列,而EXISTS連接的是表和表,通常不需要特別指出列名,可以直接使用 *。由于EXISTS連接的是表,所以,子查詢中必須加入表與表

47、之間的連接條件。493. 使用嵌套子查詢的幾點(diǎn)說明: 首先對子查詢(內(nèi)部查詢)求值。 外部查詢依賴于子查詢的求值結(jié)果。 子查詢必須被括在圓括號內(nèi)。 以比較操作符引導(dǎo)的子查詢的選擇列表只能包括一個(gè)表達(dá)式或列名,否則SQL Server會報(bào)錯(cuò)。特點(diǎn):查詢涉及多個(gè)關(guān)系時(shí)用嵌套查詢逐次求解,層次分明,容易理解也易書寫,具有結(jié)構(gòu)化程序設(shè)計(jì)的優(yōu)點(diǎn)。臨時(shí)表n臨時(shí)表與永久表相似,但臨時(shí)表存儲在 tempdb 中,當(dāng)不再使用時(shí)會自動(dòng)刪除。n在tempdb中可查看臨時(shí)表create table #a(id char(3),name char(5)insert into #a values(a,white)select * from #a或:SELECT * into #abc FROM stuselect * from #abcntempdb庫的臨時(shí)表文件夾中可見本地和全局臨時(shí)表臨時(shí)表分類n有本地和全局兩種類型的臨時(shí)表,二者在名稱、可見性和可用性上均不相同。q本地類型的臨時(shí)表n本地臨時(shí)表的名稱以單個(gè)數(shù)字符號

溫馨提示

  • 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

提交評論