适用于:SQL Server
可以创建包含任意数量的搜索条件的查询,这些条件与任意数量的 AND 和 OR 运算符链接。 具有 AND 和 OR 子句组合的查询可能变得复杂,因此,了解执行查询时如何解释此类查询,以及如何在 条件窗格 和 SQL 窗格中表示此类查询会很有帮助。
注意
有关仅包含一个 AND 或 OR 运算符的搜索条件的详细信息,请参阅 为一列(Visual Database Tools) 指定多个搜索条件,指定多个列的多个搜索条件(Visual Database Tools)。
下面将找到有关以下内容的信息:
包含这两者的查询中的 AND 和 OR 的优先级。
AND 和 OR 子句中的条件在逻辑上如何相互关联。
查询和视图设计器在包含 AND 和 OR 的条件窗格查询中如何表示。
为了帮助你了解下面的讨论,假设你正在使用包含列 employee
、hire_date
和 job_lvl
的 status
表。 这些示例假定你需要知道员工与公司合作的时间(即员工雇佣日期是什么)、员工执行的工作类型(什么是工作级别)和员工的状态(例如退休)。
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 子句,如下所示:
如果链接的 OR 子句只涉及一个数据列,则查询和视图设计器可以将整个 OR 子句放入网格的单个单元格中,从而避免重复 AND 子句。 例如,在 SQL 窗格中,可以创建 WHERE 子句,如下所示:
WHERE (hire_date < '01/01/95' ) AND
((status = 'R') OR (status = 'A'))
查询和视图设计器在“条件”窗格中表示此 WHERE 子句,如下所示:
如果对查询进行更改(例如更改条件窗格中的值之一),查询和视图设计器将在 SQL 窗格中重新创建 SQL 语句。 重新创建的 SQL 语句类似于“条件窗格”显示,而不是原始语句。 例如,如果条件窗格包含分布式 AND 子句,则 SQL 窗格中生成的语句将使用显式分布式 AND 子句重新创建。 有关详细信息,请参阅本主题前面部分中的“AND 如何与多个 OR 子句一起使用”。