在“条件”窗格中组合搜索条件的约定

可创建包含与任意多个 AND 和 OR 运算符链接的任意多个搜索条件的查询。 带有 AND 和 OR 子句组合的查询会变得复杂。因此,了解在执行这类查询时如何解释这类查询,以及在“条件”窗格“SQL”窗格中如何表示这类查询是非常有用的。

备注

有关仅包含一个 AND 或 OR 运算符的搜索条件的详细信息,请参见 如何:为同一列指定多个搜索条件如何:为多个列指定多个搜索条件

在以下内容中,将找到有关信息:

  • 在包含 AND 和 OR 的查询中,AND 和 OR 的优先级。

  • AND 和 OR 子句中的条件如何在逻辑上相关。

  • 查询和视图设计器如何在“条件”窗格中表示同时包含 AND 和 OR 的查询。

为帮助理解下面的讨论内容,假设您正使用包含 hire_date、job_lvl 和 status 列的 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 子句在“条件”窗格中的显示方式:

  • 所有与 AND 链接的条件出现在**“筛选器”网格列中或同一个“或...”**列中。

  • 所有与 OR 链接的条件出现在不同的**“或...”**列中。

  • 如果 AND 和 OR 子句组合的逻辑结果是将 AND 分布到几个 OR 子句中,则“条件”窗格将根据需要重复 AND 子句以显式表示结果。

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

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

查询和视图设计器在“条件”窗格中将此 WHERE 子句表示为:

条件窗格中的 WHERE 子句

但是,如果链接的 OR 子句优先级高于 AND 子句,则每个 OR 子句都重复 AND 子句。 这使 AND 子句被分布到每个 OR 子句中。 例如,在“SQL”窗格中可以创建如下 WHERE 子句:

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

查询和视图设计器在“条件”窗格中将此 WHERE 子句表示为:

条件窗格中的 WHERE 子句 2

如果链接的 OR 子句仅涉及一个数据列,查询和视图设计器可以将整个 OR 子句放置到单个的网格单元中,以避免重复 AND 子句。 例如,在“SQL”窗格中可以创建如下 WHERE 子句:

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

查询和视图设计器在“条件”窗格中将此 WHERE 子句表示为:

条件窗格中的 WHERE 子句 3

如果更改查询(如更改“条件”窗格中的一个值),查询和视图设计器将在“SQL”窗格中重新创建 SQL 语句。 重新创建的 SQL 语句将与“条件”窗格的显示相似,而不是与原始语句相似。 例如,如果“条件”窗格中包含分布式的 AND 子句,将用显式分布式的 AND 子句重新创建“SQL”窗格中的结果语句。 有关详细信息,请参见本主题前面的“AND 如何与多个 OR 子句一起使用”。

请参见

其他资源

指定搜索条件

参考 (Visual Database Tools)