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 反馈 — 无需本地设置。
此课程中的所有课时
- AND/OR 优先级与括号
- BETWEEN、IN 与包含边界
- LIKE、通配符与转义
- 按计算值筛选