第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 選課資料表.課程編號 = 課程資料表.課程編 號
© Copyright 2024 ExpyDoc