Access 2003完整教程:关于创建查询 (ADP)

查询从数据库请求数据。在最简单的情况下,查询只从单一表中即可取得所有数据。但当创建更复杂(并且更典型)的查询时,可以用下列方式准确地取得所需的数据:

包括或排除行

使用搜索条件

若要限制查询应返回的行数,可以创建搜索条件或筛选条件。在 SQL 中,搜索条件出现在语句的 WHERE 子句中,而如果创建聚合查询,搜索条件则出现在 HAVING 子句中。

注释也可以使用搜索条件来指示受“更新”、“更新值”、“删除”或“生成表”查询影响的行。

运行查询时,数据库引擎对正在搜索的表中的每一行检查和应用搜索条件。如果某行满足搜索条件,该行便包含在查询中。例如,查找特定区域的所有雇员的搜索条件可能是:

region = 'UK'

若要建立条件以在结果中包含行,可以使用多个搜索条件。例如,下面的搜索条件由两个搜索条件组成。仅当该行同时满足两个条件时,查询才在结果集内包含行。

region = 'UK' AND product_line = 'Housewares'

可以使用 AND 或 OR 来组合使用这些条件。上述示例使用了 AND。相反,下面的条件使用 OR。附属查询结果将包含满足一个或两个条件的任意行:

region = 'UK' OR product_line = 'Housewares'

甚至可以根据单个列来组合搜索条件。例如,下面的条件根据区域列组合两个条件:

region = 'UK' OR region = 'US'

搜索条件中的谓词

搜索条件由一个或多个谓词组成,每个谓词指定一个条件。如果搜索条件包含一个以上的谓词,则谓词由逻辑 AND(用以缩小搜索)或 OR(用以扩大搜索)连接。下面的示例说明在搜索employee表时,如何使用多个条件,查找具有指定的姓氏和名字的一名或多名雇员:

WHERE lname = 'Smith' AND fname = 'Jean'

单个谓词的格式如下:

search_expression operator search_value

多数情况下,search_expression 是要搜索的列名称。同样,search_value 的最常见形式是一个要搜索的原义值,它可以是一个字符串或一个数字。

下面的两个示例显示了搜索原义值。第一个示例搜索所有在英国工作的雇员,第二示例搜索所有处于特定工作岗位级别的雇员:

WHERE region = 'UK'
WHERE job_lvl = 100

search_expression 和 search_value 可以由下列任意值或它们的组合组成:

包括或排除列

可以选择在查询结果中显示哪些列。选择要包含的列时,切记以下几点:

组合表

查询结果可以包含源自多个表中的数据。若要组合表中的数据,可在 SQL 中使用“联接”运算。

基本联接运算

“联接”运算根据这些行中的值将一个表中的行与另一个表中的行相匹配。例如,可以联接titles表与publishers表。结果集中的每一行都描述一本书,包含有关该书的出版社的信息,如下面的示例所示:

标题表

联接的类型

当联接表时,所建联接的类型将影响结果集中出现的行。可以创建下列类型的联接:

联接列

JOIN 运算符通过将一个表中的值与另一个表中值进行对比来匹配行。可以确定每个表中的哪些列应该是匹配的。有以下几个选项可供选择:

另请注意:使用多个列可以匹配联接表的行,例如,若要查找在同一城市中的作家和出版商的作家-出版商对,可以使用联接运算匹配两个表中的各个省/市/自治区列和各个城市列。必须同时匹配城市和省/市/自治区,因为有可能不同的省/市/自治区有名称类似的城市名(如,Springfield、Illinois 和 Springfield、Massachusetts)。

联接比较运算符

JOIN 运算符用于通过比较两个表中的值来匹配行。您可完全确定组成匹配项的内容。可以选择的项分大致为下列两种类别:

联接表

在组合多个表中的数据时,必须确定所要使用的表。有几个值得注意的事项:

拆解成组的行

可以创建一个查询结果,其中每个结果行都对应于原始数据中的整个分组行。瓦解行时,切记以下几点:

在一个查询中两次使用同一个表

在单一查询中可以两次或多次使用同一个表。这样做的情形有下列几种:

用视图、用户定义函数和子查询代替表

编写查询时,必须清楚自己需要哪些列、需要哪些行,以及查询过程应该从哪里找到初始数据。通常这些数据由一个表或几个联接在一起的表组成。但是初始数据可以来自表以外的源。事实上,可以来自视图、返回某个表的用户定义函数,或者是子查询。

用视图代替表

可以从视图中选择行。例如,假定数据库中包括一个名为“ExpensiveBooks”的视图,其中每行都描述一本价格高于 19.99 的书的名称。视图定义可能如下所示:

SELECT *
FROM titles
WHERE price > 19.99

只需从 ExpensiveBooks 视图中选择心理学书籍即可选出昂贵的心理学书籍。产生的结果 SQL 可能如下所示:

SELECT *
FROM ExpensiveBooks
WHERE type = 'psychology'

同样,视图还可以用在 JOIN 操作中。例如,只需将 sales 表与 ExpensiveBooks 视图联接起来即可找出昂贵书籍的销售量。产生的结果 SQL 可能如下所示:

SELECT *
FROM sales
 INNER JOIN
 ExpensiveBooks
 ON sales.title_id
 = ExpensiveBooks.title_id

用用户定义函数代替表

在 Microsoft SQL Server 2000 中,可以创建返回某个表的用户定义函数。这种函数在进行复杂或程序性的逻辑处理时非常有用。

例如,假定 employee 表中包含一个附加列 employee.manager_emp_id,并且从 manager_emp_id 到 employee.emp_id 之间存在一个外键。在 employee 表的每一行中,manager_emp_id 列表示雇员的上司。更确切地说,表示雇员上司的 emp_id。此时即可创建一个可以返回某个表的用户定义函数,该表中的每一行都针对一个在特定高层管理人员的组织层次中工作的雇员。可以调用函数 fn_GetWholeTeam,并将其设计为需要一个输入变量,即要检索其团队的管理人员的 emp_id。

可以写一个使用 fn_GetWholeTeam 函数作为数据源的查询。产生的结果 SQL 可能如下所示:

SELECT *
FROM
 fn_GetWholeTeam ('VPA30890F')

其中的“VPA30890F”是要检索其团队的管理人员的 emp_id。

用子查询代替表

可以从子查询中选择行。例如,假定您已经编写了一个用于检索合著书籍(即该书有多位作者)的书名和标识符的查询。SQL 可能如下所示:

SELECT
 titles.title_id, title, type
FROM
 titleauthor
 INNER JOIN
 titles
 ON titleauthor.title_id
 = titles.title_id
GROUP BY
 titles.title_id, title, type
HAVING COUNT(*) > 1

可以以该结果为基础再写一个查询。例如可以写一个检索合著的心理学书籍的查询。为了编写这个新查询,可以将现有的查询用作新查询的数据的源。产生的结果 SQL 可能如下所示:

SELECT
 title
FROM
(
 SELECT
 titles.title_id,
 title,
 type
 FROM
 titleauthor
 INNER JOIN
 titles
 ON titleauthor.title_id
 = titles.title_id
 GROUP BY
 titles.title_id,
 title,
 type
 HAVING COUNT(*) > 1
 )
 co_authored_books
WHERE type = 'psychology'

上面着重突出的文字指出现有的查询用作新查询的数据的源。注意,新查询对现有查询使用了别名(“co_authored_books”)。

同样,查询还可以用在 JOIN 操作中。例如,只需将 ExpensiveBooks 视图与检索合著书籍的查询联接起来即可找出昂贵合著书籍的销售量。产生的结果 SQL 可能如下所示:

SELECT
 ExpensiveBooks.title
FROM
 ExpensiveBooks
 INNER JOIN
(
 SELECT
 titles.title_id,
 title,
 type
 FROM
 titleauthor
 INNER JOIN
 titles
 ON titleauthor.title_id
 = titles.title_id
 GROUP BY
 titles.title_id,
 title,
 type
 HAVING COUNT(*) > 1
 )

对行进行排序

可以在查询结果中设定行的次序。也就是说,可以命名特定的一列或一组列,其值确定了结果集中各行的次序。用于排序的方法有好几种:

上页:Access 2003完整教程:在查询中选择与值不匹配的行 (ADP) 下页:Access 2003完整教程:关于聚合函数 (ADP)

Access 2003完整教程:关于创建查询 (ADP)

Access 2003完整教程:关于聚合函数 (ADP)Access 2003完整教程:关于“查询设计器”中的汇总和分组行为 (ADP)
Access 2003完整教程:关于不同的查询类型 (ADP)Access 2003完整教程:关于“表设计器” (ADP)
Access 2003完整教程:关于表关系 (ADP)Access 2003完整教程:关于表 (ADP)
Access 2003完整教程:联接的类型 (ADP)Access 2003完整教程:关于使用具有国际化数据的“查询设计器” (ADP)
Access 2003完整教程:使用通配符示例 (ADP)Access 2003完整教程:关于多用户环境 (ADP)
Access 2003完整教程:关于触发器 (ADP)Access 2003完整教程:向所选列添加公式将会删除该列参与的所有索引和关系。
Access 2003完整教程:向所选列添加公式将会删除该列作为外键参与的所有关系。Access 2003完整教程:数据库中已经存在有同名的数据库图表。
Access 2003完整教程:不能将表达式用作参数值。Access 2003完整教程:在您处理该数据库图表时,其他用户也对其做了修改。
Access 2003完整教程:索引视图中不能使用星号 (*)。Access 2003完整教程:将该列改为所选数据类型将会删除其索引。
Access 2003完整教程:将列更改为选定的数据类型会删除其索引和所有参与的关系。Access 2003完整教程:将该列改为所选数据类型将会删除关系。
版权所有 © 中山市飞娥软件工作室 证书:粤ICP备09170368号