Access SQL 簡介

重要:  本文係由機器翻譯而成,請參閱免責聲明。本文的英文版本請見這裡,以供參考。

當您想要從資料庫中擷取資料時,您要求的資料使用結構化查詢語言或 SQL。SQL 是非常類似的資料庫程式瞭解英文電腦語言。瞭解 SQL 是很重要,因為 Microsoft Access 中的每個查詢使用 SQL。了解 SQL 的運作方式可協助建立更好的查詢,,並讓您更輕鬆修正查詢時不會傳回您想要的結果。

附註: 您無法編輯 SQL web 查詢的使用。

本文內容

什麼是 SQL?

基本的 SQL 子句︰ 選取、 FROM 和位置

排序結果︰ 依順序

使用 [合併彙算資料︰ 群組依據] 及 [HAVING

結合查詢結果︰ 聯集

深入瞭解 SELECT 子句

深入瞭解 FROM 子句

深入瞭解 WHERE 子句

什麼是 SQL?

SQL 是電腦語言使用的結合事實和之間的關係。關聯式資料庫的程式,例如存取,請使用 SQL 來處理資料。許多電腦語言,例如 SQL 是國際標準識別的 ISO 等 ANSI 標準內文。

您可以使用 SQL 來描述資料集,以協助回答問題。使用 SQL 時,您必須使用正確語法。語法是讓語言元素正確結合的一組規則。SQL 語法是以英文語法為基礎,並使用許多和 Visual Basic for Applications (VBA) 語法相同的元素。

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

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 詞彙

對等的句子元素

定義

範例

識別碼

名詞

您用來識別資料庫物件的名稱,例如欄位的名稱。

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 陳述式的必要元素。

您可以完成的 SQL 可讓您使用進行的動作選取、 FROM 和 WHERE 子句。瞭解詳細資訊 您可以使用這些子句本文結尾的這些區段所示︰

深入瞭解 SELECT 子句

深入瞭解 FROM 子句

深入瞭解 WHERE 子句

排序結果: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

有時候您可能需要處理彙總資料,例如月銷售總額,或庫存中最貴的項目。若要處理彙總資料,您要套用彙總函數至 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 陳述式的詳細資訊,請參閱合併數個選取查詢使用聯集查詢的結果

頁面頂端

深入瞭解 SELECT 子句

在 SELECT 陳述式中 SELECT 子句會列出包含資料的欄位 您要使用。

使用方括號括住識別項

您可以使用方括號括住 SELECT 子句的欄位名稱。如果名稱不包含任何空格或特殊字元 (例如標點符號),方括號是選擇性的。如果名稱包含空格或特殊字元,則必須使用括弧括住。

提示: 名稱包含空格是更易於閱讀,可節省時間當您設計表單和報表,但可能會讓您撰寫 SQL 陳述式時,請輸入更多。當您在資料庫中命名物件時,您應該考慮這項事實。

如果 SQL 陳述式含有兩個以上具有相同名稱的欄位,您必須將每一個欄位的資料來源名稱新增至 SELECT 子句中的欄位名稱。您使用的資料來源名稱和您在 FROM 子句中使用的名稱相同。

選取所有欄位

如果想要納入資料來源的所有欄位,您可以在 SELECT 子句中個別列出所有欄位,或者使用星號萬用字元 (*)。使用星號時,Access 會在查詢執行時判斷資料來源含有哪些欄位,並在查詢中包含所有這些欄位。這樣可確保萬一資料來源包含新欄位時,查詢可以維持在最新狀態。

您可以在 SQL 陳述式中搭配一個或多個資料來源使用星號。如果您使用星號,而且有多個資料來源,您必須一起加入資料來源名稱與星號,這樣 Access 才可以判斷要納入哪一個資料來源的所有欄位。

舉例來說,假設您要選取 Orders 資料表的所有欄位,但只要選取 Contacts 資料表的電子郵件地址欄位,則 SELECT 子句可能像下面這樣:

SELECT Orders.*, Contacts.[E-mail Address]

附註: 使用星號時請留意,如果後來資料來源加入新的欄位,而您並不想在查詢中納入新欄位,您可能會得到非預期中的查詢結果。

僅選取一筆重複資料

如果您知道陳述式會選取重複的資料,而您只想要顯示一筆重複資料,此時可以在 SELECT 子句中使用 DISTINCT 關鍵字。舉例來說,假設每一個客戶都代表數個不同的興趣,而他們有些使用相同的電話號碼。如果您想要確保每一筆電話號碼僅顯示一次,SELECT 子句看起來會像下面這樣:

SELECT DISTINCT [txtCustomerPhone]

使用欄位或運算式的替代名稱:AS 關鍵字

您可以在 SELECT 子句中使用 AS 關鍵字以及欄位別名,來變更資料工作表檢視中為任何欄位所顯示的標籤。欄位別名是您在查詢中指定給欄位的名稱,好讓結果更容易閱讀。例如,如果您想要選取名為 txtCustPhone 的欄位中的資料,該欄位含有客戶電話號碼,您可以在 SELECT 陳述式中使用欄位別名,以增進結果的易讀性,如下所示:

SELECT [txtCustPhone] AS [Customer Phone]

附註: 在 SELECT 子句中使用運算式時,您必須使用欄位別名。

使用運算式進行選取

有時候,您想要查看您的資料,以計算或擷取的欄位的資料的組件。例如,假設您想要傳回年份的客戶的出生,根據您的資料庫中的 [出生日期] 欄位中的資料。SELECT 子句可能 如下所示︰

SELECT DatePart("yyyy",[BirthDate]) AS [Birth Year]

此運算式組成的DatePart函數及兩個引數,「 yyyy 」 (常數) 和 [BirthDate] (識別碼)。

如果提供單一輸入值給運算式,它會輸出單一值,您就可以使用任何有效的運算式做為欄位。

頁面頂端

深入瞭解 FROM 子句

在 SELECT 陳述式中,FROM 子句會指定含有 SELECT 子句所使用之資料的資料表或查詢。

假設您想要知道某特定客戶的電話號碼,而含有儲存此資料之欄位的資料表稱為 tblCustomer,則 FROM 子句可能像下面這樣:

FROM tblCustomer

使用方括號括住識別項

您可以使用方括弧括住名稱。如果名稱沒有包含任何空格或特殊字元 (例如標點符號),就不一定要使用方括弧。如果名稱包含空格或特殊字元,您就必須使用方括弧。

提示: 名稱包含空格是更易於閱讀,可節省時間當您設計表單和報表,但可能會讓您撰寫 SQL 陳述式時,請輸入更多。當您在資料庫中命名物件時,您應該考慮這項事實。

使用資料來源的替代名稱

若要在 FROM 子句中使用資料表別名參照 SELECT 陳述式中的資料來源,您可以使用不同的名稱。資料表別名是當您使用運算式作為資料來源,或讓您更容易閱讀 SQL 陳述式指定查詢中的資料來源的名稱。這可能是如果資料來源的名稱長或難輸入,尤其是當有來自不同資料表的名稱相同的多個欄位時,尤其有用。

例如,假設您要選取兩個都名為 ID 的欄位的資料,其中一個欄位來自資料表 tblCustomer,而另一個欄位來自資料表 tblOrder,則 SELECT 子句可能像下面這樣:

SELECT [tblCustomer].[ID], [tblOrder].[ID]

經由在 FROM 子句中使用資料表別名,您可以讓查詢更容易輸入。使用資料表別名的 FROM 子句可能像下面這樣:

FROM [tblCustomer] AS [C], [tblOrder] AS [O]

然後,您還可以在 SELECT 子句中使用這些資料表別名,如下所示:

SELECT [C].[ID], [O].[ID]

附註: 當您使用資料表別名時,您可以參考的資料來源 SQL 陳述式中使用別名或使用資料來源的完整名稱。

聯結相關資料

如果您需要將來自兩個資料來源的一對記錄結合成查詢結果中的單一筆記錄,可以執行聯結作業。聯結是一種 SQL 運算,它會指定兩個資料來源的關聯方式,以及指定如果其中一個來源沒有相對應的資料時,是否應該包含另一個來源的資料。

若要結合來自兩個資料來源的資訊,您要在共同的欄位上執行聯結運算。當此欄位中儲存的值符合時,記錄中的資料就會結合在結果中。

除了結合資料外,您也可以使用聯結來指定當關聯的資料表中沒有相對應的記錄時,是否要包含來自另一資料表的記錄。

例如,假設您想要在查詢中使用兩個資料表的資料︰ tblCustomer 和 tblOrder。兩個資料表兩個有欄位,客戶編號、 識別 客戶。TblCustomer 資料表中的每一筆記錄可能會在 tblOrder 資料表中,有一或多個對應的記錄與對應的值由客戶編號] 欄位中的值。

如果您要聯結資料表,讓查詢結合來自兩個資料表的記錄,並在任一資料表沒有相對應的記錄時排除另一個資料表的記錄,則 FROM 子句可能像下面這樣 (這裡有換行是為了方便閱讀):

FROM [tblCustomer] INNER JOIN [tblOrder]
ON [tblCustomer].[CustomerID]=[tblOrder].[CustomerID]

在 Microsoft Office Access 中,聯結是發生於 SELECT 陳述式的 FROM 子句中。聯結類型有兩種:內部聯結和外部聯結。下一節將說明這兩種聯結。

內部聯結

內部聯結是最常見的聯結類型。執行內部聯結的查詢時,查詢結果中只會包含兩個聯結資料表中都存在共同值的記錄。

內部聯結的語法如下 (這裡有換行是為了方便閱讀):

FROM table1 INNER JOIN table2
ON table1.field1 compopr table2.field2

下表說明 INNER JOIN 運算的各個部分。

部分

描述

table1 2

要合併其中記錄的資料表名稱

「 欄位 1 」 field2

聯結的欄位名稱。如果欄位內容不是數值,則欄位的資料類型必須相同,且包含相同類型的資料,但是欄位名稱不必相同。

compopr

任何關聯式比較運算子:"="、"<"、">"、"<="、">=" 或 "<>"。

外部聯結

外部聯結類似於內部聯結,因為它們也是告訴查詢要如何結合來自兩個來源的資訊。主要的不同在於外部聯結還會指定不存在共同值時是否要包含資料。外部聯結是有方向性的:您可以指定是要包含聯結中所指定的第一個資料來源的所有記錄 (稱為左端聯結),或者要包含聯結中所指定的第二個資料來源的所有記錄 (稱為右端聯結)。

外部聯結的語法如下:

table1 [向左 |向右] 加入table2
table1.field1compopr table2.field2

下表將說明 LEFT JOIN 和 RIGHT JOIN 運算的各個部分。

部分

描述

table1 2

要合併其中記錄的資料表名稱

「 欄位 1 」 field2

聯結的欄位名稱。欄位必定是相同資料類型並含有同一種資料,但名稱並不一定相同。

compopr

任一關聯比較運算子:"="、"<"、">"、"<="、">=" 或 "<>"

如需連接的詳細資訊,請參閱連接資料表與查詢的文件。

頁面頂端

深入瞭解 WHERE 子句

當您想要使用資料來限制查詢所傳回的記錄數目時,您可以使用查詢準則 WHERE 子句的 SELECT 陳述式中。查詢準則會類似於公式,則可能包含的欄位參照、 運算子和常數的字串。查詢準則是一種運算式。

下表將示範一些準則範例,並說明它們的運作方式。

準則

說明

>25 and <50

此條件會套用至數字] 欄位,例如價格或庫存量。其包含位置] 欄位的內容大於 25 和 50 以下的值的記錄。

DateDiff ("yyyy", [BirthDate], Date()) > 30

這個準則適用於日期/時間欄位,例如生日。只有當介於某人生日和今天日期之間的年份數字大於 30 時,才會在查詢結果中納入這些記錄。

Is Null

這個準則可用於任何類型的欄位,以顯示欄位值為 Null 的記錄。

如上表所示範,視套用準則之欄位的資料類型以及您的特定需求而定,準則看起來的樣子可以差很多。有些準則很簡單,只使用基本的運算子和常數。有些則很複雜,使用函數以及特殊運算子,並包含欄位參照。

重要: 如果欄位使用彙總函數,您無法在 WHERE 子句中指定該欄位的準則。不過,您可以使用 HAVING 子句指定彙總欄位的準則。如需詳細資訊,請參閱節使用 [合併彙算資料︰ 群組依據] 及 [HAVING

WHERE 子句語法

WHERE 子句的基本語法如下:

WHERE field = criterion

舉例來說,假設您想要知道某個客戶的電話號碼,但您只記得那個客戶的姓是 Bagel。您不需翻看資料庫中的所有電話號碼,只需使用 WHERE 子句來限制結果,就可以很容易的找到您要的電話號碼。假設姓氏是儲存在 LastName 這個欄位中,則 WHERE 子句看起來會像下面這樣:

WHERE [LastName]='Bagel'

附註: 您沒有等值值的自由 WHERE 子句中的準則。您可以使用其他的比較運算子,例如 (>) 大於或小於 (<)。例如,位置 [價格] > 100

使用 WHERE 子句結合資料來源

有時候您可能會想要依據具有相符資料,但資料類型不同的欄位來結合資料來源。例如,一個資料表中的欄位資料類型是「數字」,而您想要將這個欄位與另一個資料表中,資料類型為「文字」的欄位進行比較。

您無法在不同資料類型的欄位之間建立聯結。若要依據不同資料類型之欄位中的值來結合兩個資料來源的資料,您要建立 WHERE 子句,經由使用 LIKE 關鍵字,利用其中一個欄位做為另一個欄位的準則。

舉例來說,假設您想要使用來自 table1 和 table2 的資料,但只有當 field1 (table1 中的文字欄位) 中的資料符合 field2 (table2 中的數字欄位) 中的資料時才要使用,則 WHERE 子句看起來會像下面這樣:

WHERE field1 LIKE field2

如需有關如何建立要在 WHERE 子句中使用準則的詳細資訊,請參閱查詢準則的範例

頁面頂端

附註: 機器翻譯免責聲明︰本文係以電腦系統翻譯而成,未經人為介入。Microsoft 提供此等機器翻譯旨在協助非英語系使用者輕鬆閱讀 Microsoft 產品、服務及技術相關內容。基於本文乃由機器翻譯而成,因此文中可能出現詞辭、語法、文法上之錯誤。

擴展您的技能
探索訓練
優先取得新功能
加入 Office 測試人員

這項資訊有幫助嗎?

感謝您的意見反應!

感謝您的意見反應! 我們將協助您與其中一位 Office 支援專員連絡以深入了解您的意見。

×