Access SQL 简介

重要:  本文是由机器翻译的,请参阅免责声明。请在 此处 中查找本文的英文版本以便参考。

当您想要从数据库中检索数据时,您通过使用结构化查询语言或 SQL 请求数据。SQL 是与数据库程序了解的英语相似的计算机语言。明确 SQL 非常重要,因为 Microsoft Access 中的每个查询使用 SQL。了解 SQL 的工作方式可以帮助创建更好的查询,并可以更加轻松地修复时未返回结果所需的查询。

注意: 不可编辑 Web 查询的 SQL。

本文内容

什么是 SQL?

基本 SQL 子句︰ 选择、 FROM 和位置

对结果进行排序︰ 按顺序

使用汇总数据: 分组依据和 HAVING

合并查询结果︰ 联合

有关 SELECT 子句的详细信息

有关 FROM 子句的详细信息

有关 WHERE 子句的详细信息

什么是 SQL?

SQL 是用于处理集事实和它们之间的关系的计算机语言。关系数据库程序,例如访问,请使用 SQL 处理数据。许多计算机语言,如 SQL 是由如 ISO 和 ANSI 标准机构识别国际标准。

使用 SQL 可以帮助您回答的问题的数据集的描述。使用 SQL 时,您必须使用正确的语法。语法不正确组合依据的一种语言的元素的规则集。基于英语语法,并使用许多相同的元素作为 Visual Basic for Applications (VBA) 语法的 SQL 语法。

例如,一个简单的 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 中的示例

下面的内容演示了在 Access 中用于简单选择查询的 SQL 语句的外观:

显示 SELECT 语句的 SQL 对象选项卡

1. SELECT 子句

2. FROM 子句

3. WHERE 子句

此示例 SQL 语句可以读作“选择存储在名为‘联系人’的表内名为‘电子邮件地址’和‘公司’的字段中的数据,特别是‘城市’字段的值为‘西安’的记录。”

我们来看一下该示例,一次看一个子句,以便了解 SQL 语法如何工作。

SELECT 子句

SELECT [E-mail Address], Company

这是 SELECT 子句。它由一个运算符 (SELECT) 及后面的两个标识符([电子邮件地址] 和“公司”)组成。

如果标识符中包含空格或特殊字符(如“电子邮件地址”),则必须用方括号将它括起来。

SELECT 子句不必指出包含字段的表,并且它无法指定要包括的数据必须满足的任何条件。

在 SELECT 语句中,SELECT 子句始终出现在 FROM 子句的前面。

FROM 子句

FROM Contacts

这是 FROM 子句。它由一个运算符 (FROM) 及后面的标识符(联系人)组成。

FROM 子句不会列出要选择的字段。

WHERE 子句

WHERE City="Seattle"

这是 WHERE 子句。它由一个运算符 (WHERE) 及后面的表达式(城市="西安") 组成。

注意: 与 SELECT 和 FROM 子句不同,WHERE 子句不是 SELECT 语句的必需元素。

您可以完成许多 SQL 使您能够使用执行的操作选择、 FROM 和 WHERE 子句。有关如何详细信息 使用这些子句也会出现在本文末尾的这些部分︰

有关 SELECT 子句的详细信息

有关 FROM 子句的详细信息

有关 WHERE 子句的详细信息

对结果排序:ORDER BY

与 Microsoft Office Excel 一样,Access 允许您对数据表中的查询结果排序。还可以使用 ORDER BY 子句在查询中指定当查询运行时您所希望的结果排序方式。如果使用 ORDER BY 子句,则该子句是 SQL 语句中的最后一个子句。

ORDER BY 子句包含要用于排序的字段的列表,字段的顺序与要应用的排序操作中的顺序相同。

例如,假定您希望首先按照“公司”字段的值以降序对结果排序,并且如果存在值与“公司”的值相同的记录,再按照“电子邮件地址”字段中的值以升序排序。您的 ORDER BY 子句将类似于以下内容:

ORDER BY Company DESC, [E-mail Address]

注意: 默认情况下,Access 会按照升序(A-Z,从最小到最大)对值排序。而使用 DESC 关键字可以按照降序对值排序。

有关 ORDER BY 子句的详细信息,请参阅顺序 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 子句向 [电子邮件地址] 而未向“公司”应用聚合函数,则 GROUP BY 子句将类似于以下内容:

GROUP BY Company

有关 GROUP BY 子句的详细信息,请参阅组 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 子句的详细信息,请参阅遇到子句的主题。

返回页首

合并查询结果: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
;

有关如何使用联合运算符组合的 SELECT 语句的详细信息,请参阅文章合并多个选择查询使用联合查询的结果

返回页首

有关 SELECT 子句的详细信息

SELECT 语句中,在 SELECT 子句中列出包含数据的字段 要使用。

使用方括号将标识符括起来

在 SELECT 子句中,可以使用方括号字段名称括起来。如果名称中没有包含任何空格或特殊字符(如标点符号),则方括号是可选的。如果名称中确实包含空格或特殊字符,则必须使用方括号。

提示: 包含空格的名称就越容易阅读和可以节省时间时设计窗体和报表,但可能会使你编写的 SQL 语句时键入的详细信息。在数据库中命名对象时,应考虑这种情况。

如果 SQL 语句中有两个或更多个同名字段,则必须将每个字段的数据源名称添加到 SELECT 子句内的字段名称中。用于数据源的名称与您在 FROM 子句中使用的名称相同。

选择所有字段

在您想要包括数据源中的所有字段时,可以在 SELECT 子句中逐一列出所有字段,也可以使用星号通配符 (*)。使用星号时,Access 会在查询运行时确定数据源中包含哪些字段,并在查询中包括所有这些字段。这有助于确保在向数据源添加新字段时查询始终都是最新的。

可以在 SQL 语句中将星号用于一个或多个数据源。如果使用星号并且有多个数据源,则必须将数据源名称与星号一同包括,以便 Access 可以确定要包括哪个数据源中的所有字段。

例如,假定您要在 Orders 表中选择所有字段但在联系人表中仅选择电子邮件地址, 则 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"(常量) [出生日期] (标识符)。

可以使用任何一个有效表达式作为字段,条件是在给定单个输入值时该表达式输出单个值。

返回页首

有关 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。两个表两个具有字段,客户 id,用于标识 客户。TblCustomer 表中的每个记录可能有对应的一个或多个记录的 tblOrder 表中,并通过客户 id 字段中的值,可以确定相应的值。

如果想要联接表以使查询合并表中的记录并在一个表中没有对应记录时排除任何一个表中的记录,则 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 table2

对其中的记录进行组合的表的名称。

field1field2

联接的字段的名称。如果它们不是数值,则字段必须属于相同的数据类型,并且包含相同种类的数据,但它们不必有相同的名称。

compopr

任何关系比较运算符:“=”、“<”、“>”、“<=”、“>=”或“<>”。

外部联接

外部联接与内部联接类似,因为它们都指示查询如何去合并两个源中的信息。它们又是不同的,因为它们还指定不存在公共值时是否包括数据。外部联接具有方向性:可以指定是包括在联接中指定的第一个数据源中的所有记录(称为左联接),还是包括联接中第二个数据源中的所有记录(称为右联接)。

外部联接的语法如下:

通过在table1中 [左 |右] 加入table2
table1.field1compopr table2.field2

下表介绍 LEFT JOIN 和 RIGHT JOIN 操作的不同部分。

部分

描述

table1 table2

对其中的记录进行组合的表的名称。

field1field2

被联接的字段的名称。字段必须为相同数据类型并且包含相同类型的数据,但不必具有相同名称。

compopr

任何关系比较运算符:“=”、“<”、“>”、“<=”、“>=”或“<>”。

有关连接的详细信息,请参阅文章联接表和查询

返回页首

有关 WHERE 子句的详细信息

当您想要使用的数据的查询中返回的记录数限制时,您将使用查询条件 WHERE 子句的 SELECT 语句中。查询条件是类似于公式,它是字段引用、 运算符和常量可能包含字符串。查询条件是一种表达式。

下表显示了一些示例条件并介绍了它们的工作原理。

条件

说明

>25 and <50

此条件适用于数字字段,如“Price”或“UnitsInStock”。该条件只包括其字段中的值大于 25 并且小于 50 的那些记录。

DateDiff ("yyyy", [出生日期], Date()) > 30

此条件适用于日期/时间字段,如“出生日期”。查询结果中只包括人员出生日期与当前日期之间的年数大于 30 的记录。

Is Null

此条件可应用于任何类型的字段,以显示字段值为空的记录。

如上表所示,条件相互之间看上去可能会存在很大的差异,具体取决于条件要应用到的字段的数据类型以及您的具体要求。一些条件较为简单,它们使用基本运算符和常量。其他条件则较为复杂,它们使用函数和特殊运算符并且包含字段引用。

重要: 如果域聚合函数一起使用,则无法在 WHERE 子句中指定该字段的条件。相反,您可以使用 HAVING 子句指定聚合字段的条件。有关详细信息,请参阅部分处理汇总数据: 分组依据和 HAVING

WHERE 子句的语法

WHERE 子句的基本语法如下:

WHERE field = criterion

例如,假定您需要某个客户的电话号码,但您只记得该客户的姓氏是黎。您可以使用 WHERE 子句限制结果并使得查找所需的电话号码更为容易,而不是查看数据库中的所有电话号码。假定姓氏存储在名为 LastName 的字段中,则 WHERE 子句如下所示:

WHERE [LastName]='Bagel'

注意: 不需要基于的值等同性 WHERE 子句中的条件。您可以使用其他比较运算符,如 (>) 大于或小于 (<)。例如,其中 [价格] > 100

使用 WHERE 子句合并数据源

有时您可能希望基于具有匹配数据但数据类型不同的字段来合并数据源。例如,一个表中的某个字段的数据类型可能是“数字”,而您希望将该字段与另一个表中数据类型是“文本”的字段进行比较。

无法在具有不同数据类型的字段之间创建联接。要基于具有不同数据类型的字段中的值合并两个数据源中的数据,可以通过使用 LIKE 关键字创建将一个字段用作另一个字段的条件的 WHERE 子句。

例如,假定您要使用 table1 和 table2 中的数据,但是仅当 field1(table1 中一个文本字段)中的数据与 field2(table2 中的一个数字字段)中的数据匹配时您才会这样做。您的 WHERE 子句会类似于以下内容:

WHERE field1 LIKE field2

有关如何创建要在 WHERE 子句中使用条件的详细信息,请参阅查询条件示例一文。

返回页首

注意: 机器翻译免责声明:本文是由无人工介入的计算机系统翻译的。Microsoft 提供机器翻译是为了帮助非英语国家/地区用户方便阅读有关 Microsoft 产品、服务和技术的内容。由于机器翻译的原因,本文可能包含词汇、语法或文法方面的错误。

扩展你的 Office 技能
了解培训
抢先获得新功能
加入 Office 预览体验计划

此信息是否有帮助?

谢谢您的反馈!

谢谢你的反馈! 可能需要转接到 Office 支持专员。

×