Access SQL:基本概念、詞彙和語法

當您想要從資料庫擷取資料時,需要使用結構化查詢語言 (或稱 SQL) 來擷取資料。SQL 是一種資料庫程式看得懂的、很類似英文的電腦語言。您執行的每一個查詢,都是在背景使用 SQL。

瞭解 SQL 的運作方式可以協助您建立更好的查詢,讓您更容易瞭解如何修正無法傳回所要結果的查詢。

這是一系列有關 Access SQL 文章的其中一篇。本文將說明 SQL 選取資料的基本用法,並使用範例解說 SQL 語法。

本文內容


什麼是 SQL?

SQL 是一種用來處理事實集以及其關係的電腦語言。關聯式資料庫程式 (例如 Microsoft Office Access) 是使用 SQL 來處理資料。SQL 和許多電腦語言不同,它容易閱讀及理解,即使初學者也容易上手。和許多電腦語言相同的是,SQL 是一種國際標準,由像是 ISO (英文)ANSI (英文) 這種標準機構所認可。

“SQL 不難閱讀及理解,即使初學者也容易上手。”

您可以使用 SQL 來描述資料集,以協助回答問題。使用 SQL 時,您必須使用正確語法。語法是讓語言元素正確結合的一組規則。SQL 語法是以英文語法為基礎,並使用許多和 Visual Basic for Applications (VBA) (Visual Basic for Applications (VBA):Microsoft Visual Basic 的巨集語言版本,可用來撰寫 Microsoft Windows 應用程式,並已內建於數種 Microsoft 程式中。) 語法相同的元素。

例如,若要擷取名字為 Mary 之連絡人的姓氏清單,其簡單的 SQL 陳述式可能會像這樣:

SELECT Last_Name
FROM Contacts
WHERE First_Name = 'Mary';

 附註   SQL 不只是用於處理資料,也用於建立及變更資料庫物件 (例如資料表) 的設計。用於建立及變更資料庫物件的這部分 SQL 稱為資料定義語言 (Data Definition Language,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 詞彙 對等的句子元素 定義 範例
識別碼 名詞 您用來識別資料庫物件的名稱,例如欄位的名稱。 Customers.[Phone Number]
運算子 動詞或副詞 代表某個動作或修飾某個動作的關鍵字。 AS
常數 名詞 一個不會變更的值,例如數字或 NULL。 42
表示式 形容詞 識別項、運算子、常數和函數的組合,會運算出單一值。 >= Products.[Unit Price]

頁首 頁首

基本的 SQL 子句:SELECT、FROM 和 WHERE

SQL 陳述式具有下列一般形式:

SELECT field_1
FROM table_1
WHERE criterion_1
;

 附註 

  • Access 會忽略 SQL 陳述式中的分行符號。不過,請考慮使用每一個子句一行的格式,以提高 SQL 陳述式的可讀性。
  • 每一個 SELECT 陳述式都要以分號 (;) 做結尾。分號可以出現在最後一個子句的結尾,或自己一行出現在 SQL 陳述式的結尾。

Access 中的範例

下面將示範 Access 中一個簡單選取查詢的 SQL 陳述式的可能形式:

顯示 SELECT 陳述式的 SQL 物件索引標籤

圖說文字 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") 所組成。

 附註   和 SELECT 及 FROM 子句不同的是,WHERE 子句不是 SELECT 陳述式的必要元素。

您可以使用 SELECT、FROM 和 WHERE 子句完成 SQL 可讓您執行的許多動作。下列這些文章中會提供有關如何使用這些子句的詳細資訊:

頁首 頁首

排序結果:ORDER BY

和 Microsoft Office 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

有時候您可能需要處理彙總資料,例如月銷售總額,或庫存中最貴的項目。若要處理彙總資料,您要套用彙總函數 (彙總函數:您用於計算合計的函數,如 Sum、Count、Avg 或 Var。)至 SELECT 子句中的欄位。例如,如果您要讓查詢顯示所列出之每一家公司電子郵件地址的計數,則 SELECT 子句看起來可能會像下面這樣:

SELECT COUNT([E-mail Address]), Company

您可以使用的總合函數是取決於欄位中的資料類型,或取決於您要使用的運算式。如需有關可用之總合函數的詳細資訊,請參閱 SQL 彙總函數這篇文章。

指定彙總函數中不使用的欄位:GROUP BY 子句

使用彙總函數時,通常還必須建立 GROUP BY 子句。GROUP BY 子句會列出您沒有套用彙總函數的所有欄位。如果您將彙總函數套用至查詢中的所有欄位,就不需要建立 GROUP BY 子句。

GROUP BY 子句要緊接在 WHERE 子句之後,如果沒有 WHERE 子句,GROUP BY 子句就要緊接在 FROM 子句之後。GROUP BY 子句會以欄位出現在 SELECT 子句中的方式來列出欄位。

例如,接續先前的例子,如果 SELECT 子句將彙總函數套用至 [E-mail Address],但沒有套用至 Company,則 GROUP BY 子句看起來可能會像下面這樣:

GROUP BY Company

如需有關 GROUP BY 子句的詳細資訊,請參閱 GROUP BY 子句這篇文章。

使用群組準則限制彙總值:HAVING 子句

如果您想要使用準則限制結果,但想要套用準則的欄位用於彙總函數中,您無法使用 WHERE 子句。此時,可以使用 HAVING 子句。HAVING 子句的作用如同 WHERE 子句,但可用於彙總資料。

例如,假設您在 SELECT 子句中的第一個欄位使用 COUNT 函數:

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 陳述式相同。

 附註   在進行聯集查詢時,Number 和 Text 資料類型是相容的。

當您使用 UNION 運算子時,如果存在重複的資料列,也可以使用 ALL 關鍵字指定查詢結果是否要包含重複的資料列。

合併兩個 SELECT 陳述式之聯集查詢的基本 SQL 語法如下:

SELECT field_1
FROM table_1
UNION [ALL]
SELECT field_a
FROM table_a
;

例如,假設您有一個資料表名為 Products,另一個資料表名為 Services;兩個資料表都有包含產品或服務名稱 (Name)、價格 (Price)、保固 (Warranty) 或保證 (Guarantee) 內容及該產品或服務是否為獨家提供 (Exclusive) 的欄位。在 Products 資料表中儲存保固資訊,在 Services 資料表中則儲存保證資訊,兩者包含的是相同的基本資訊 (也就是某產品或服務是否提供品質保證)。您可以使用聯集查詢來合併這兩個資料表中的四個欄位,如下所示:

SELECT name, price, warranty_available, exclusive_offer
FROM Products
UNION ALL
SELECT name, price, guarantee_available, exclusive_offer
FROM Services
;

如需有關如何使用 UNION 運算子合併 SELECT 陳述式的詳細資訊,請參閱使用聯集查詢合併數個選取查詢的結果

頁首 頁首

 
 
適用:
Access 2007