对于多个相似的选择查询,当您希望将它们返回的所有数据一起作为一个合并的集合查看时,便可以使用联合查询。
本文将向您介绍如何根据两个或多个现有的选择查询创建联合查询,同时说明如何使用结构化查询语言 (SQL) 编写联合查询。
为完成本文中的示例,您应该对如何创建和运行选择查询有基本的了解。有关如何创建选择查询的详细信息,请参阅请参阅部分中的链接。
本文内容
联合查询基础知识
联合查询有哪些功能?
联合查询可合并多个相似的选择查询的结果集。
例如,假设您有两个表,一个用于存储有关客户的信息,另一个用于存储有关供应商的信息,并且这两个表之间不存在任何关系。又假设这两个表都有一些存储联系人信息的字段,而您希望同时查看这两个表中的所有联系人信息。
您可以为每个表都创建一个选择查询 (选择查询:就表中存储的数据提出问题,然后在不更改数据的情况下以数据表的形式返回一个结果集。),以便只检索包含联系人信息的那些字段,但返回的信息仍将位于两个单独的位置。要将两个或多个选择查询的结果合并到一个结果集中,可以使用联合查询。
联合查询的要求
联合查询中合并的选择查询必须具有相同的输出字段数、采用相同的顺序并包含相同或兼容的数据类型。在运行联合查询时,来自每组相应字段中的数据将合并到一个输出字段中,这样查询输出所包含的字段数将与每个 Select 语句相同。
注释 根据联合查询的目的,“数字”和“文本”数据类型兼容。
联合查询是特定于 SQL 的。特定于 SQL 的查询不能在“设计”视图中显示,因此必须直接用 SQL 编写。在 Microsoft Office Access 2007 中,您可以使用“SQL 视图”对象选项卡编写特定于 SQL 的查询,包括联合查询。
提示 每个查询都可以用 SQL 语句来表达。此外,大多数查询也可以在查询设计网格 (设计网格:在查询设计视图或“高级筛选/排序”窗口中设计查询或筛选时所用的网格。对于查询,该网格以前称为“QBE 网格”。)中表达,如果此环境可用,构建查询将更加轻松。在使用设计网格创建查询时,您始终都可以切换到 SQL 视图,以查看运行查询时所处理的 SQL 语句。在 SQL 视图中查看查询是一种很好的做法,因为您可以通过此途径熟悉 SQL 并加深对查询工作方式的理解。在某些情况下,您还可以使用 SQL 视图对未返回预期结果的查询进行故障排除。
联合查询的 SQL 语法
在联合查询中,每个选择查询(又称为 Select 语句)都有一个 SELECT 子句和 FROM 子句,还可能有 WHERE 子句。SELECT 子句列出包含要检索的数据的字段;FROM 子句列出包含这些字段的表;WHERE 子句则列出这些字段的条件。联合查询中的 Select 语句用 UNION 关键字组合在一起。
对于合并了两个选择查询的联合查询,其基本 SQL 语法如下:
SELECT field_1[, field_2,…] FROM table_1[, table_2,…] UNION [ALL] SELECT field_a[, field_b,...] FROM table_a[, table_b,…];
例如,假设您有两个表,分别名为 Products 和 Services。这两个表都具有包含下列内容的字段:产品或服务的名称、价格、保修或担保条款以及是否以独占方式提供产品或服务。虽然 Products 表存储了保修信息,而 Services 表存储了担保信息,但基本信息是相同的(即特定的产品或服务是否符合其质量承诺)。您可以使用联合查询将两个表中的这四个字段合并在一起,例如:
SELECT name, price, warranty_available, exclusive_offer FROM Products UNION ALL SELECT name, price, guarantee_available, exclusive_offer FROM Services;
让我们逐行检查上面的语法示例。
- SELECT name, price, warranty_available, exclusive_offer 这是一个 SELECT 子句,用于引入选择查询。SELECT 后面跟有一个标识符列表,用于指示要从中检索数据的字段。SELECT 子句必须始终至少列出一个字段。此 SELECT 子句列出了字段标识符 name、price、warranty_available 和 exclusive_offer。
- FROM Products 这是一个 FROM 子句。FROM 子句跟在 SELECT 子句之后,二者共同构成了一个基本的 Select 语句。FROM 后也跟有一个标识符列表,用于指示哪些表包含 SELECT 子句中列出的字段。FROM 子句必须始终至少列出一个表。此 FROM 子句列出了表标识符 Products。
- UNION ALL 这是一个 UNION 关键字以及一个可选的 ALL 关键字。UNION 指示将 UNION 前后的 SELECT 语句的结果合并在一起。
在使用 ALL 关键字时,Union 生成的合并集中并不删除重复行。这样,Access 便无需检查重复行的结果,从而可以显著提高查询的性能。如果满足下列任一条件,则应使用 ALL 关键字:
- 您确定选择查询不会生成任何重复行。
- 结果中是否存在重复行无关紧要。
- 您希望查看重复行。
在本示例中,我们使用 ALL 关键字是因为我们既不期望会返回重复行,也没有略去它们的必要。
- SELECT name, price, guarantee_available, exclusive_offer 这是第二个 SELECT 子句,用于引入联合查询中的第二个 SELECT 语句。在编写联合查询时,各个 SELECT 语句中的字段必须相互对应,这意味着各个 SELECT 语句必须具有相同的字段数,并且共享通用数据的字段必须以相同的顺序出现在子句中,同时这些字段必须具有相同或兼容的数据类型,如示例中所示。只有这些字段相互对应,才能在查询输出中将它们合并在一起。
注释 联合查询输出中的字段名称从第一个 SELECT 子句中提取。因此,在本示例的查询输出中,来自字段“warranty_available”和“guarantee_available”的数据将被命名为“warranty_available”。
- FROM Services 这是第二个 FROM 子句,用于完成联合查询中的第二个 SELECT 语句。与 SELECT 子句中的字段不同,联合查询对 FROM 子句没有表限制。您既可以创建在每个 FROM 子句中都使用相同的表的联合查询,也可以在 FROM 子句中使用不同数目的表。在我们的示例中,每个 FROM 子句都只有一个表。
创建联合查询
创建联合查询有两种基本方法:
- 先在查询“设计”视图 (设计视图:显示数据库对象(包括:表、查询、窗体、宏和数据访问页)的设计的窗口。在设计视图中,可以新建数据库对象和修改现有数据库对象的设计。)中创建各个组件选择查询,然后将这些查询合并为一个联合查询。
- 直接在 SQL 视图 (SQL 视图:用于显示当前查询的 SQL 语句或用于创建 SQL 特有查询(联合查询、传递查询或数据定义查询)的窗口。在设计视图中创建查询时,Access 会在 SQL 视图中构建 SQL 的等价查询。)中创建整个联合查询。
在大多数情况下,您都应该先创建选择查询,然后再将它们合并为一个联合查询。在 Office Access 2007 中,“设计”视图提供了一种易用的创建选择查询的图形用户界面,您可以复制这些查询的 SQL 语句并将它们粘贴到联合查询中。
但是,如果您认为编写 SQL 语句得心应手,或者希望获得更多的 SQL 编写体验,则可能更倾向于直接在 SQL 视图中创建联合查询。
先在“设计”视图中创建选择查询,然后合并它们
按照此方法,将先使用“设计”视图创建每个选择查询,然后使用 SQL 视图合并选择查询。
在“设计”视图中创建每个选择查询
- 在“创建”选项卡上的“其他”组中,单击“查询设计”。
- 在“显示表”对话框中,双击要包括的字段所在的表。
这会将该表添加到查询设计窗口。
注释 虽然您可以在选择查询中包括多个表或查询,但此过程假定每个选择查询只包括一个表中的数据。
- 关闭“显示表”对话框。
- 在查询设计窗口中,双击要包括的每个字段。
选择字段时,请确保您在其他选择查询中以相同顺序添加了相同数目的字段。另外,请注意各个字段的数据类型,确保在要合并的其他查询中,处于相应位置的字段具有兼容的数据类型。
例如,如果第一个选择查询具有五个字段,且第一个字段包含“日期/时间”数据,请确保要合并的其他每个选择查询也具有五个字段,并且第一个字段同样包含“日期/时间”数据,依此类推。
- 另外,您还可以在字段网格的“条件”行中键入适当的表达式 (表达式:算术或逻辑运算符、常数、函数和字段名称、控件和属性的任意组合,计算结果为单个值。表达式可执行计算、操作字符或测试数据。),以此向字段中添加条件。
- 在添加完字段和字段条件后,应运行选择查询并查看其输出。
- 将查询切换到“设计”视图。
- 保存该选择查询,但不要将其关闭。
- 对于要合并的每个选择查询,请重复此过程。
在 SQL 视图中合并选择查询
- 在“创建”选项卡上的“其他”组中,单击“查询设计”。
在“设计”视图中打开一个新查询。
- 关闭“显示表”对话框。
- 在“设计”选项卡上的“查询”组中,单击“联合”。
将隐藏查询设计窗口,并显示 SQL 视图对象选项卡。此时,SQL 视图对象选项卡中没有任何内容。
- 单击要合并在联合查询中的第一个选择查询的选项卡。
- 在“开始”选项卡上的“视图”组中,单击“视图”,然后单击“SQL 视图”。
将显示该选择查询的 SQL 语句。
- 复制该选择查询的 SQL 语句。
- 单击此过程在步骤 1 中开始创建的联合查询的选项卡。
- 将选择查询的 SQL 语句粘贴到联合查询的 SQL 视图对象选项卡中。
- 删除选择查询 SQL 语句末尾的分号 (;)。
- 按 Enter 将光标移到下一行,然后在新行中键入 UNION。
您也可以再在其后键入一个空格,跟着键入 ALL 关键字,然后再次按 Enter。
- 单击要合并到联合查询中的下一个选择查询的选项卡。
- 请重复此过程的步骤 5 到步骤 11,直至将选择查询的所有 SQL 语句都通过复制和粘贴的方式添加到联合查询的 SQL 视图窗口中。对于最后一个选择查询的 SQL 语句,请勿删除其分号或键入任何内容。
- 在“设计”选项卡上的“结果”组中,单击“运行”。
联合查询的结果将显示在“数据表”视图 (数据表视图:以行列格式显示来自表、窗体、查询、视图或存储过程的窗口。在数据表视图中,可以编辑字段、添加和删除数据,以及搜索数据。)中。
直接在 SQL 视图中创建联合查询
以下过程将引导您完成在 SQL 视图中创建基本联合查询的步骤。
- 在“创建”选项卡上的“其他”组中,单击“查询设计”。
在“设计”视图中打开一个新查询。
- 关闭“显示表”对话框。
- 在“设计”选项卡上的“查询”组中,单击“联合”。
将隐藏查询设计窗口,并显示 SQL 视图对象选项卡。此时,SQL 视图对象选项卡中没有任何内容。
- 在“SQL 视图”对象选项卡中,键入 SELECT,然后键入要包括在查询中的第一个或第一组表中的字段列表。请使用逗号将各个字段名称隔开。在键入完字段名称的列表后,请按 Enter。
- 键入 FROM,跟着键入包含上一个 SELECT 子句所列字段的表的名称,然后按 Enter。
- 要为其中某个表中的字段指定条件,请键入 WHERE,跟着键入字段名称、比较运算符(通常为等号 =)和条件。您还可以使用 AND 和 OR 关键字在 WHERE 子句的末尾添加其他条件。指定条件后,请按 Enter。
- 键入 UNION。如果您不希望查询在输出中删除重复行,请键入一个空格,跟着键入 ALL 关键字,然后按 Enter。
- 键入 SELECT,跟着键入要包括在查询中的下一个或下一组表中的字段列表。这些字段必须与第一个 SELECT 子句中包含的字段相对应且顺序相同。请使用逗号将各个字段名称隔开。在键入完字段名称后,请按 Enter。
- 键入 FROM,跟着键入要包括在查询中的下一个或下一组表的名称,然后按 Enter。
- 要为其中某个表中的字段指定条件,请键入 WHERE,跟着键入字段名称、比较运算符(通常为等号 =)和条件。您还可以使用 AND 关键字在 WHERE 子句的末尾添加其他条件。指定条件后,请按 Enter。
- 要在联合查询中包括其他 Select 语句,请重复步骤 7 到步骤 10。
- 请键入 ; 指示查询的末尾。
- 在“设计”选项卡上的“结果”组中,单击“运行”。
联合查询的结果将显示在“数据表”视图 (数据表视图:以行列格式显示来自表、窗体、查询、视图或存储过程的窗口。在数据表视图中,可以编辑字段、添加和删除数据,以及搜索数据。)中。
使用联合查询的提示
- 如果您希望能够辨别各个行分别来自哪个表,可以在每个 Select 语句中添加一个文本字符串并将其用作一个字段。例如,如果有两个 Select 语句,一个要检索 Products 表中的字段,另一个则要检索 Services 表中的字段,您可以在第一个语句的末尾将字符串“Product”添加为字段,而在第二个语句的末尾将“Service”添加为字段。此外,您还可以使用 AS 关键字向这些字符串分配字段别名(例如“type”),如下面的示例中所示:
SELECT field1, field2, ... "Product" AS type
SELECT field1, field2, ... "Service" AS type
该查询的输出将包括一个名为“type”的字段,其中会显示各个行是来自 Products 表,还是来自 Services 表。 - 每个 UNION 关键字将合并紧跟在它前面和后面的 SELECT 语句。如果您只在查询的部分 Union 关键字后使用了 ALL 关键字,则结果将包括由 UNION ALL 合并的 SELECT 语句对中的重复行,但不包括只用 UNION 而不用 ALL 关键字合并的 SELECT 语句中的重复行。
- 对于要合并在联合查询中的选择查询,虽然其字段的数目、数据类型和顺序都必须相对应,但如果出现不对应的情况,您也可以使用表达式(例如计算或子查询)让它们对应起来。例如,您可以让两个字符的年字段与四个字符的年字段匹配,方法是使用 Right 函数提取四个字符的年的后两位数字。
- 如果要使用某个联合查询的输出创建一个新表,可以将该联合查询用作一个新选择查询的输入,然后再将该选择查询用作生成表查询 (生成表查询:一种查询(SQL 语句),它创建一个新表,然后通过从一个现有表中复制记录,在新表中创建记录(行)。)的基础:
- 创建并保存该联合查询。
- 在“创建”选项卡上的“其他”组中,单击“查询设计”。
- 在“显示表”对话框中,单击“查询”选项卡。
- 双击该联合查询,然后关闭“显示表”对话框。
注释 如果消息栏中显示了安全警告,则说明可能禁用了生成表查询等动作查询。要允许动作查询运行,请单击消息栏上的“选项”,然后在“Microsoft Office 安全选项”中单击“启用此内容”。
- 在查询设计网格中,双击联合查询对象选项卡上的星号 (*),以使用联合查询的所有字段创建新表。
-或-
双击要在新表中使用的每个字段。
- 在“设计”选项卡上的“查询类型”组中,单击“生成表”。
- 在“生成表”对话框中,为新表键入一个名称。您还可以指定另一个数据库来创建新表。完成后请单击“确定”。
- 在“设计”选项卡上的“结果”组中,单击“运行”。
- 您可以使用联合查询执行完全外部联接 (外部联接:在这种联接中,两个表中的每条匹配记录都在查询结果中合并为一条记录,并且其中一个表贡献出它的所有记录,即使联接字段中的值与对方表中的字段不匹配也是如此。)。完全外部联接并不限制从每个联接表中返回的行,但会根据联接字段中的值合并这些行。
使用联合查询执行完全外部联接:
- 在要用于完全外部联接的字段上创建一个具有左外部联接的查询。
- 在“开始”选项卡上的“视图”组中,单击“视图”,然后单击“SQL 视图”。
- 按 Ctrl+C 复制 SQL 代码。
- 删除 FROM 子句末尾的分号,然后按 Enter。
- 键入 UNION,然后按 Enter。
注释 在使用联合查询执行完全外部联接时,请勿使用 ALL 关键字。
- 按 Ctrl+V 粘贴您在步骤 3 中复制的 SQL 代码。
- 在粘贴的代码中,将 LEFT JOIN 更改为 RIGHT JOIN。
- 删除第二个 FROM 子句末尾的分号,然后按 Enter。
- 添加一个 WHERE 子句,将 FROM 子句中列出的第一个表(左表)中的联接字段值更改为 NULL。
例如,如果 FROM 子句为:
FROM Products RIGHT JOIN [Order Details] ON Products.ID = [Order Details].[Product ID]
则应添加以下 WHERE 子句:
WHERE Products.ID IS NULL
- 在 WHERE 子句的末尾键入一个分号 (;),以指示联合查询已达末尾。
- 在“设计”选项卡上的“结果”组中,单击“运行”。