HTML網頁基礎語言

第18章 SQL結構化查詢語言
• 18-1 SQL語言的基礎
• 18-2 SQL的查詢指令
• 18-3 SQL子查詢與合併查詢
18-1 SQL語言的基礎
• 18-1-1 SQL結構化查詢語言
• 18-1-2 Access查詢物件的SQL檢視
18-1-1 SQL結構化查詢語言-說明
• 「SQL」(Structured Query Language)為「ANSI」
(American National Standards Institute)標準的資
料庫語言,可以用來存取和更新資料庫的記錄,
這是目前關聯式資料庫系統主要支援的資料庫語
言。
• 早在1970年,E. F. Codd建立關聯式資料庫觀念,
同時就提出一種構想的資料庫語言,這是一種完
整和通用的資料存取方式,雖然當時並沒有真正
建立語法,但這便是SQL的源起。
18-1-1 SQL結構化查詢語言-種類
• SQL語言依指令功能可以分成3種語言,如
下所示:
– 資料定義語言(Data Definition Language):
屬於資料表建立、新增索引和定義欄位等SQL
指令。
– 資料操作語言DML(Data Manipulation
Language):屬於資料表記錄插入、刪除、更
新和查詢指令。
– 資料控制語言DCL(Data Control Language):
屬於資料庫安全設定和權限管理的相關指令。
18-1-1 SQL結構化查詢語言-指令
• SQL資料操作指令共有4個基本指令,如下
表所示:
指令
INSERT
UPDATE
DELETE
SELECT
說明
在資料表插入一筆新記錄
更新資料表的記錄,這些記錄是已經存在的記錄
刪除資料表的記錄
查詢資料表的記錄,使用條件查詢資料表符合條件的記錄
18-1-2 Access查詢物件的SQL檢視
• 在Access可以使用精靈或設計檢視來建立查詢物件,
事實上,查詢物件還提供SQL檢視,可以直接輸
入SQL指令來建立查詢物件。
18-2 SQL的查詢指令
•
•
•
•
•
•
•
18-2-1 SELECT指令設定查詢範圍
18-2-2 WHERE條件子句
18-2-3 AND與OR多條件查詢
18-2-4 ORDER BY排序子句
18-2-5 BETWEEN/AND資料範圍子句
18-2-6 IN和NOT運算子
18-2-7 SQL的聚合函數
18-2 SQL的查詢指令
• SQL查詢指令只有SELECT指令,其完整的
指令語法如下所示:
SELECT column1, column2 FROM table WHERE
conditions
• 上述SELECT指令的column1~2為記錄欄位,
table為資料表,conditions為查詢條件,這個
指令使用口語來說是「從資料表table取回符
合WHERE條件所有記錄的欄位column1和
column2」。
18-2-1 SELECT指令設定查詢範圍顯示資料表的部分欄位
顯示資料表的部分欄位
• SELECT指令查詢資料表時可以只顯示部分欄位,
即指定顯示哪些欄位。
• SQL指令只顯示【產品資訊】資料表的【產品編
號】、【產品名稱】和【定價】欄位,如下所示:
SELECT 產品編號, 產品名稱, 定價 FROM 產品資
訊
18-2-1 SELECT指令設定查詢範圍顯示資料表的所有欄位
顯示資料表的所有欄位
• SELECT指令如果需要顯示記錄的所有欄位,可以
使用「*」符號代表所有欄位,而不用一一列出顯
示的欄位名稱。
• SQL指令可以顯示產品資訊資料表的所有欄位和
記錄,如下所示:
SELECT * FROM 產品資訊
18-2-1 SELECT指令設定查詢範圍欄位沒有重複值
欄位沒有重複值
• 資料表記錄的欄位如果有重複值,即欄位(單一
欄位)中的資料重複,擁有相同值,在SELECT指
令只需加上DISTINCT指令,就只會顯示其中一筆
記錄資料。
• 在【產品資訊】資料表顯示一共有多少種不同的
【定價】,如下所示:
SELECT DISTINCT 定價 FROM 產品資訊
18-2-2 WHERE條件子句-說明
• SELECT指令的WHERE條件子句是查詢主角,在
SELECT指令指定查詢哪個資料表和哪些欄位,然
後讓WHERE子句條件篩選查詢條件的記錄。
• WHERE條件的欄位值可以是文字、數值或日期/
時間,使用的運算子,如下表所示:
運算子
=
<>
>
>=
<
<=
LIKE
說明
相等
不相等
大於
大於等於
小於
小於等於
包含子字串
18-2-2 WHERE條件子句-條件值為
字串
條件值為字串
• WHERE條件的欄位如果是字串需要加上單
引號或雙引號,條件是字串比較,可以使
用的運算子和範例,如下表所示:
運算子
=
>
>=
<
<=
<>
範例
SELECT * FROM 產品資訊 WHERE 產品說明='USB 傳輸埠充電'
SELECT * FROM 產品資訊 WHERE 產品說明>'USB 傳輸埠充電'
SELECT * FROM 產品資訊 WHERE 產品說明>='USB 傳輸埠充電''
SELECT * FROM 產品資訊 WHERE 產品說明<'USB 傳輸埠充電'
SELECT * FROM 產品資訊 WHERE 產品說明<='USB 傳輸埠充電'
SELECT * FROM 產品資訊 WHERE 產品說明<>'USB 傳輸埠充電'
18-2-2 WHERE條件子句-包含子字
串1
包含子字串
• LIKE包含運算子只需包含的子字串就符合
條件,而且還可以進一步配合萬用字元建
立字串範本(Pattern)來進行比對,如下表
所示:
Access 萬用字元
*
?
#
ANSI-SQL 的萬用字
元
%
_
#
說明
代表任何子字串
代表 1 個字元
代表 1 個數字
18-2-2 WHERE條件子句-包含子字
串2
• 查詢產品說明擁有子字串"5"的SQL指令,如下所示:
SELECT * FROM 產品資訊
WHERE 產品說明 LIKE '*5*'
• 查詢產品名稱是以任何字串開頭,中間為"-",結
尾為"GB"的SQL指令,如下所示:
SELECT * FROM 產品資訊
WHERE 產品名稱 LIKE '*-?GB'
• 查詢入庫日期(日期/時間資料類型也可以使用萬
用字元)是以子字串"200"開頭,月份是任易一個
數字,其SQL指令如下所示:
SELECT * FROM 產品資訊
WHERE 入庫日期 LIKE '200?/#/*'
18-2-2 WHERE條件子句-條件值為
數值
• WHERE條件如果為數字欄位就不需要使用
單引號括起,可以使用的運算子和範例,
如下表所示:
運算子
=
>
>=
<
<=
<>
範例
SELECT * FROM 產品資訊 WHERE 定價=3000
SELECT * FROM 產品資訊 WHERE 定價>3000
SELECT * FROM 產品資訊 WHERE 定價>=3000
SELECT * FROM 產品資訊 WHERE 定價<3000
SELECT * FROM 產品資訊 WHERE 定價<=3000
SELECT * FROM 產品資訊 WHERE 定價<>3000
18-2-2 WHERE條件子句-條件值為
日期/時間
• 當WHERE條件值為日期/時間時,日期/時
間字串需要使用「#」符號括起,可以使用
的運算子和範例,如下表所示:
運算子
=
>
>=
<
<=
<>
範例
SELECT * FROM 產品資訊 WHERE 入庫日期=#2006/12/3#
SELECT * FROM 產品資訊 WHERE 入庫日期>#2006/12/3#
SELECT * FROM 產品資訊 WHERE 入庫日期>=#2006/12/3#
SELECT * FROM 產品資訊 WHERE 入庫日期<#2006/12/3#
SELECT * FROM 產品資訊 WHERE 入庫日期<=#2006/12/3#
SELECT * FROM 產品資訊 WHERE 入庫日期<>#2006/12/3#
18-2-3 AND與OR多條件查詢-AND
「且」運算子
AND「且」運算子
• AND運算子連接的前後條件都必須同時成立,整
個條件才成立,即都為「真」(True),才是
「真」(True)。
• 查詢產品資訊的入庫日期包含"6",且產品名稱有
"Nano"子字串的SQL指令,如下所示:
SELECT * FROM 產品資訊
WHERE 入庫日期 LIKE '*6*' AND 產品名稱 LIKE
'*Nano*'
18-2-3 AND與OR多條件查詢-OR
「或」運算子
OR「或」運算子
• OR運算子連接的前後條件只需任何一個條件成立
即可,也就是說,只需其中之一為「真」
(True),就為「真」(True)。
• 查詢產品資訊的產品名稱包含"Nano"或定價大於
5000的SQL指令,如下所示:
SELECT * FROM 產品資訊
WHERE 產品名稱 LIKE '*Nano*' OR 定價>5000
18-2-3 AND與OR多條件查詢-複雜的
WHERE條件子句
複雜的WHERE條件子句
• WHERE條件如果需要連接3、4個或以上的條件,
在WHERE條件可以同時使用AND和OR連結多個
不同條件。
• 查詢產品資訊的產品名稱有"Nano"子字串或入庫
日期有"7"子字串,而且定價大於等於5000,其
SQL指令如下所示:
SELECT * FROM 產品資訊
WHERE 產品名稱 LIKE '*Nano*'
OR 入庫日期 LIKE '*7*' AND 定價>=5000
18-2-3 AND與OR多條件查詢-擁有括
號的WHERE條件子句
擁有括號的WHERE條件子句
• WHERE條件的優先順序以括號為優先,所以使用
括號可以產生不同的查詢結果。
• 查詢產品資訊的產品名稱有"Nano"子字串或入庫
日期有"7"子字串,這2個條件使用括號括起,而
且定價需要大於等於5000的記錄,其SQL指令如
下所示:
SELECT * FROM 產品資訊
WHERE (產品名稱 LIKE '*Nano*' OR 入庫日期
LIKE '*7*')
AND 定價>=5000
18-2-4 ORDER BY排序子句-由小到
大排序
由小到大排序
• 在SQL指令只需加上ORDER BY子句指定排
序欄位,就可以由小到大進行排序。
• 查詢定價大於等於3500元的記錄,並且使用
定價欄位由小到大進行排序的SQL指令,如
下所示:
SELECT * FROM 產品資訊
WHERE 定價>=3500 ORDER BY 定價 ASC
18-2-4 ORDER BY排序子句-由大到
小排序
由大到小排序
• 如果排序順序需要倒過來由大到小,只需
在ORDER BY子句的最後加上DESC指令。
• 查詢定價大於等於3500元的記錄,並且使用
定價欄位由大到小進行排序的SQL指令,如
下所示:
SELECT * FROM 產品資訊
WHERE 定價>=3500 ORDER BY 定價 DESC
18-2-5 BETWEEN/AND資料範圍子
句
• BETWEEN AND子句可以定義SELECT指令
WHERE條件子句的範圍,範圍值可以使用文字、
數值或日期/時間。
• 查詢2006年1月1日到12月31日入庫產品記錄的SQL
指令,如下所示:
SELECT * FROM 產品資訊
WHERE 入庫日期 BETWEEN #2006/1/1# AND
#2006/12/31#
• 查詢定價在5000到10000之間的產品資訊,其SQL
指令如下所示:
SELECT * FROM 產品資訊
WHERE 定價 BETWEEN 5000 AND 10000
18-2-6 IN和NOT運算子-IN運算子
IN運算子
• IN運算子可以設定一串文字或數值清單,
如果欄位值為其中之一就符合條件。
• 查詢定價3000、7000和7500的產品資料,其
SQL指令如下所示:
SELECT * FROM 產品資訊
WHERE 定價 IN (3000, 7000, 7500)
18-2-6 IN和NOT運算子-NOT運算
子
NOT運算子
• NOT運算子可以搭配前述子句,取得與條
件相反的查詢結果,如下表所示:
運算子
NOT LIKE
NOT BETWEEN
NOT IN
說明
否定 LIKE 運算式
否定 BETWEEN/AND 運算式
否定 IN 運算式
• 查詢除了一些特定的定價外的產品記錄資
料,SQL指令如下所示:
SELECT * FROM 產品資訊
WHERE 定價 NOT IN (3000, 7000, 7500)
18-2-7 SQL的聚合函數-說明
• SQL的聚合函數可以進行資料表欄位的筆數、
平均、範圍和統計函數,提供進一步欄位
資料的分析結果,如下表所示:
函數
Count(Column)
Avg(Column)
Max(Column)
Min(Column)
Sum(Column)
StDev(Column)
StDevP(Column)
Var(Column)
VarP(Column)
說明
計算記錄筆數
計算欄位平均值
取得記錄欄位的最大值
取得記錄欄位的最小值
取得記錄欄位的總計
統計樣本的標準差
統計母體的標準差
統計樣本的變異數
統計母體的變異數
18-2-7 SQL的聚合函數-Count()函數
• Count()函數可以計算記錄的筆數,「*」參數可以
統計資料表的記錄數,也可以指定欄位來計算欄
位不是空白的記錄數,如下表所示:
SQL 指令範例
SELECT Count(*) FROM 產品資訊
SELECT Count(產品外觀) FROM 產品資訊
SELECT Count(*) FROM 產品資訊
WHERE 定價>5000
結果
18-2-7 SQL的聚合函數-Avg()函數
• Avg()函數可以計算數字欄位的平均值,如
下表所示:
SQL 指令範例
SELECT Avg(定價) FROM 產品資訊
SELECT Count(*), Avg(定價) FROM 產
品資訊 WHERE 產品名稱 LIKE
'*Nano*'
結果
18-2-7 SQL的聚合函數-Max()函數
• Max()函數可以找出符合條件記錄中的欄位
最大值,如下表所示:
SQL 指令範例
SELECT Max(定價) FROM 產品資訊
SELECT Max(定價) FROM 產品資訊
WHERE 產品名稱 LIKE '*Nano*'
結果
18-2-7 SQL的聚合函數-Min()函數
• Min()函數可以計算符合條件記錄的欄位最
小值,如下表所示:
SQL 指令範例
SELECT Min(定價) FROM 產品資訊
SELECT Min(定價) FROM 產品資訊
WHERE 產品名稱 LIKE '*Nano*'
結果
18-2-7 SQL的聚合函數-Sum()函數
• Sum()函數可以計算符合條件記錄的欄位總
和,如下表所示:
SQL 指令範例
SELECT Sum(定價) FROM 產品資訊
SELECT Sum(定價) FROM 產品資訊
WHERE 產品名稱 LIKE '*Nano*'
結果
18-3 SQL子查詢與合併查詢
• 18-3-1 SQL的子查詢
• 18-3-2 內部合併查詢INNER JOIN指令
• 18-3-3 外部合併查詢OUTER JOIN指令
18-3-1 SQL的子查詢
• 在SELECT指令的WHERE子句可以使用另一個
SELECT指令查詢其他資料表的記錄,稱為「子查
詢」(Subquery)。
• 在【學生】資料表使用姓名查詢學號,然後使用
取得的學號在【選課】資料表查詢選課的記錄數,
SQL指令如下所示:
SELECT Count(*) FROM 選課資料表
WHERE 學號 =
(SELECT 學號 FROM 學生資料表 WHERE 姓名='周傑倫')
18-3-2 內部合併查詢INNER JOIN
指令-說明
• SQL合併查詢指令是JOIN,可以將關聯式
資料庫分割的資料表合併成未分割前的結
果,以方便檢視所需的資訊。因為正規化
的目的是為了避免資料重複,但是閱讀資
訊時,重複資料反了容易閱讀。
• SQL合併查詢分為:INNER JOIN和OUTER
JOIN指令。INNER JOIN指令可以取回2個
資料表都存在的記錄。
18-3-2 內部合併查詢INNER JOIN
指令-範例1
• 查詢所有學生選課的課程編號資料,從學
生資料表取得學號和姓名,選課資料表取
得選課編號,關聯欄位是學號,SQL指令如
下所示:
SELECT 學生資料表.學號, 學生資料表.姓名, 選課
資料表.課程編號
FROM 學生資料表
INNER JOIN 選課資料表 ON 學生資料表.學號 =
選課資料表.學號
18-3-2 內部合併查詢INNER JOIN
指令-範例2
• 在上一個查詢物件只取得課程編號,請進
一步使用合併查詢,取得【課程資料表】
的所有欄位,SQL指令如下所示:
SELECT 學生資料表.學號, 學生資料表.姓名, 課程
資料表.*
FROM 課程資料表
INNER JOIN (學生資料表 INNER JOIN 選課資
料表 ON 學生資料表.學號 = 選課資料表.學號)
ON 選課資料表.課程編號 = 課程資料表.課程編
號
18-3-2 內部合併查詢INNER JOIN
指令-範例3
• 在上一個查詢物件只取得教授編號,請進一步使
用合併查詢,取得【教授資料表】的所有欄位,
SQL指令如下所示:
SELECT 學生資料表.學號, 學生資料表.姓名, 課程資料表.*,
教授資料表.*
FROM 教授資料表 INNER JOIN
(課程資料表 INNER JOIN
(學生資料表 INNER JOIN 選課資料表 ON 學生資料表.學
號 = 選課資料表.學號)
ON 選課資料表.課程編號 = 課程資料表.課程編號)
ON 教授資料表.教授編號 = 課程資料表.教授編號
18-3-3 外部合併查詢OUTER JOIN
指令-說明
• OUTER JOIN指令可以取回任一資料表的所
有記錄,不論是否是2個資料表都存在的記
錄,一共分成2種JOIN指令,如下所示:
– RIGHT JOIN:取回右邊資料表內的所有記錄。
– LEFT JOIN:取回左邊資料表內的所有記錄。
18-3-3 外部合併查詢OUTER JOIN
指令-範例1
• 從學生資料表取得學號、姓名,選課資料
表取得選課編號,關聯欄位是學號,SQL指
令如下所示:
SELECT 學生資料表.學號, 學生資料表.姓名, 選課
資料表.課程編號
FROM 學生資料表
LEFT JOIN 選課資料表 ON 學生資料表.學號 =
選課資料表.學號
18-3-3 外部合併查詢OUTER JOIN
指令-範例2
• 查詢學生的選課資料,從學生資料表取得
學號和姓名,課程資料表取得所有欄位,
SQL指令如下所示:
SELECT 學生資料表.學號, 學生資料表.姓名, 課程
資料表.*
FROM 課程資料表
RIGHT JOIN (學生資料表 INNER JOIN 選課資料
表 ON 學生資料表.學號 = 選課資料表.學號)
ON 選課資料表.課程編號 = 課程資料表.課程編
號