适用于:SQL Server
可以创建包含任意数量的搜索条件的查询,这些条件与任意数量的 AND
搜索条件和 OR
运算符链接。 具有组合 AND
子句和 OR
子句的查询可能会变得复杂,因此,了解执行查询时如何解释此类查询,以及如何在 “条件”窗格(Visual Database Tools) 和 SQL 窗格(Visual Database Tools)中表示此类查询(Visual Database Tools)非常有用。
注意
有关仅包含一个AND
或OR
运算符的搜索条件的详细信息,请参阅为一列指定多个搜索条件(Visual Database Tools)和为多列指定多个搜索条件(Visual Database Tools)。
在本文中,可以找到有关以下内容的信息:
包含
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/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
相联系的一个条件将分配给第二组条件中的所有条件。 例如,以下示意图表示形式显示了 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)。 但是,在涉及多个通过 AND
和 OR
链接的子句的某些情况下,“Criteria” 窗格中的表示形式可能不是您所期望的。 此外,如果在“条件”窗格或 “关系图”窗格(Visual Database Tools)中修改查询,你可能会发现 SQL 语句已从输入的内容更改。
通常,这些规则决定了 AND
和 OR
子句在“条件”窗格中的呈现方式。
所有与
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
子句优先于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
子句,则会使用显式分布式 AND
子句重新创建 SQL 窗格中生成的语句。 有关详细信息,请参阅在本文前面的“AND
如何处理多个 OR
子句”中了解详情。