第8章 SELECT敘述的基本查詢 8-1 SELECT查詢指令 8-2 SELECT子句 8-3 FROM子句 8-4 WHERE子句

Slides:



Advertisements
Similar presentations
第二章 简单的 SQL 语句. 本章要点  创建一个简单的表  SQL 语句介绍  最简单的查询语句 select  带有限制条件的查询  查询结果的排序显示.
Advertisements

Data type P64 ‘’ 转义字符 P67 P68 EXE,选出某个教师的学生中最新的一 个,要姓名, ID (,LIMIT ) EXISTS,NOT EXISTS P409 Q,EXISTS 和 in 的区别( 1000 ,查询结果)
Java 技术与应用 数据库应用 ( 第 14 章 ) 西安交大 卫颜俊 2008 年 12 月 电子信箱: QQ: 网站 : /java.
第 7 章 数据库 1. Overview  数据库概述  数据库管理系统  数据库的体系结构和数据库模型  SQL 语言  数据库技术  构建数据库系统 2.
强力推进 积极探索 努力提升计算机审计实施水平 AO案例和审计方法撰写介绍 曹红珍.
第6章 数据库管理软件Access 年秋.
目 录 第 1 章 数据库技术基础 第 2 章 SQL Server基础 第 3 章 数据库管理 第 4 章 查询和视图
SQL的简单查询.
第5章 关系数据库标准语言SQL 主讲:张丽芳.
十一 ASP对数据库的访问.
第2章 SQL语言初步 2.1 SQL的基本概念 2.2 基本表、索引的创建、删除和修改操作 2.3 SQL的查询语句——SELECT
第2讲 Transact-SQL语言.
第5章 索引及视图操作 数据库原理应用与实践 SQL SERver2014(第2版) 主编 贾铁军 科学出版社 编著 陈国秦 万程 邢一鸣
数据库技术 实践.
高等院校计算机教材系列 数据库原理与应用(第2版) 任课教师:刘雅莉
Chap 11 SQL基本查詢指令.
复习重点; 1. 关系模型、ER模型 2. SQL 3. 事务管理 4. 函数依赖与规范化 5. 数据库设计  复习题 一、单项选择题
数据库原理及应用 《数据库原理及应用》课程组 荆楚理工学院.
第4章 关系数据库标准语言SQL 4.1 SQL语言概述 4.2 SQL数据查询功能 4.3 SQL数据操作功能 4.4 SQL数据定义功能.
第3章 SQL的基础知识 数据库管理及应用 3.1 SQL简介 3.2 SQL的数据模型 3.3 标识符 3.4 使用SQL语句管理数据库
第7章 数据库基础知识 SQL常用命令使用方法 (1) 数据记录筛选: sql="select * from 数据表
数据库概述 简而言之,数据库(DataBase)就是一个存储数据的仓库。为了方便数据的存储和管理,它将数据按照特定的规律存储在磁盘上。通过数据库管理系统,可以有效的组织和管理存储在数据库中的数据。如今,已经存在了Oracle、SQL Server、MySQL等诸多优秀的数据库。在这一章中将讲解的内容包括。
文科计算机小公共课规划教材 Access 程序设计.
食品中毒的概念? 概念指摄入了含有生物性、化学性有毒、有害物质的食品或者把有毒、有害物质当作食品摄入后出现的非传染性(不属于传染病)的急性、亚急性疾病。 食品中毒的特点? 1. 潜伏期短,大约进食后0.5-24h相继发病,来势急剧,短时间内可能有大量病人同时发病。 2. 与食物有密切的关系,所有病人都食过同一种食物。
第一讲 数据查询优化.
《计算机应用基础》 第六章 Access数据库管理系统
Chap 13 視界與資料庫程式設計.
第 10 章 更多的查詢技巧.
第6章 数据展示和输出功能 创建和使用报表 报表(Report)是以打印格式展示数据的一种有效方式。在报表中,可以展示图形、文字标题、字段数据或汇总数据等形式的信息,并可以控制各种数据的大小和外观。 利用报表,还可以按照数据之间的逻辑关系和所需的方式来组织数据之间的排版布局,对数据进行多级汇总和统计,或以图形方式展示数据。
软件设计师培训.
计算机应用基础 上海大学计算中心.
第3章 数据查询与SQL命令.
第5讲 分组查询 IBM Confidential.
查询数据.
關聯式資料庫.
Access 2007 進銷存管理系統實作 文魁資訊股份有限公司.
第六章 學習SQL語言.
9 SELECT敘述的進階查詢 9-1 SQL的多資料表查詢 9-2 合併查詢 9-3 集合運算查詢 9-4 子查詢
資料庫系統 Database Systems
課程名稱:資料庫系統 授課老師:李春雄 博士
Chapter 12 T-SQL 語法與 ASP.NET.
2、掌握SQL中各种查询方法和数据更新方法 3、掌握SQL中视图的定义方法和用法 4、掌握SQL的授权机制
彰化縣政府補助辦理網頁設計資料庫應用班 ASP與資料庫介紹 建國技術學院資管系 饒瑞佶.
SQL Server 2000 数据库入门.
第3章 MySQL教學範本 主從式資料庫系統 - CH3.
实验 2:MS Access QBE Query使用
第九章 進階的查詢技巧.
SQL SERVER 一些经典语句 1.
MySQL 結構化查詢語言 MySQL.
第十七章 資料庫SQL 17-1 SELECT 17-2 INSERT 17-3 UPDATE 17-4 DELETE.
資料庫管理(Access 2003) 第五章 利用查詢來 統計與分析資料 許欽嘉 老師.
iRepor报表设计基础 IReport安装 普通实体报表 数据结果集报表 工作流主从报表 饼状图报表 柱状图,曲线图报表 条形码报表
SQL Injection (資料隱碼) 學生:a 吳倩瑜 指導教授:梁明章.
第20章 MySQL数据库.
網路遊戲版 幸福農場168號.
数据库技术.
第18章 SQL結構化查詢語言 18-1 SQL語言的基礎 18-2 SQL的查詢指令 18-3 SQL子查詢與合併查詢.
資料庫系統 李翊豪 2017/12/21 Reference
3. SQL语言的应用 3.1 SQL历史和优点 3.2 数据查询 3.3 数据操纵.
查询与视图 蔡海洋.
第14章 SQL数据查询与操纵 内容提要 本章知识点
SQL查询语句 蔡海洋.
附錄D Access應用說明 主從式資料庫系統 - 附錄D.
本讲内容 SQL 概述 SQL 的查询功能 SQL 的操作功能 SQL 的定义功能.
第三章 SQL Server数据管理.
8 SELECT敘述的基本查詢 8-1 SELECT查詢指令 8-2 SELECT子句 8-3 FROM子句 8-4 WHERE子句
11 檢視表的建立 11-1 檢視表的基礎 11-2 建立檢視表 11-3 修改與刪除檢視表 11-4 編輯檢視表的內容.
模块六 数据库管理软件——Access 2010.
第4章 数据查询.
第 9 章 查詢資料- 善用 SELECT 敘述.
Presentation transcript:

第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