當您想要從資料庫擷取資料時,需要使用結構化查詢語言 (或 SQL) 來索取資料。 SQL 是與英文非常類似但資料庫程式能理解的電腦語言。 您執行的每個查詢在幕後都是使用 SQL。
了解 SQL 的運作方式可協助您建立更完善的查詢,而且可以讓您更輕鬆了解如何修正未傳回所要結果的查詢。
這是有關 Access SQL 一系列文章的其中一篇。 本文說明選取資料的 SQL 基本使用方式,並運用範例來說明 SQL 語法。
本文內容
什麼是 SQL?
SQL 是處理事實集合及其間關聯的電腦語言。 關聯式資料庫程式 (例如 Microsoft Office Access) 會運用 SQL 來處理資料。 SQL 與許多電腦語言不同,並不難閱讀及理解,甚至初學者也沒問題。 SQL 和許多電腦語言相同,是 ISO 和 ANSI 等標準機構認可的國際標準。
您使用 SQL 來描述有助於回答問題的資料集。 當您使用 SQL 時,必須使用正確的語法。 語法是一套規則,用以規定結合語言元素的正確方式。 SQL 語法以英文語法為基礎,而且使用許多與 Visual Basic for Applications (VBA) 語法相同的元素。
舉例來說,下列簡單 SQL 陳述式可以擷取名字為 Mary 的連絡人姓氏清單:
SELECT Last_Name
FROM Contacts WHERE First_Name = 'Mary';
附註: SQL 不是只用於管理資料,也用於建立及變更資料庫物件的設計,例如資料表。 用於建立及變更資料庫物件的 SQL 部分稱為資料定義語言 (DDL)。 本文未涵蓋 DDL。 如需詳細資訊,請參閱使用資料定義查詢建立或修改資料表或索引一文。
SELECT 陳述式
若要使用 SQL 描述資料集,您需撰寫 SELECT 陳述式。 SELECT 陳述式包含您要從資料庫取得的完整資料集描述。 這包含下列要素:
-
包含資料的資料表。
-
不同來源資料之間的關聯性。
-
產生資料的欄位或計算。
-
納入資料所必須符合的準則。
-
是否要排序結果及排序方式。
SQL 子句
SQL 陳述式就如一般句子,也會有子句。 每個子句會為 SQL 陳述式執行一種功能。 在 SELECT 陳述式中,某些子句是必要的。 下表列出最常見的 SQL 子句。
SQL 子句 |
功能 |
必要 |
SELECT |
列出含有需要資料的欄位。 |
可 |
FROM |
列出含有 SELECT 子句所列之欄位的資料表。 |
可 |
WHERE |
指定結果中所包含的每一筆記錄必須符合的欄位準則。 |
否 |
ORDER BY |
指定如何排序結果。 |
否 |
GROUP BY |
在含有總合函數的 SQL 陳述式中,列出 SELECT 子句中未彙總的欄位。 |
只在當有這樣的欄位時 |
HAVING |
在含有總合函數的 SQL 陳述式中,指定套用到 SELECT 陳述式中所彙總之欄位的條件。 |
否 |
SQL 詞彙
每個 SQL 子句都是由詞彙 (可與詞性比較) 所組成。 下表列出 SQL 詞彙類型。
SQL 詞彙 |
相對的詞性 |
定義 |
範例 |
識別項 |
名詞 |
您用來識別資料庫物件的名稱,例如欄位名稱。 |
客戶.[電話號碼] |
運算子 |
動詞或副詞 |
代表某個動作或修飾某個動作的關鍵字。 |
AS |
常數 |
名詞 |
一個不會變更的值,例如數字或 NULL。 |
42 |
運算式 |
形容詞 |
識別項、運算子、常數和函數的組合,會求出單一值。 |
>= 產品.[單價] |
基本 SQL 子句:SELECT、FROM 和 WHERE
SQL 陳述式的一般形式如下:
SELECT field_1
FROM table_1 WHERE criterion_1 ;
附註:
-
Access 會忽略 SQL 陳述式中的斷行。 不過,請考慮每個子句使用一行,以協助改善 SQL 陳述式的可讀性,更易於自己及其他人閱讀。
-
每個 SELECT 陳述式的結尾都是分號 (;)。 分號可出現在最後一個子句的結尾,或是在 SQL 陳述式的結尾 (獨自放在一行)。
Access 中的範例
下圖說明一個簡單選取查詢的 SQL 陳述式在 Access 中看起來的樣子:
1.SELECT 子句
2.FROM 子句
3.WHERE 子句
此範例 SQL 陳述式指出:從名為 Contacts (連絡人) 的資料表,選取儲存在名為 E-mail Address (電子郵件地址) 和 Company (公司) 欄位中的資料,且這些記錄的 City (城市) 欄位值為 Seattle (西雅圖)。
讓我們逐一查看範例中的子句,以了解 SQL 語法的運作方式。
SELECT 子句
SELECT [E-mail Address], Company
這是 SELECT 子句。 它包含運算子 (SELECT),後面接著兩個識別項 ([E-mail Address] 和 Company)。
如果識別項含有空格或特殊字元 (例如 "E-mail Address"),則必須用方括號括住。
SELECT 子句不必指出包含欄位的資料表,而且無法指定資料必須符合任何條件才能納入。
在 SELECT 陳述式中,SELECT 子句一律會顯示在 FROM 子句的前面。
FROM 子句
FROM Contacts
這是 FROM 子句。 它包含運算子 (FROM),後面接著一個識別項 (Contacts)。
FROM 子句不會列出要選取的欄位。
WHERE 子句
WHERE City="Seattle"
這是 WHERE 子句。 它包含運算子 (WHERE),後面接著運算式 (City="Seattle")。
附註: WHERE 子句不同於 SELECT 和 FROM 子句,並非 SELECT 陳述式的必要元素。
您可以使用 SELECT、FROM 和 WHERE 子句,完成 SQL 可讓您執行的許多動作。 以下其他文章提供有關如何使用這些子句的詳細資訊:
排序結果:ORDER BY
就像 Microsoft Excel 一樣,Access 可讓您排序資料工作表中的查詢結果。 您也可以使用 ORDER BY 子句,在查詢中指定要如何在執行查詢時排序結果。 如果您使用 ORDER BY 子句,則會是 SQL 陳述式中的最後一個子句。
ORDER BY 子句包含您要用於排序的欄位清單,與您要套用排序作業的順序相同。
例如,假設您要讓結果先依據 Company 的欄位值以遞減順序排序 (如果有含有相同 Company 值的記錄),接下來再依據 E-mail Address 欄位中的值以遞增順序排序。 ORDER BY 子句看起來會像這樣:
ORDER BY Company DESC, [E-mail Address]
附註: 根據預設,Access 以遞增順序 (A-Z、最小到最大) 排序值。 若要改為以遞減順序排序值,請使用 DESC 關鍵字。
如需有關 ORDER BY 子句的詳細資訊,請參閱 ORDER BY 子句主題。
使用摘要資料:GROUP BY 和 HAVING
有時候您會想要使用摘要資料,例如一個月的總銷售量,或庫存中最貴的項目。 若要這麼做,您需將彙總函數套用到 SELECT 子句中的欄位。 例如,若要讓查詢顯示針對每個公司列出的電子郵件地址計數,SELECT 子句看起來可能像這樣:
SELECT COUNT([E-mail Address]), Company
您可以使用的彙總函數取決於所要使用欄位或運算式中的資料類型。 如需有關可用彙總函數的詳細資訊,請參閱 SQL 彙總函數一文。
指定不在彙總函數中使用的欄位:GROUP BY 子句
當您使用彙總函數時,通常也必須建立 GROUP BY 子句。 GROUP BY 子句會列出您不要套用彙總函數的所有欄位。 當您將彙總函數套用到查詢中的所有欄位時,則不需要建立 GROUP BY 子句。
GROUP BY 子句的後面會立即接著 WHERE 子句,或 FROM 子句 (如果沒有 WHERE 子句)。 GROUP BY 子句會列出欄位,就如同顯示在 SELECT 子句中的欄位一般。
例如,延續上一個範例,如果 SELECT 子句將彙總函數套用到 [E-mail Address],但不套用到 Company,則 GROUP BY 子句看起來會像這樣:
GROUP BY Company
如需有關 GROUP BY 子句的詳細資訊,請參閱 GROUP BY 子句主題。
使用群組準則限制彙總值:HAVING 子句
若要使用準則來限制結果,但您已在彙總函數中使用要套用準則的欄位,便無法使用 WHERE 子句。 您可以改成使用 HAVING 子句。 HAVING 子句的運作方式就像 WHERE 子句一樣,但是用於彙總資料。
例如,假設您使用 AVG 函數 (計算平均值) 搭配 SELECT 子句中的第一個欄位:
SELECT COUNT([E-mail Address]), Company
若要讓查詢根據該 COUNT 函數的值來限制結果,您無法將準則用於 WHERE 子句中的該欄位。 相反地,您在 HAVING 子句中使用該準則。 例如,如果您只要讓查詢在有一個以上的電子郵件地址與公司關聯時傳回資料列,則 HAVING 子句看起來可能像這樣:
HAVING COUNT([E-mail Address])>1
附註: 查詢可以有 WHERE 子句和 HAVING 子句;未在彙總函數中使用的欄位準則會進入 WHERE 子句,而搭配彙總函數使用的欄位準則會進入 HAVING 子句。
如需有關 HAVING 子句的詳細資訊,請參閱 HAVING 子句主題。
合併查詢結果:UNION
若要同時檢閱多個類似選取查詢傳回的所有資料,如同一個合併的集合,可以使用 UNION 運算子。
UNION 運算子可讓您將兩個 SELECT 陳述式合併為一。 合併的 SELECT 陳述式必須擁有相同數目的輸出欄位,其順序必須相同,而且其資料類型也必須相同或相容。 當您執行查詢時,每一組相對應欄位的資料都會合併到一個輸出欄位,因此查詢輸出的欄位數目等於每一個 SELECT 陳述式的欄位數目。
附註: 在進行聯集查詢時,數字和文字資料類型是相容的。
當您使用 UNION 運算子時,也可以使用 ALL 關鍵字,指定查詢結果是否應包含重複的資料列 (如果有的話)。
將兩個 SELECT 陳述式合併之聯集查詢的基本 SQL 語法如下:
SELECT field_1
FROM table_1 UNION [ALL] SELECT field_a FROM table_a ;
例如,假設您有一個名為「產品」的數據表,以及另一個名為「服務」的數據表。 兩個數據表都有包含產品或服務名稱、價格、保固或保證可用性的欄位,以及您是否只提供產品或服務。 雖然 [產品] 數據表會儲存保固資訊,而 [服務] 數據表則會儲存保證資訊,但基本資訊 (特定產品或服務是否包含品質) 的承諾相同。 您可以使用聯合查詢,例如下列,合併兩個資料表中的四個字段:
SELECT name, price, warranty_available, exclusive_offer
FROM Products UNION ALL SELECT name, price, guarantee_available, exclusive_offer FROM Services ;
如需有關如何使用 UNION 運算子合併 SELECT 陳述式的詳細資訊,請參閱使用聯集查詢合併多個選取查詢的結果。