我有以下查询,与使用 = 相比,使用 != (或 <>)时其工作方式有所不同。
我尝试使用的示例的工作原理如下。
SELECT COUNT(*) FROM table1
Run Code Online (Sandbox Code Playgroud)
返回100。
SELECT COUNT(*)
FROM table1
WHERE year = '2017/2018' AND SOURCE = 'CSV'
Run Code Online (Sandbox Code Playgroud)
返回30。
那么为什么下面的代码不会返回70的计数呢?
SELECT COUNT(*)
FROM table1
WHERE year != '2017/2018' AND SOURCE != 'CSV'
Run Code Online (Sandbox Code Playgroud)
当更新为 != 时,它似乎将其视为 OR 而不是 AND,我正在努力找出原因。我通过更改查询以将 NOT EXISTS 与子选择一起使用来解决了这个问题,但最初的问题仍然存在。
因为有些行的年份是 2017/18 但来源不是 CSV,或者来源是 CSV 但年份不是 2017/18。参见德摩根定律。
也许你想要的是:
WHERE NOT (year = '2017/2018' AND SOURCE = 'CSV')
Run Code Online (Sandbox Code Playgroud)
就我个人而言,我通常不太喜欢包装器NOT (),但在这种情况下,它最好地描述了您所追求的语义。你也可以说:
WHERE year <> '2017/2018' OR SOURCE <> 'CSV'
---- important difference ^^
Run Code Online (Sandbox Code Playgroud)
换个角度想一下。停车场有 10 辆车,我们想找出有多少辆车是红色宝马(姑且称之为x),以及有多少辆车不是红色宝马(应该是10 - x):
| 颜色 | 制作 | 红色的? | 宝马? | 红色和 宝马? |
不是 红色? |
不是 宝马? |
不是红色也不 是宝马? |
不是红色还是 不是宝马? |
|---|---|---|---|---|---|---|---|---|
| 红色的 | 宝马 | 是的 | 是的 | 是的 | 不 | 不 | 不 | 不 |
| 红色的 | 宝马 | 是的 | 是的 | 是的 | 不 | 不 | 不 | 不 |
| 红色的 | 宝马 | 是的 | 是的 | 是的 | 不 | 不 | 不 | 不 |
| 银 | 宝马 | 不 | 是的 | 不 | 是的 | 不 | 不 | 是的 |
| 红色的 | 本田 | 是的 | 不 | 不 | 不 | 是的 | 不 | 是的 |
| 紫色的 | 丰田 | 不 | 不 | 不 | 是的 | 是的 | 是的 | 是的 |
| 绿色的 | 雷克萨斯 | 不 | 不 | 不 | 是的 | 是的 | 是的 | 是的 |
| 绿色的 | 丰田 | 不 | 不 | 不 | 是的 | 是的 | 是的 | 是的 |
| 黑色的 | 福特 | 不 | 不 | 不 | 是的 | 是的 | 是的 | 是的 |
| 橙子 | 奥迪 | 不 | 不 | 不 | 是的 | 是的 | 是的 | 是的 |
| 是的总和: | 4 | 4 | 3 | 6 | 6 | 5 | 7 |
如果您数出所有既是红色又不是宝马的汽车,您会得到 3。如果您想要它的倒数(剩余 7 辆汽车),您就无法数出所有既不是红色又不是宝马的汽车。这将跳过银色宝马和红色本田,给出 5,而不是 7。您需要计算所有非红色或非宝马的汽车。或者既不是红色又不是宝马。