0Pricing
SQL Interview Prep · 课时

AND/OR 优先级与括号

识别面试官最常在问题中设置的筛选错误

AND/OR 优先级与括号 是 CoddyKit 上的免费 SQL Interview Prep 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Interview Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Interview Prep 课程共包含 4 节课。

面试官布置的陷阱

面试中最常见的筛选错误,乍看之下往往完全正确。题目会要求您:查找客户 5 的、状态为待处理或已发货的订单。候选人会写出混合使用 WHERE、AND 和 OR 的查询,结果却返回了额外的行。

为什么会这样?因为 AND 的绑定比 OR 更紧。数据库会先计算所有 AND 对,再计算 OR。本课会让您对这条规则形成条件反射,从而不再因此失分。

用一句话说明运算符优先级

在每种 SQL 方言中,逻辑运算符都按以下顺序绑定:先是 NOT,然后是 AND,最后是 OR。

  • NOT 的优先级最高
  • AND 居中
  • OR 的优先级最低

因此,A OR B AND C 会被理解为 A OR (B AND C),而绝不会是 (A OR B) AND C。面试官正希望您忘记这一点。

错误的查询

下面是候选人为实现客户 5,状态为待处理或已发货而写出的查询。它看起来正确,实际上却是错误的。

由于 AND 的绑定更紧,SQL 会将其理解为 (customer_id = 5 AND status = 'pending') OR status = 'shipped'。第二个分支完全没有客户筛选条件,因此会返回所有客户的已发货订单。

SELECT *
FROM orders
WHERE customer_id = 5
  AND status = 'pending'
  OR status = 'shipped';

修复方法:使用括号

将 OR 分支放在括号中,这样客户筛选条件就会同时应用于两种状态。括号会覆盖优先级,并明确表达意图。

现在,SQL 会先计算分组后的 OR 条件,然后将 customer_id = 5 应用于整个分组。即使运算符优先级本身已经能产生正确结果,资深评审人员也会添加括号,单纯为了提高可读性。

SELECT *
FROM orders
WHERE customer_id = 5
  AND (status = 'pending' OR status = 'shipped');

逐步检查真值表

以一条来自客户 9 的已发货订单为例,跟踪错误版本的执行过程:

  • customer_id = 5 为假
  • status = 'pending' 为假
  • false AND false 为假
  • false OR (status = 'shipped' is true) 为真

即使这行记录不属于客户 5,它仍然会被返回。面试官希望看到的正是:您能够大声跟踪一条具体记录的判断过程。

NOT 的绑定最紧

NOT 只作用于紧随其后的条件。因此,NOT status = 'open' AND priority = 'high' 表示 (NOT status = 'open') AND priority = 'high'。

如果您想否定整个条件,就必须加括号:NOT (status = 'open' AND priority = 'high')。根据德摩根定律,这等价于 status <> 'open' OR priority <> 'high'。

SELECT *
FROM tickets
WHERE NOT (status = 'open' AND priority = 'high');

三个条件的示例

查找属于 (电子产品或家用电器) 且 有库存 的产品。若没有括号,库存筛选条件就只会应用于家用电器。

下面这个分组后的查询读起来很清晰:先选择两个类别中的一个,然后要求有库存。记住这条规则:只要一个查询同时混用 AND 和 OR,通常就需要在 OR 分组外加上括号。

SELECT *
FROM products
WHERE (category = 'electronics' OR category = 'appliances')
  AND in_stock = true;

IN:更简洁的替代方案

在同一列上长串连接多个 OR,既容易出错又很冗长。请将其替换为 IN,这样含义明确,也不需要括号。

下面的查询与前一个查询完全等价,但更不容易被改坏。面试官喜欢看到这种重构,因为它表明您同时理解正确性和可读性。

SELECT *
FROM products
WHERE category IN ('electronics', 'appliances')
  AND in_stock = true;

计算筛选条件中的优先级

算术运算和逻辑运算混用时同样适用优先级规则。在 price * 1.2 > 100 OR discount = 0 AND active = true 中,会先解析比较和算术运算,然后是 AND,最后是 OR。

因此它的含义是 (price * 1.2 > 100) OR ((discount = 0) AND (active = true))。如果不确定,不要在压力下死记表格,只需给每个分组都加上括号。

现场如何回答

当面试官给出一个混合使用 AND/OR 的筛选条件,并询问它会返回什么时,请做三件事:

  • 说明优先级规则:AND 先于 OR
  • 大声重新为查询加上括号,展示其真正的分组方式
  • 追踪一行能够暴露错误的数据

然后给出修正后的带括号版本。这样的回答体现出资深开发者级别的严谨性。

防御性习惯

专业的习惯是:始终为每个 OR 分组加上括号。这只需两个字符,却能消除一整类错误和代码审查意见。

代码审查者不应该需要在脑中计算优先级,才能确认筛选条件是否正确。请让分组方式清晰可见。这是少数几个冗余语法被所有人都认为是良好风格的情况之一。

SELECT order_id, status
FROM orders
WHERE customer_id = 5
  AND (status = 'pending' OR status = 'shipped');

快速检查

请先根据优先级规则进行推理,再作答。

回顾

要点:

  • 逻辑优先级依次是 NOT、AND、OR
  • 混合使用 AND/OR 的筛选条件,通常都需要在 OR 分组外加上括号
  • 缺少括号会悄悄扩大结果范围,常常导致某个筛选条件完全失效
  • 请将同一列上的长串 OR 替换为 IN
  • 现场回答时:说明规则、重新加括号、追踪一行,然后修正

即使优先级已经符合预期,也请始终为 OR 分组加上括号。

常见问题解答

「AND/OR 优先级与括号」课时是免费的吗?

是的 — 「AND/OR 优先级与括号」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Interview Prep 课程的其余内容,请升级到 CoddyKit PRO。 SQL Interview Prep 课程共包含 4 节课。

「AND/OR 优先级与括号」这节课中我会学到什么?

识别面试官最常在问题中设置的筛选错误 你通过在浏览器中直接运行的动手代码来练习 SQL Interview Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Interview Prep 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Interview Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「AND/OR 优先级与括号」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Interview Prep 课中编写并运行代码吗?

能。每节 SQL Interview Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. AND/OR 优先级与括号
  2. BETWEEN、IN 与包含边界
  3. LIKE、通配符与转义
  4. 按计算值筛选
← 返回 SQL Interview Prep