第8章 SELECT敘述的基本查詢 8-1 SELECT查詢指令 8-2 SELECT子句 8-3 FROM子句 8-4 WHERE子句 8-5 聚合函數的摘要查詢 8-6 群組查詢GROUP BY子句 8-7 排序ORDER BY子句
8-1 SELECT查詢指令-語法 SELECT指令是DML指令中語法最複雜的一個,其基本語法如下所示: SELECT 欄位清單 FROM 資料表來源 [WHERE 搜尋條件] [GROUP BY 欄位清單] [HAVING 搜尋條件] [ORDER BY 欄位清單]
8-1 SELECT查詢指令-子句說明 SELECT指令各子句的說明,如下表所示:
8-2 SELECT子句 8-2-1 資料表的欄位 8-2-2 欄位別名 8-2-3 計算值欄位 8-2-4 刪除重複記錄 - ALL與DISTINCT 8-2-5 前幾筆記錄 - TOP子句
8-2 SELECT子句-語法 在SELECT指令的SELECT子句是指定查詢結果包含哪些欄位,其語法如下所示: SELECT [ALL | DISTINCT] [TOP n | PERCENT] [WITH TIES]]] 欄位規格 [[AS] 欄位別名] [, 欄位規格 [[AS] 欄位別名]] 上述ALL是預設值可以顯示所有記錄的欄位值,DISTINCT只顯示不重複欄位值的記錄,TOP關鍵字可以顯示查詢結果的前幾筆記錄或多少百分比。
8-2 SELECT子句-欄位規格 欄位規格(Column Specification)就是指查詢結果的欄位清單,可以使用AS關鍵字指定欄位別名。基本上,欄位規格可以是資料表欄位或計算值的運算式,其說明如下表所示:
8-2-1 資料表的欄位- 查詢資料表的部分欄位(說明) SELECT子句可以指明查詢結果所需的欄位清單,換句話說,我們可以只查詢資料表中所需的部分欄位。
8-2-1 資料表的欄位- 查詢資料表的部分欄位(範例) SQL指令碼檔:Ch8-2-1-01.sql 查詢【學生】資料表的所有學生記錄,不過,只顯示學號、姓名和生日三個欄位,如下所示: SELECT 學號, 姓名, 生日 FROM 學生
8-2-1 資料表的欄位- 查詢資料表的所有欄位(說明) 查詢結果如果需要顯示資料表的所有欄位,SELECT指令可以直接使用「*」符號代表資料表的所有欄位,而不用一一列出欄位清單。
8-2-1 資料表的欄位- 查詢資料表的所有欄位(範例) SQL指令碼檔:Ch8-2-1-02.sql 查詢【課程】資料表的所有課程記錄並且顯示所有欄位,如下所示: SELECT * FROM 課程
8-2-2 欄位別名-說明 SELECT指令預設使用資料表定義的欄位名稱來顯示查詢結果,基於需要,我們可以使用AS關鍵字指定欄位別名,其中AS關鍵字本身可有可無。
8-2-2 欄位別名-範例 SQL指令碼檔:Ch8-2-2.sql 查詢【學生】資料表的學號、姓名和生日資料,為了方便閱讀,顯示欄位名稱為【學生學號】、【學生姓名】和【學生生日】的中文欄位別名,如下所示: SELECT 學號 AS 學生學號, 姓名 AS 學生姓名, 生日 AS 學生生日 FROM 學生
8-2-3 計算值欄位-說明 在SELECT子句的欄位規格如果是計算值欄位,我們可以使用算術運算子、字串或函數來組成運算式欄位。 因為計算值欄位並沒有欄位名稱,所以可以使用AS關鍵字來指定計算值欄位的別名。
8-2-3 計算值欄位-算術運算式(說明) 在SELECT子句的計算值欄位支援使用算術運算子(Arithmetic Operators)建立的運算式,可用的運算子如下表所示:
8-2-3 計算值欄位-算術運算式(範例) SQL指令碼檔:Ch8-2-3-01.sql 因為【員工】資料表的薪水需要扣除稅金才是實拿的薪水,我們可以使用算術運算式來查詢【員工】資料表的薪水資料,顯示每位員工的薪水淨額,如下所示: SELECT 身份證字號, 姓名, 薪水-扣稅 AS 薪水淨額 FROM 員工
8-2-3 計算值欄位-字串運算式(說明) 計算值欄位如果是字串運算式,它可以包含一至多個字串型別的欄位,和一些字串常數(Char String Constants),這是使用單引號或雙引號括起的一序列字元,如下所示: 'Abcdefg' '5678' 'SQL Server資料庫設計' 上述字串常數可以使用字串連接運算子「+」號來連接欄位值和字串常數。
8-2-3 計算值欄位-字串運算式(範例) SQL指令碼檔:Ch8-2-3-02.sql 在【員工】資料表的地址資料是由兩個欄位所組成,我們可以使用字串運算式來顯示員工的地址資料,如下所示: SELECT 身份證字號, 姓名, 城市+'巿'+街道 AS 地址 FROM 員工
8-2-3 計算值欄位-T-SQL函數(說明) 在計算值欄位的運算式可以包含T-SQL支援的數學、字串或日期/時間函數。例如:LEFT()、CONVERT()、GETDATE()、DATEDIFF()函數和聚合函數(請參閱<第8-5節:聚合函數>)等。 關於進一步T-SQL函數的說明,請參閱<附錄B:Transact-SQL的內建函數>或SQL Server線上叢書。
8-2-3 計算值欄位-T-SQL函數(範例) SQL指令碼檔:Ch8-2-3-03.sql SELECT 學號, 姓名, GETDATE() AS 今天, DATEDIFF(year, 生日, GETDATE()) AS 年齡 FROM 學生
8-2-4 刪除重複記錄 - ALL與DISTINCT (說明) 如果資料表記錄的欄位值擁有重複值,SELECT子句的預設值ALL是顯示所有欄位值,使用DISTINCT關鍵字可以刪除重複欄位值,一旦欄位擁有重複值,就只會顯示其中一筆記錄。
8-2-4 刪除重複記錄 - ALL與DISTINCT (範例) SQL指令碼檔:Ch8-2-4.sql 查詢【課程】資料表的課程資料擁有幾種不同的學分數,如下所示: SELECT DISTINCT 學分 FROM 課程
8-2-5 前幾筆記錄 –TOP子句 (TOP子句和PERCENT關鍵字-說明) 在SELECT指令可以使用TOP子句取得查詢結果的前幾筆記錄,或前多少百分比的記錄資料。 Top n可以取得資料來源的前n筆記錄,加上PERCENT關鍵字就是前百分之n的記錄,此時的n值範圍是0~100。如果使用ORDER BY子句進行排序,就可以顯示排序後的前幾筆記錄。
8-2-5 前幾筆記錄 –TOP子句 (TOP子句和PERCENT關鍵字-範例1) SQL指令碼檔:Ch8-2-5-01.sql 在【學生】資料表顯示前3筆學生記錄資料,如下所示: SELECT TOP 3 * FROM 學生
8-2-5 前幾筆記錄 -TOP子句 (TOP子句和PERCENT關鍵字-範例2) SQL指令碼檔:Ch8-2-5-02.sql 在【學生】資料表取出前25%的學生記錄資料,如下所示: SELECT TOP 25 PERCENT * FROM 學生
8-2-5 前幾筆記錄 –TOP子句 (WITH TIES與ORDER BY子句-說明)
8-2-5 前幾筆記錄 -TOP子句 (WITH TIES與ORDER BY子句-範例) SQL指令碼檔:Ch8-2-5-03.sql 在【課程】資料表取出前3筆課程記錄資料,如果有同學分的記錄也一併顯出來,如下所示: SELECT TOP 3 WITH TIES * FROM 課程 ORDER BY 學分
8-3 FROM子句-說明 SELECT指令是使用FROM子句指定查詢的來源資料表是哪些資料表,它可以是一個資料表或多個相關聯的資料表。 在本章的SQL指令碼檔都是從單一資料表取得查詢結果,第9章將說明如何從多個資料表取得查詢結果,即合併查詢和子查詢。
8-3 FROM子句-種類 FORM子句可以使用的資料表種類,如下所示: 長存資料表(Permanent Tables):使用CREATE TABLE指令建立的一般資料表。 暫存資料表(Temporary Tables):使用CREATE TABLE指令建立的暫存資料表(以「#」或「##」開頭的資料表),或由子查詢取得中間結果記錄資料的暫存資料表,這部分的說明請參閱第9章。 檢視表(Views):一種建立在長存資料表上的虛擬資料表,進一步說明請參閱第11章。
8-3 FROM子句-範例 請執行SQL指令碼檔案Ch8-3-01.sql建立名為【##課程】的暫存資料表,且插入2筆課程記錄。 查詢【##課程】暫存資料表的課程記錄資料,如下所示: SELECT * FROM ##課程
練習題 從[學生]資料表中,有(學號,姓名,城市,鄉鎮,道路號碼,電話,監護人,期中分數,期末分數)這些欄位 請搜尋所有欄位,其中跟地址有關的要以[地址]一欄出現。 搜尋前百分之20的學生,其中期中分數和期末分數各佔50%,成為[學期成績]一欄
8-4 WHERE子句 8-4-1 比較運算子 8-4-2 邏輯運算子 8-4-3 算術運算子
8-4 WHERE子句 SELECT指令和FROM字句是指出查詢哪個資料表的哪些欄位,WHERE子句的篩選條件才是真正的查詢條件,可以過濾記錄和找出符合所需條件的記錄資料,其基本語法如下所示: WHERE 搜尋條件 上述搜尋條件就是使用比較和邏輯運算子建立的過濾條件,查詢結果是取回符合條件的記錄資料。
8-4-1 比較運算子-說明 WHERE子句的搜尋條件可以是比較運算子建立的條件運算式,其運算元如果是欄位值,可以是文字、數值或日期/時間。T-SQL支援的比較運算子(Comparison Operators)說明,如下表所示:
8-4-1 比較運算子-條件值為字串 WHERE子句的條件運算式可以使用比較運算子來執行字串比較,欄位條件的字串需要使用單引號括起。 SQL指令碼檔:Ch8-4-1-01.sql 在【學生】資料表查詢學號為'S002'學生的詳細資料,如下所示: SELECT * FROM 學生 WHERE 學號='S002'
8-4-1 比較運算子-條件值為數值 WHERE子句的條件運算式如果條件值是數值,數值欄位就不需使用單引號括起。 SQL指令碼檔:Ch8-4-1-02.sql 查詢【員工】資料表的薪水欄位小於50000元的員工記錄,如下所示: SELECT * FROM 員工 WHERE 薪水<50000
8-4-1 比較運算子-條件值為日期/時間 WHERE子句的條件運算式如果是日期/時間的比較,如同字串,也需要使用單引號括起。 SQL指令碼檔:Ch8-4-1-03.sql 查詢【學生】資料表的學生生日是1978-02-02的學生記錄,如下所示: SELECT * FROM 學生 WHERE 生日='1978-02-02'
8-4-2 邏輯運算子-說明 在WHERE子句的搜尋條件可以使用邏輯運算子(Logical Operators)來連接條件運算式,以便建立更複雜的搜尋條件。常用的邏輯運算子說明,如下表所示:
8-4-2 邏輯運算子- LIKE包含子字串運算子(說明) WHERE子句的條件欄位可以使用LIKE運算子進行比較,LIKE運算子是子字串查詢,只需是子字串就符合條件。我們還可以配合萬用字元來進行範本字串的比對,如下表所示:
8-4-2 邏輯運算子- LIKE包含子字串運算子(範例1) SQL指令碼檔:Ch8-4-2-01.sql 查詢【教授】資料表中,屬於資訊相關科系CS和CIS的教授記錄,如下所示: SELECT * FROM 教授 WHERE 科系 LIKE '%S%'
8-4-2 邏輯運算子- LIKE包含子字串運算子(範例2) SQL指令碼檔:Ch8-4-2-02.sql 查詢【班級】資料表中,上課教室是在二樓的課程資料,如下所示: SELECT DISTINCT 課程編號, 上課時間, 教室 FROM 班級 WHERE 教室 LIKE '%2_-%'
8-4-2 邏輯運算子- LIKE包含子字串運算子(範例3) SQL指令碼檔:Ch8-4-2-03.sql 查詢【員工】資料表中,身份證字號是A-D範圍字母開頭的員工資料,如下所示: SELECT * FROM 員工 WHERE 身份證字號 LIKE '[A-D]%'
練習題 [課程]資料表,(ID,課程名稱,上課地點,老師), 上課地點的紀錄,以M-101, T1-301這樣方式記錄 請找出老師名有’家豪’的課程名稱
8-4-2 邏輯運算子- BETWEEN/AND範圍運算子(說明)
8-4-2 邏輯運算子- BETWEEN/AND範圍運算子(範例1) SQL指令碼檔:Ch8-4-2-04.sql 查詢【學生】資料表生日欄位範圍是1977年1月1日到1977年12月31日出生的學生,如下所示: SELECT * FROM 學生 WHERE 生日 BETWEEN '1977-1-1' AND '1977-12-31'
8-4-2 邏輯運算子- BETWEEN/AND範圍運算子(範例2) SQL指令碼檔:Ch8-4-2-05.sql 因為學生修課學分數還差了2~3個學分,我們可以查詢【課程】資料表看看還有哪些課可以選修,如下所示: SELECT * FROM 課程 WHERE 學分 BETWEEN 2 AND 3
8-4-2 邏輯運算子-IN運算子(說明) IN運算子只需是清單其中之一即可,我們需要列出一串文字或數值清單作為條件,欄位值只需是其中之一,就符合條件。
8-4-2 邏輯運算子-IN運算子(範例1) SQL指令碼檔:Ch8-4-2-06.sql 學生已經準備修CS101、CS222、CS100和CS213四門課,我們準備查詢【課程】資料表關於這些課程的詳細資料,如下所示: SELECT * FROM 課程 WHERE 課程編號 IN ('CS101', 'CS222', 'CS100', 'CS213')
8-4-2 邏輯運算子-IN運算子(範例2) SQL指令碼檔:Ch8-4-2-07.sql SELECT * FROM 課程 WHERE 學分 IN (2, 4)
8-4-2 邏輯運算子-NOT運算子(說明) NOT運算子可以搭配邏輯運算子,取得與條件相反的查詢結果,如下表所示:
8-4-2 邏輯運算子-NOT運算子(範例) SQL指令碼檔:Ch8-4-2-08.sql SELECT * FROM 課程 學生已經修了CS101、CS222、CS100和CS213四門課,準備進一步查詢【課程】資料表,看看還有什麼課程可以修,如下所示: SELECT * FROM 課程 WHERE 課程編號 NOT IN ('CS101', 'CS222', 'CS100', 'CS213')
8-4-2 邏輯運算子- AND與OR運算子(說明) AND運算子連接的前後運算式都必須同時為真,整個WHERE子句的條件才為真。 OR運算子在WHERE子句連接的前後條件,只需任何一個條件為真,即為真。
8-4-2 邏輯運算子- AND與OR運算子(範例1) SQL指令碼檔:Ch8-4-2-09.sql 查詢【課程】資料表的課程編號欄位包含'1'子字串,而且課程名稱欄位有'程式'子字串,如下所示: SELECT * FROM 課程 WHERE 課程編號 LIKE '%1%' AND 名稱 LIKE '%程式%'
8-4-2 邏輯運算子- AND與OR運算子(範例2) SQL指令碼檔:Ch8-4-2-10.sql 查詢【課程】資料表的課程編號欄位包含'1'子字串,或課程名稱欄位有'程式'子字串,如下所示: SELECT * FROM 課程 WHERE 課程編號 LIKE '%1%' OR 名稱 LIKE '%程式%'
8-4-2 邏輯運算子- 連接多個條件與括號(說明) 在WHERE子句的條件可以使用AND和OR來連接多個不同條件。 其優先順序是位在括號中運算式優先,換句話說,我們可以使用括號來產生不同的查詢結果。
8-4-2 邏輯運算子- 連接多個條件與括號(範例1) SQL指令碼檔:Ch8-4-2-11.sql 查詢【課程】資料表的課程編號欄位包含'2'子字串,和課程名稱欄位有'程式'子字串,或學分大於等於4,如下所示: SELECT * FROM 課程 WHERE 課程編號 LIKE '%2%' AND 名稱 LIKE '%程式%' OR 學分>=4
8-4-2 邏輯運算子- 連接多個條件與括號(範例2) SQL指令碼檔:Ch8-4-2-12.sql 查詢【課程】資料表的課程編號欄位包含'2'子字串,和課程名稱欄位有'程式'子字串,或學分大於等於4,後2個條件使用括號括起,如下所示: SELECT * FROM 課程 WHERE 課程編號 LIKE '%2%' AND (名稱 LIKE '%程式%' OR 學分>=4)
8-4-3 算術運算子-說明 在WHERE子句的運算式條件也支援算術運算子(Arithmetic Operators)的加、減、乘、除和餘數,我們可以在WHERE子句的條件加上算術運算子。
8-4-3 算術運算子-範例 SQL指令碼檔:Ch8-4-3.sql 查詢【員工】資料表的薪水在扣稅和保險金額後的淨額小於40000元的員工記錄,如下所示: SELECT 身份證字號, 姓名, 電話 FROM 員工 WHERE (薪水-扣稅-保險) < 40000
練習題 [學生]資料表中,有(學號,姓名,城市,鄉鎮,道路號碼,電話,監護人,期中分數,期末分數)這些欄位 請找出名字有’家豪’的學生,而且居住在台中市,台北市的人 請找出期中分數或者期末分數不及格,而且名字沒有‘家’的人
8-5 聚合函數的摘要查詢 8-5-1 COUNT()函數 8-5-2 AVG()函數 8-5-3 MAX()函數 8-5-4 MIN()函數 8-5-5 SUM()函數
8-5 聚合函數的摘要查詢-說明 「聚合函數」(Aggregate Functions)也稱為「欄位函數」(Column Functions),可以進行選取記錄欄位值的筆數、平均、範圍和統計函數,以便提供進一步欄位資料的分析結果。 一般來說,如果SELECT指令敘述擁有聚合函數,稱為「摘要查詢」(Summary Query)。
8-5 聚合函數的摘要查詢-常用的聚合函數 常用的聚合函數說明,如下表所示:
8-5-1 COUNT()函數-範例1 SQL指令可以配合COUNT()函數計算查詢的記錄數,「*」參數可以統計資料表的所有記錄數,或指定欄位來計算欄位不是空值的記錄數。 SQL指令碼檔:Ch8-5-1-01.sql 查詢【學生】資料表的學生總數,如下所示: SELECT COUNT(*) AS 學生數 FROM 學生
8-5-1 COUNT()函數-範例2 SQL指令碼檔:Ch8-5-1-02.sql 在【學生】資料表查詢有填入生日資料的學生總數,即生日欄位不是空值NULL的記錄數,如下所示: SELECT COUNT(生日) AS 學生數 FROM 學生
8-5-1 COUNT()函數-範例3 SQL指令碼檔:Ch8-5-1-03.sql 查詢【員工】資料表的員工薪水高過40000元的員工總數,如下所示: SELECT COUNT(*) AS 員工數 FROM 員工 WHERE 薪水 > 40000
8-5-2 AVG()函數-範例1 SQL指令只需配合AVG()函數,就可以計算指定欄位的平均值。 SQL指令碼檔:Ch8-5-2-01.sql 在【員工】資料表查詢員工薪水的平均值,如下所示: SELECT AVG(薪水) AS 平均薪水 FROM 員工
8-5-2 AVG()函數-範例2 SQL指令碼檔:Ch8-5-2-02.sql 在【課程】資料表查詢課程編號包含'1'子字串的課程總數,和學分的平均值,如下所示: SELECT COUNT(*) AS 課程總數, AVG(學分) AS 學分平均值 FROM 課程 WHERE 課程編號 LIKE '%1%'
8-5-3 MAX()函數-範例1 SQL指令配合MAX()函數,可以計算符合條件記錄的欄位最大值。 SQL指令碼檔:Ch8-5-3-01.sql 在【員工】資料表查詢保險金額第一名員工的金額,如下所示: SELECT MAX(保險) AS 保險金額 FROM 員工
8-5-3 MAX()函數-範例2 SQL指令碼檔:Ch8-5-3-02.sql 在【課程】資料表查詢課程編號包含'1'子字串的最大學分數,如下所示: SELECT MAX(學分) AS 最大學分數 FROM 課程 WHERE 課程編號 LIKE '%1%'
8-5-4 MIN()函數-範例1 SQL指令配合MIN()函數,可以計算出符合條件記錄的欄位最小值。 SQL指令碼檔:Ch8-5-4-01.sql 在【員工】資料表查詢保險金額最後一名員工的金額,如下所示: SELECT MIN(保險) AS 保險金額 FROM 員工
8-5-4 MIN()函數-範例2 SQL指令碼檔:Ch8-5-4-02.sql 在【課程】資料表查詢課程編號包含'1'子字串的最少學分數,如下所示: SELECT MIN(學分) AS 最少學分數 FROM 課程 WHERE 課程編號 LIKE '%1%'
8-5-5 SUM()函數-範例1 SQL指令配合SUM()函數,可以計算出符合條件記錄的欄位總和。 SQL指令碼檔:Ch8-5-5-01.sql 在【員工】資料表計算員工的薪水總和和平均,如下所示: SELECT SUM(薪水) AS 薪水總額, SUM(薪水)/COUNT(*) AS 薪水平均 FROM 員工
8-5-5 SUM()函數-範例2 SQL指令碼檔:Ch8-5-5-02.sql 在【課程】資料表計算課程編號包含'1'子字串的學分數總和,如下所示: SELECT SUM(學分) AS 學分總和 FROM 課程 WHERE 課程編號 LIKE '%1%'
練習題 從[學生]資料表中,有(學號,姓名,城市,鄉鎮,道路號碼,電話,監護人,期中分數,期末分數)這些欄位 請找出名字有‘家豪’的學生數有多少 請找出期中分數最低分的五個同學 計算出名字有‘家豪’的學生,期末分數的平均 as 期末平均
8-6 群組查詢GROUP BY子句 8-6-1 GROUP BY子句 8-6-2 HAVING子句 8-6-3 WITHROLLUP和WITH CUBE片語 8-6-4 GROUPING SETS子句
8-6-1 GROUP BY子句-說明 群組是以資料表的指定欄位來進行分類,分類方式是將欄位值中重複值結合起來歸成一類。例如:在【班級】資料表統計每一門課有多少位學生上課的學生數,【課程編號】欄位是建立群組的欄位,可以將修此課程的學生結合起來,如下圖所示:
8-6-1 GROUP BY子句-語法 在SQL語言是使用GROUP BY子句來指定群組欄位,其語法如下所示: GROUP BY 欄位清單 上述語法的欄位清單就是建立群組的欄位,如果不只一個,請使用「,」逗號分隔。
8-6-1 GROUP BY子句-條件 當使用GOUP BY進行查詢時,資料表需要滿足一些條件,如下所示: 資料表的欄位擁有重複值,可以結合成群組。 資料表擁有其他欄位可以配合聚合函數進行資料統計,如下表所示:
8-6-1 GROUP BY子句-範例1 SQL指令碼檔:Ch8-6-1-01.sql 在【班級】資料表查詢課程編號和計算每一門課程有多少位學生上課,如下所示: SELECT 課程編號, COUNT(*) AS 學生數 FROM 班級 GROUP BY 課程編號
8-6-1 GROUP BY子句-範例2 SQL指令碼檔:Ch8-6-1-02.sql 在【學生】資料表查詢統計性別男和女的學生數,如下所示: SELECT 性別, COUNT(*) AS 學生數 FROM 學生 GROUP BY 性別
8-6-2 HAVING子句-語法 GROUP BY子句可以配合HAVING子句來指定搜尋條件,以便進一步縮小查詢範圍,其語法如下所示: HAVING子句和WHRE子句的差異,如下所示: HAVING子句可以使用聚合函數,但WHERE子句不可以。 在HAVING子句條件所參考的欄位一定屬於SELECT子句的欄位清單;WHERE子句則可以參考FORM子句資料表來源的所有欄位。
8-6-2 HAVING子句-範例1 SQL指令碼檔:Ch8-6-2-01.sql SELECT 學號, 課程編號 FROM 班級 GROUP BY 課程編號, 學號 HAVING 學號 = 'S002'
8-6-2 HAVING子句-範例2 SQL指令碼檔:Ch8-6-2-02.sql SELECT 課程編號, COUNT(*) AS 學生數 FROM 班級 WHERE 教授編號 = 'I003' GROUP BY 課程編號 HAVING COUNT(*) >= 2
練習題 從[學生]資料表中,有(學號,姓名,城市,鄉鎮,道路號碼,電話,監護人,期中分數,期末分數)這些欄位 請依照各城市所在的學生人數 as 學生數 找出名字有’家豪’的,住在各城市中,人數超過2位的
8-6-3 WITHROLLUP和WITH CUBE片語- 說明 在SQL Server 2005版的GROUP BY子句新增ROLLUP和CUBE片語,可以用來顯示多層次統計資料的摘要資訊(Summary Information),也就是執行各欄位值加總運算的小計或總和。 WITH CUBE片語是針對GROUP BY子句的各群組欄位執行小計與加總;WITH ROLLUP片語則是針對第一個欄位執行加總運算。
8-6-3 WITHROLLUP和WITH CUBE片語- 範例1 SQL指令碼檔:Ch8-6-3-01.sql 在【班級】資料表找出教授I001和I003教授課程的學生數小計和加總,和各課程的學生總數,如下所示: SELECT 教授編號, 課程編號, COUNT(學號) AS 總數 FROM 班級 WHERE 教授編號 IN ('I001', 'I003') GROUP BY 教授編號, 課程編號 WITH CUBE
8-6-3 WITHROLLUP和WITH CUBE片語- 圖例1
8-6-3 WITHROLLUP和WITH CUBE片語- 範例2 SQL指令碼檔:Ch8-6-3-02.sql 在【班級】資料表找出教授I001和I003教授課程的學生數小計和加總,如下所示: SELECT 教授編號, 課程編號, COUNT(學號) AS 總數 FROM 班級 WHERE 教授編號 IN ('I001', 'I003') GROUP BY 教授編號, 課程編號 WITH ROLLUP
8-6-3 WITHROLLUP和WITH CUBE片語- 圖例2
8-6-4 GROUPING SETS子句-說明 SQL Server 2008版擴充GROUP BY子句的功能,新增GROUPING SETS子句,可以讓使用者定義傳回的統計資料有哪些欄位。換句話說,GROUPING SETS子句可以取代ROLLUP和CUBE片語的功能,產生相同結果的統計資料。 不同於ROLLUP和CUBE片語傳回的資訊是系統內定的結果,如果我們需要指定格式的統計資訊,以產生所需的報表資料,此時就可以使用GROUPING SETS子句來自行定義傳回哪些欄位的聚合統計資料。
8-6-4 GROUPING SETS子句-範例 SQL指令碼檔:Ch8-6-4.sql 在【班級】資料表找出教授I001和I003教授課程的學生數小計和加總,這個SQL指令是改為使用GROUPING SETS子句產生和WITH ROLLUP片語相同的查詢結果,如下所示: SELECT 教授編號, 課程編號, COUNT(學號) AS 總數 FROM 班級 WHERE 教授編號 IN ('I001', 'I003') GROUP BY GROUPING SETS ( (教授編號, 課程編號), (教授編號), () )
8-6-4 GROUPING SETS子句-圖例
8-7 排序ORDER BY子句-語法 SELECT指令可以使用ORDER BY子句依照欄位由小到大或由大到小進行排序,其語法如下所示: ORDER BY 運算式 [ASC | DESC] [, 運算式 [ASC | DESC] 上述語法的排序方式預設是由小到大排序的ASC,如果希望由大至小,請使用DESC關鍵字。
8-7 排序ORDER BY子句-範例 SQL指令碼檔:Ch8-7.sql 在【員工】資料表查詢薪水大於35000元的員工記錄,並且使用薪水欄位進行由大至小排序,如下所示: SELECT 姓名, 薪水, 電話 FROM 員工 WHERE 薪水 > 35000 ORDER BY 薪水 DESC
End