SQL中<>运算符在多值关联查询场景下的比较机制疑问
关于SQL中<>运算符在多值比较场景下的工作原理拆解
先直接给你结论:<>(不等于)运算符是逐行、逐个值进行比较的,既不会只和IN列表里的某个固定值(比如2)比较,也不会随机选值——它的比较逻辑完全依赖外层查询中当前行的A.Col1值。
我们结合你的数据表和查询语句一步步分析:
先明确外层查询的执行逻辑
外层查询SELECT Col2 FROM MyTable A WHERE Col1 IN (2,3,4)会先筛选出Col1为2、3、4的三行数据,然后对每一行单独执行内层的NOT EXISTS子查询。
内层子查询中<>的具体行为
内层子查询是SELECT 1 FROM MyTable B WHERE B.Col1 <> A.Col1,这里的A.Col1是外层当前行的取值,所以:
- 当外层A的
Col1=2时,子查询会查找MyTable中所有Col1≠2的行(也就是Col1为1、3、4的行),这时候子查询能返回结果,NOT EXISTS就会判定为false,所以这一行不会被外层查询选中; - 当外层A的
Col1=3时,子查询会查找所有Col1≠3的行(Col1为1、2、4),同样能查到结果,NOT EXISTS为false,不选中; - 当外层A的
Col1=4时,子查询会查找所有Col1≠4的行(Col1为1、2、3),还是能查到结果,NOT EXISTS为false,不选中。
所以最终这个查询的结果是空集,因为每一个外层行对应的子查询都能找到满足条件的数据,导致NOT EXISTS不成立。
补充:和“批量不等于多值”的区别
如果你想表达“Col1不等于2、3、4中的任意一个”,那应该用Col1 NOT IN (2,3,4)或者Col1 <> 2 AND Col1 <> 3 AND Col1 <>4,这和你当前查询里的<>逻辑完全不同——你的查询是拿外层行的单个值,和内层表的所有行做不等于比较,而不是和多个值做批量判断。
内容的提问来源于stack exchange,提问作者user2488578
相关产品推荐
相关产品推荐

