“条件”窗格中合并搜索条件的约定(Visual Database Tools)

适用于:SQL Server

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

注意

有关仅包含一个ANDOR运算符的搜索条件的详细信息,请参阅为一列指定多个搜索条件(Visual Database Tools)为多列指定多个搜索条件(Visual Database Tools)

在本文中,可以找到有关以下内容的信息:

  • 包含 ANDOR 的查询中的优先级关系。

  • 条件 ANDOR 子句在逻辑上如何相互关联。

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

为了帮助你了解下面的讨论,假设你正在使用一个包含列 hire_datejob_lvlstatusemployee 表。 这些示例假定你需要知道员工与公司合作的时间(即员工雇佣日期是什么)、员工执行的工作类型(什么是工作级别)和员工的状态(例如退休)。

AND 和 OR 的优先级

执行查询时,它将首先评估与AND链接的子句,然后评估与OR链接的子句。

注意

运算符 NOT 优先于两者 AND 以及 OR

例如,若要查找在低级别职位上与公司工作了五年多的员工,或者不考虑其雇佣日期的中级员工,可以构造如下 WHERE 条款:

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

若要替代默认优先顺序ANDOR,可以将括号放在 SQL 窗格中的特定条件周围。 括号中的条件始终会被优先求值。 例如,若要查找在低级或中级职位上与公司合作超过五年的所有员工,可以构造一个 WHERE 子句,如下所示:

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

提示

为清楚起见,建议在组合 ANDOR 子句时始终包含括号,而不是依赖默认优先级。

AND 如何与多个 OR 子句进行搭配使用

在查询和视图设计器中,了解 ANDOR 子句在组合时的关系,有助于构造和理解复杂的查询。

如果将多个条件链接在一起使用 AND,那么通过 AND 链接的第一组条件适用于第二组中的所有条件。 换句话说,与AND相联系的一个条件将分配给第二组条件中的所有条件。 例如,以下示意图表示形式显示了 AND 链接到一组 OR 条件的条件:

A AND (B OR C)

上述表示形式在逻辑上等效于以下示意图表示形式,其中显示了条件 AND 如何分布到第二组条件:

(A AND B) OR (A AND C)

此分布原则会影响使用查询和视图设计器的方式。 例如,假设你正在寻找所有在公司工作超过五年的基层或中层职位的员工。 请在 SQL 窗格的语句中输入以下 WHERE 子句:

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

AND相关的子句适用于与OR相关的两个子句。 明确表达这一点的方法是对OR子句中的每个条件重复一次AND条件。 以下语句比上一个语句更显式(且更长),但在逻辑上等效于它:

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

无论涉及多少个条件,将 AND 子句分配给链接的 OR 子句的原则都适用。 例如,假设你想要找到在公司工作超过五年的中高层员工,或者已经退休的员工。 子 WHERE 句可能如下所示:

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

分发与 AND 关联的条件后,WHERE 子句如下所示:

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

“条件”窗格中如何显示多个 AND 和 OR 子句

查询和视图设计器表示“条件”窗格中的搜索条件(Visual Database Tools)。 但是,在涉及多个通过 ANDOR 链接的子句的某些情况下,“Criteria” 窗格中的表示形式可能不是您所期望的。 此外,如果在“条件”窗格或 “关系图”窗格(Visual Database Tools)中修改查询,你可能会发现 SQL 语句已从输入的内容更改。

通常,这些规则决定了 ANDOR 子句在“条件”窗格中的呈现方式。

  • 所有与 AND 关联的条件都显示在 “筛选” 网格列或者同一 “或...” 列中。

  • 链接 OR 的所有条件都显示在单独的 Or... 列中。

  • 如果 AND 子句和 OR 子句的逻辑组合结果导致 AND 被分配到多个 OR 子句中,则条件窗格通过根据需要多次重复 AND 子句来显式表示这一点。

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

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

查询和视图设计器在“条件”窗格中表示此 WHERE 子句,如下所示:

“条件”窗格中 OR 子句优先级的屏幕截图。

但是,如果链接OR子句优先于AND子句,则对每个OR子句重复该AND子句。 这会导致AND句分发到每个OR子句。 例如,在 SQL 窗格中,可以创建如下 WHERE 子句:

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

查询和视图设计器在“条件”窗格中表示此 WHERE 子句,如下所示:

“条件”窗格中多个 AND 和 OR 子句的屏幕截图。

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

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

查询和视图设计器在“条件”窗格中表示此 WHERE 子句,如下所示:

“条件”窗格中定义的链接 OR 子句的屏幕截图。

如果对查询进行更改(例如更改“条件”窗格中的值之一),查询和视图设计器将在 SQL 窗格中重新创建 SQL 语句。 重新创建的 SQL 语句类似于“条件”窗格显示,而不是原始语句。 例如,如果“条件”窗格包含分布式 AND 子句,则会使用显式分布式 AND 子句重新创建 SQL 窗格中生成的语句。 有关详细信息,请参阅在本文前面的“AND 如何处理多个 OR 子句”中了解详情。