Access 2003完整教程:合并搜索条件的规则和网格窗格约定 (ADP)

注释本主题中的信息仅适用于 Microsoft Access 项目 (.adp)。

可以创建包含任意数量搜索条件的查询,这些条件用任意数量的 AND 和 OR 运算符相链接。组合了 AND 和 OR 子句的查询会很复杂,所以有必要了解在执行这种查询时查询被解释的方式,以及这种查询在“网格”和 SQL 窗格中是如何表示的。

为便于理解下面的讨论,假设正在处理包含有hire_datejob_lvlstatus列的employee表。该示例假定用户需了解诸如某雇员在公司里工作了多久(也就是了解该雇员的雇佣日期)、该雇员从事何种工作(也就是岗位级别)以及该雇员的状态(例如,是否退休)等信息。

AND 和 OR 运算符的优先级

当执行一个查询时,它会首先计算用 AND 运算符链接的子句,然后计算用 OR 运算符链接的子句。

注释NOT 运算符的优先级比 AND 和 OR 都高。

例如,为了找出在低级岗位上为公司工作了五年以上的雇员以及不论工作年限长短在中级岗位上的雇员,可以构建如下 WHERE 子句:

WHERE
 hire_date < '01/01/90' AND
 job_lvl = 100 OR
 job_lvl = 200

若要覆盖默认的 AND 比 OR 优先级高的约定,可以在 SQL 窗格中将特定条件两边加上括号。括号中的条件总是先计算。例如,为了找出在低级或中级岗位为公司工作了五年以上的所有雇员,可以构建如下 WHERE 子句:

WHERE
 hire_date < '01/01/90' AND
(job_lvl = 100 OR job_lvl = 200)

提示

为使优先级结构清楚,建议在组合使用 AND 和 OR 子句时总是使用括号,而不要依赖于默认的优先级。

AND 子句与多个 OR 子句一起使用的方式

理解 AND 和 OR 子句的组合方式,有助于在“查询设计器”中构建和理解复杂的查询。

如果用 AND 链接了多个条件,则与 AND 链接的第一组条件会应用于第二组中的所有条件上。换句话说,用 AND 链接到另一个条件的条件,会分配给第二组中的所有条件。例如,下列示意的表达方式显示了一个链接到一组 OR 条件的 AND 条件:

A AND (B OR C)

上述表达方式与下列示意的表达方式在逻辑上等价,而下面的表达式显示了 AND 条件是如何分配给第二组中的条件的:

(A AND B) OR (A AND C)

这种分配原则影响“查询设计器”的使用方式。例如,假设要查找所有在低级或中级岗位为公司工作了五年以上的雇员。您可以在 SQL 窗格的语句中输入如下 WHERE 子句:

WHERE (hire_date < '01/01/90' ) AND
 (job_lvl = 100 OR job_lvl = 200)

用 AND 运算符链接的子句应用于使用 OR 运算符链接的两个子句。更清楚的等价表达方式是对 OR 子句中的每个条件均重复 AND 条件。下面的语句比上一语句逻辑关系更清楚(也更长),但是逻辑上是等价的:

WHERE (hire_date < '01/01/90' ) AND
 (job_lvl = 100) OR
 (hire_date < '01/01/90' ) AND
 (job_lvl = 200)

将 AND 子句分配给链接的所有 OR 子句的分配原则,适用于牵涉到的任意多单一条件。例如,假设想找出所有在高级或中级岗位为公司工作了五年以上或已退休的雇员。WHERE 子句可能如下所示:

WHERE
 (job_lvl = 200 OR job_lvl = 300) AND
 (hire_date < '01/01/90' ) OR (status = 'R')

分配了用 AND 链接的条件之后,WHERE 子句可能如下所示:

WHERE
 (job_lvl = 200 AND hire_date < '01/01/90' ) OR
 (job_lvl = 200 AND status = 'R') OR
 (job_lvl = 300 AND hire_date < '01/01/90' ) OR
 (job_lvl = 300 AND status = 'R')

在“网格”窗格中如何表示多个 AND 和 OR 子句

“查询设计器”在“网格”窗格中表达搜索条件。但是,对于包含用 AND 和 OR 链接的多个子句的条件,“网格”窗格中的表达方式可能与预想的不一样。另外,如果在“网格”或“图表”窗格中修改查询,则会发现 SQL 语句与所输入的会有所不同。

下面是 AND 和 OR 子句在“网格”窗格中显示的一般规则:

例如,在 SQL 窗格中可能创建如下的搜索条件,其中用 AND 链接的两个子句优先于用 OR 链接的第三个子句:

WHERE (hire_date < '01/01/90' )AND
 (job_lvl = 100)OR
 (status = 'R')

“查询设计器”在“网格”窗格中将这个 WHERE 子句表达如下:

“网格”窗格示例

但是,如果链接的 OR 子句具有比 AND 子句高的优先级,则对每个 OR 子句都会重复这个 AND 子句。这样,这个 AND 子句会分配给每个 OR 子句。例如,在 SQL 窗格中,可能创建如下 WHERE 子句:

WHERE (hire_date < '01/01/90' )AND
 ( (job_lvl = 100)OR
 (status = 'R') )

“查询设计器”在“网格”窗格中将这个 WHERE 子句表达如下:

“网格”窗格示例

如果链接的 OR 子句只涉及一个数据列,则“查询设计器”会将整个 OR 子句放在该网格的单个单元格中,从而避免重复使用 AND 子句。例如,在 SQL 窗格中,可能创建如下 WHERE 子句:

WHERE (hire_date < '01/01/90' )AND
 ((status = 'R')OR(status = 'A'))

“查询设计器”在“网格”窗格中将这个 WHERE 子句表达如下:

“网格”窗格示例

如果更改了查询(例如,在“网格”窗格中更改了一个值),“查询设计器”会在 SQL 窗格中重新创建这个 SQL 语句。重新创建的 SQL 语句会类似于“网格”窗格的显示,而与原来的语句有所不同。例如,如果“网格”窗格中包含要分配的 AND 子句,则 SQL 窗格中的生成语句会用明确分配的 AND 子句重新创建。

上页:Access 2003完整教程:重复的键盘快捷方式 下页:Access 2003完整教程:关于列和列属性 (ADP)

Access 2003完整教程:合并搜索条件的规则和网格窗格约定 (ADP)

Access 2003完整教程:关于列和列属性 (ADP)Access 2003完整教程:比较运算符 (ADP)
Access 2003完整教程:关于约束 (ADP)Access 2003完整教程:表达式的结构 (ADP)
Access 2003完整教程:关于 SQL Server 数据库的“数据库设计器”注意事项 (ADP)Access 2003完整教程:输入搜索值的规则 (ADP)
Access 2003完整教程:处理表达式的 SQL 标量函数 (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完整教程:关于 SQL Server 数据库的“查询设计器”注意事项 (ADP)
Access 2003完整教程:关于“查询设计器”布局 (ADP)Access 2003完整教程:在查询中选择与值不匹配的行 (ADP)
版权所有 © 中山市飞娥软件工作室 证书:粤ICP备09170368号