NOT 运算符能否处理括号中出现的多个条件?

Can the NOT operator work on multiple conditions present in parenthesis?

我 运行 在 MySQL 中进行以下查询:

SELECT * FROM Customers
WHERE NOT Country='Germany' AND NOT Country='USA';

它完全返回了正确的预期结果。

之后我 运行 以下查询:

SELECT * FROM Customers
WHERE NOT (Country='Germany' AND Country='USA');

这次它返回了我table(查询结果集SELECT * FROM Customers;

中存在的所有记录

我不明白为什么 NOT 运算符在带括号的第二个查询中不起作用?

您可以转到此 link 并查看:

https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_where_not_and

是的,当然可以。但是,根据布尔逻辑规则,正确的公式使用 OR,而不是 AND:

SELECT *
FROM Customers
WHERE NOT (Country = 'Germany' OR Country = 'USA');

您的条件是:

WHERE NOT (Country = 'Germany' AND Country = 'USA');

显然,单行不能同时满足两个条件,因为Country只有一个值。因此,每一行,AND 的计算结果为 false,而 NOT 将其变为 true —— 因此不会发生过滤。

比较典型的写法是:

SELECT *
FROM Customers
WHERE Country NOT IN ('Germany', 'USA');

您应该使用 OR 条件,因为同一列不能在任何时间点取多个值,因此您的条件将绑定到 return false。此外,而不是使用多个堆叠 OR 条件你应该使用 IN 运营商喜欢

WHERE Country IN ('Germany', 'USA');

(或)

WHERE Country NOT IN ('Germany', 'USA');

您的当前状况将按以下方式评估:(Country='Germany' AND Country='USA') 将 return falseNOT false 将 return true。从而使您的 WHERE 部分 true 和 return 全部结果

你被操作员优先级给坑了。括号是你的朋友,你看。

WHERE NOT Country='Germany' AND NOT Country='USA';

实际上意味着,因为 NOT 优先于 AND:

WHERE (NOT Country='Germany') AND (NOT Country='USA');

因为 "NOT a=b" 是 "a!=b",这意味着:

WHERE Country!='Germany' AND Country!='USA';

正如其他人指出的那样,这样看起来更好:

WHERE Country NOT IN ('Germany', 'USA');

现在,下一个话题。这个:

WHERE NOT (Country='Germany' AND Country='USA');

国家不能同时是德国和美国,所以 () 里面的东西总是假的,所以这等同于:

WHERE NOT (FALSE);

WHERE TRUE;

也就是说,你得到了你的全部 table。

SELECT * FROM Customers
WHERE NOT (Country='Germany' AND Country='USA');

这实际上是说这条记录不等于两者。您不能在一行中将以下内容作为肯定:

(Country='Germany' AND Country='USA')

您将通过以下方式获得所需的结果:

Where Country not in ('Germany', 'USA')