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

适用于:SQL Server

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

注意

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

下面将找到有关以下内容的信息:

  • 包含这两者的查询中的 AND 和 OR 的优先级。

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

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

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

AND 和 OR 的优先级

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

注意

NOT 运算符优先于 AND 和 OR。

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

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

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

WHERE   
   hire_date < '01/01/95' 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/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 子句

查询和视图设计器在 条件窗格中表示您的搜索条件。 但是,在某些情况下,涉及使用 AND 和 OR 连接的多个子句时,“条件”窗格中的表示方式可能不会如预期那样。 此外,如果您在“条件”窗格或 图表窗格中修改查询,您可能会发现 SQL 语句已从您输入的内容发生了变化。

通常,这些规则决定了 AND 和 OR 子句在“条件”窗格中的显示方式:

  • 与 AND 链接的所有条件都显示在 过滤器 网格列中或同一 或... 列中。

  • 与 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 子句优先级的“条件窗格”OR clause precedence in the Criteria Pane

但是,如果链接的 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 子句,则 SQL 窗格中生成的语句将使用显式分布式 AND 子句重新创建。 有关详细信息,请参阅本主题前面部分中的“AND 如何与多个 OR 子句一起使用”。

另请参阅

指定搜索条件(Visual Database Tools)