适用于: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的查询。
为了帮助你了解下面的讨论,假设你正在使用一个包含列 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
若要替代默认优先顺序ANDOR,可以将括号放在 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相关的两个子句。 明确表达这一点的方法是对AND子句中的每个条件重复一次OR条件。 以下语句比上一个语句更显式(且更长),但在逻辑上等效于它:
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子句,则对每个AND子句重复该OR子句。 这会导致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 窗格中生成的语句。 有关详细信息,请参阅本文前面的 多个 OR 子句的 AND 工作原理 。