You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL WHERE子句中OR NOT的正确用法及逻辑表达式等价性疑问

SQL WHERE子句中OR NOT的用法及表达式等价性问题

一、WHERE子句中使用OR NOT的正确方式

首先要明确:OR和NOT是两个独立的逻辑运算符,不存在“OR NOT”这种固定组合用法,正确的姿势是先对单个条件用NOT取反,再用OR把这个取反后的条件和其他条件连接起来。

举个实际场景的例子:假设你要从商品表中筛选「价格超过100元,或者库存不为空」的商品,SQL应该这么写:

SELECT * FROM products
WHERE price > 100 OR NOT (stock = 0);

这里要注意运算符优先级:NOT的优先级比OR高,所以如果逻辑复杂,一定要用括号明确范围,避免歧义。比如WHERE NOT A OR B的逻辑是「非A,或者B」,如果你的实际需求是「不是(A或B)」,必须加括号写成WHERE NOT (A OR B),不然逻辑会完全走偏。

二、两个表达式是否等价

这两个表达式完全不等价,核心依据是逻辑运算里的德摩根定律:

  • NOT (A OR B OR C) 等价于 NOT A AND NOT B AND NOT C
    也就是说,否定多个条件的“或”,等于把每个条件分别否定后再做“与”运算。

回到你的问题:

  1. AND NOT (A OR B OR C):表示在满足其他条件的基础上,同时不满足A、B、C中的任何一个(也就是A、B、C全为假)
  2. AND ((NOT A) OR (NOT B) OR (NOT C)):表示在满足其他条件的基础上,只要不满足A、B、C中的任意一个即可(也就是A、B、C至少有一个为假)

用实际场景举例:假设A是「年龄>30」,B是「性别为男」,C是「城市为北京」

  • 第一个表达式会留下「年龄≤30 且 性别为女 且 城市非北京」的人
  • 第二个表达式会留下「年龄≤30,或者性别为女,或者城市非北京」的人,范围比前者大得多,逻辑完全不同。

内容的提问来源于stack exchange,提问作者Vagner Hughs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 02:15:59