第三章 SQL 查詢指令 一 SELECT 指令設定查詢範圍 二 WHERE 子句的比較運算子 三 WHERE 子句的邏輯運算子 四 ORDER BY 排序子句 五 SQL 聚合函數
一 SELECT 指令設定查詢範圍 (1)SQL 查詢指令只有一個 SELECT 指令, 其基本語法如下所示 : SELECT 欄位 1, 欄位 2, 欄位 N FROM 資料表或檢視表 WHERE 查詢條件 上述 SELECT 子句的欄位 1, 欄位 2, 欄位 N 為記錄欄位, FROM 子句指定查詢目標是資料表或檢視表,WHERE 子句為查詢的篩選條件, 以口語來說就是 從資料表或檢視表取回符合 WHERE 子句條件的紀錄資料, 包含欄位 1, 欄位 2, 欄位 N
(2) 顯示資料表的部分欄位 在使用 SELECT 指令查詢資料表時, 我們可以一一列出需要顯示的欄位名稱清單, 而不用顯示所有欄位 SELECT [ 學號 ],[ 姓名 ], [ 生日 ]FROM[ 學生 ] 上述 SELECT 指令顯示學生資料表的學號 姓名和生日共 3 個以, 逗號分隔的欄位, 可以找到 8 筆記錄, 如右圖所示 :
(3) 顯示資料表的所有欄位 SELECT 指令如果需要顯示所有欄位, 可以直接使用 * 符號代表所有欄位, 而不用一一列出顯示的欄位名稱清單 SELECT * FROM 課程 上述 SELECT 指令的執行結果可以顯示課程資料表的所有紀錄和欄位, 共有 8 筆記錄, 如右圖所示 :
(4) 欄位別名 SELECT 指令預設是使用資料表定義的欄位名稱來顯示查詢結果, 基於需要, 我們可以使用 AS 關鍵字指定欄位別名, 其中 AS 關鍵字本身可有可無 SELECT 學號 AS 學生學號, 姓名 AS 學生姓名, 生日 AS 學生生日 FROM 學生 上述 SELECT 指令可以顯示學生資料表的學號 姓名和生日欄位, 可以看到欄位標題顯示的是別名, 而不是原來的欄位名稱, 如右圖所示 :
(5) 欄位沒有重複值 在資料表紀錄的欄位如果有重複值, 即不同記錄的欄位擁有相同值 SELECT 指令可以加上 DISTINCT 指令, 只顯示其中一筆記錄資料 SELECT DISTINCT 學分 FROM 課程 上述 SQL 指令的欄位學分如果有重複值, 只會顯示其中一筆, 如右圖所示 :
二 WHERE 子句的比較運算子 運算子 說明 = 等於 <>,!= 不等於 (EX:WHERE 學分!= 3 ) >, < 大於, 小於 >=, <= 大於等於, 小於等於 (EX:WHERE 學分 >= 3 )!>,!< 不大於, 不小於
(1) 條件值為字串 WHERE 子句的條件運算式可以使用比較運算子來執行字串比較, 其中條件值的字串需要使用單引號 ( ) 括起 SELECT * FROM 學生 WHERE 學號 = S002 (2) 條件值為日期 / 時間 WHERE 子句的條件運算式如果是日期 / 時間值的比較, 如同字串, 也需要使用單引號 ( ) 括起 SELECT * FROM 學生 WHERE 生日 = 1978-02-02
(3) 條件值為數值 WHERE 子句條件運算式的條件值如果是數值, 數值並不需要使用單引號 ( ) 括起 SELECT * FROM 課程 WHERE 學分 < 4
三 WHERE 子句的邏輯運算子 運算子 說明 LIKE 包含 (WHERE 姓名 LIKE 李 % ) BETWEEN/AND 在一個範圍內 (WHERE 學號 BETWEEN S001 AND S005 ) IN 屬於清單之一 NOT 非 EX WHERE 姓名 NOT LIKE 夏 % AND 且 ( 需兩個皆為真 ) AND 姓名 NOT LIKE 李 % OR 或 ( 需其中一個為真 ) ( ) LIKE 包含子字串運算子 運算子說明 % 代表 0 或更多任意字元長度的字串 (WHERE 姓名 LIKE 李 % ) _ 代表 1 個長度的字元或中文字 (WHERE 姓名 LIKE 陳 _ 廷 )
(1) 使用 % 查詢教授資料表中, 屬於資訊相關科系 CS 和 CIS 的教授記錄 SELECT * FROM 教授 WHERE 科系 LIKE %S% 上述 SELECT 指令的篩選條件是使用 LIKE 運算子, 可以查詢科系欄位擁有英文字母 S 科系的教授資料 換句話說, 只需要欄位值擁有子字串 S 就符合條件, 共找到 3 筆記錄, 如下圖所示 :
(2) 使用 _ 查詢學生資料表中, 姓名姓陳, 而且名字最後一個字是安的學生資料 SELECT * FROM 學生 WHERE 姓名 LIKE 陳 _ 安 上述 SELECT 指令的條件是使用 _ 符號代表任何一個中文字, 可以找到 2 筆記錄, 如下圖所示 :
(3)BETWEEN/AND 運算子可以定義欄位值需要符合的範圍, 範圍值可以是文字 數值或和日期 / 時間資料 查詢學生資料表生日欄位的範圍是 1977 年 1 月 1 日到 1977 年 12 月 31 日出生的學生記錄 SELECT * FROM 學生 WHERE 生日 BETWEEN 1977-1-1 AND 1977-12-31 上述 SELECT 指令的條件是日期範圍, 共找到 4 筆記錄, 如下圖所示 :
(4)NOT 運算子可以搭配邏輯運算子, 取得與條件相反的查詢結果 學生已經修了 CS101 CS222 CS100 和 CS213 四門課, 準備進一步查詢課程資料表, 看看還有哪些課程可以修 SELECT * FROM 課程 WHERE 課程編號 NOT IN ( CS101, CS222, CS100, CS213 ) 上述 SELECT 指令是當課程編號不是 CS101 CS222 CS100 和 CS213 就符合條件, 共找到 5 筆記錄, 如下圖所示 :
(5)AND 運算子連接前後運算式必須同時為真時, 整個 WHERE 子句的條件才為真 查詢課程資料表的課程編號欄位包含 '1' 子字串, 而且課程名稱欄位有 ' 程式 ' 子字串 SELECT * FROM 課程 WHERE 課程編號 LIKE %1% AND 課程名稱 LIKE % 程式 % 上述 SELECT 指令的條件可以找到 1 筆符合條件的記錄, 如下圖所示 :
(6)OR 運算子連接的前後條件, 只需任何一個條件為真, 即為真 查詢課程資料表的課程編號欄位包含 '1' 子字串, 或課程名稱欄位有 ' 程式 ' 子字串 SELECT * FROM 課程 WHERE 課程編號 LIKE %1% OR 課程名稱 LIKE % 程式 % 上述 SELECT 指令的條件可以找到 6 筆符合條件的記錄, 如下圖所示 :
(1) 由小到大排序 四 ORDER BY 排序子句 查詢課程資料表學分大於等於 3 的記錄, 而且使用學分欄位由小到大進行排序 SELECT * FROM 課程 WHERE 學分 >= 3 ORDER BY 學分 ASC 上述 SELECT 指令的條件可以找到 7 筆符合條件的記錄, 而且是使用學分欄位由小到大進行排序, 如下圖所示 :
(2) 由大到小排序 查詢課程資料表學分大於等於 3 的記錄, 而且使用學分欄位由大到小進行排序 SELECT * FROM 課程 WHERE 學分 >= 3 ORDER BY 學分 DESC 上述 SELECT 指令的條件可以找到 7 筆符合條件的記錄, 而且是使用學分欄位由大到小進行排序, 如下圖所示 :
五 SQL 聚合函數 運算子說明範例 COUNT( 運算式 ) 計算記錄筆數 1.Select count (*) as 學生數 from 學生 2.Select count (*) as 課程數 from 課程 where 學分 >=3 3. Count (DISTINCT 姓名 )as 人數 把重複的姓名筆數去除 AVG( 運算式 ) 計算欄位平均 1.Select avg( 學分 )as 平均學分 from 課程 2.Select count (*) as 課程數, avg( 學分 )as 平均學分 from 課程 where 課程名稱 LIKE % 設計 % MAX( 運算式 ) 計算欄位最大值 Select MAX (year (Getdate()) year( 生日 )) As 最大年齡 from 學生 MIN( 運算式 ) 計算欄位最小值 Select MIN(year (Getdate()) year( 生日 )) As 最小年齡 from 學生 SUM( 運算式 ) 計算欄位總合
(1)COUNT() 函數 1. 查詢學生資料表的學生總數, 如下所示 : SELECT COUNT (*) as 學生數 FROM 學生 2. 在學生資料表查詢有生日資料的學生總數, 即生日欄位不是空值 NULL 的記錄數, 如下所示 : SELECT COUNT (*) as 學生數 FROM 學生 上述 SELECT 指令因為學生資料表的生日欄位有空值, 所以查詢結果的記錄數是 7, 如下圖所示 :
(2)AVG() 函數 1. 在課程資料表查詢課程學生的平均值, 如下所示 : SELECT AVG ( 學分 )as 平均學分 FROM 課程 2. 在課程資料表查詢課程編號包含 '1' 子字串的課程總數, 和學分的平均值, 如下所示 : SELECT COUNT (*) as 課程總數, AVG( 學分 )as 學分平均值 FROM 課程 WHERE 課程編號 LIKE %1%
(3)MAX() 函數 1. 在學生資料表查詢年齡最大的學生是幾歲,YEAR() 函數可以取得年份 ; GETDATE() 函數取得今天的日期, 如下所示 : SELECT MAX(YEAR(GETDATE()) YEAR( 生日 ) ) AS 最大年齡 FROM 學生 2. 在課程資料表查詢課程編號包含 '1' 子字串的最大學分數, 如下所示 : SELECT MAX( 學分 ) AS 最大學分數 FROM 課程 WHERE 課程編號 LIKE %1%
(4)MIN() 函數 1. 在學生資料表查詢年齡最小的學生是幾歲,YEAR() 函數可以取得年份 ; GETDATE() 函數取得今天的日期, 如下所示 : SELECT MN(YEAR(GETDATE()) YEAR( 生日 ) ) AS 最小年齡 FROM 學生 2. 在課程資料表查詢課程編號包含 '1' 子字串的最少學分數, 如下所示 : SELECT MIN( 學分 ) AS 最少學分數 FROM 課程 WHERE 課程編號 LIKE %1%
(5)SUM() 函數 1. 在學生資料表計算學生年齡的平均,IS NOT NULL 條件是指非空值的記錄 ( 因為有一筆記錄的生日欄位是空值 ), 如下所示 : SELECT SUM(YEAR(GETDATE()) YEAR( 生日 )) / COUNT (*) AS 平均年齡 FROM 學生 WHERE 生日 IS NOT NULL 2. 在課程資料表計算課程編號包含 '1' 子字串的學分數總和, 如下所示 : SELECT SUM( 學分 ) AS 學分總和 FROM 課程 WHERE 課程編號 LIKE %1%