2

我在 MySQL 中运行以下查询:

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

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

之后我运行以下查询:

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

这次它返回了表中存在的所有记录(查询的结果集SELECT * FROM Customers;

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

您可以转到此链接并检查:

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

4 回答 4

6

你被运营商优先级咬了。括号是你的朋友,你看。

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');

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

WHERE NOT (FALSE);

IE

WHERE TRUE;

即,你得到你的整张桌子。

于 2017-03-30T18:54:10.790 回答
4

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

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

你的条件是:

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

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

更典型的写法是:

SELECT *
FROM Customers
WHERE Country NOT IN ('Germany', 'USA');
于 2017-03-30T18:43:07.967 回答
3

您应该使用OR条件而不是因为同一列在任何时间点都不能取多个值,因此您的条件必然会返回falseOR此外,您应该使用IN运算符,而不是使用多个堆叠条件

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

(或者)

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

您当前的状况将按如下方式评估:(Country='Germany' AND Country='USA')will returnfalseNOT falsewill return true。从而发挥你的WHERE作用true并返回所有结果

于 2017-03-30T18:50:52.563 回答
1
SELECT * FROM Customers
WHERE NOT (Country='Germany' AND Country='USA');

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

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

您将通过以下方式获得您正在寻找的结果:

Where Country not in ('Germany', 'USA')
于 2017-03-30T18:59:40.730 回答