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 false
和 NOT 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')
我 运行 在 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 false
和 NOT 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')