我在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
答案 0 :(得分:3)
是的,当然可以。但是,根据布尔逻辑的规则,正确的公式使用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');
将其变为真 - 所以不进行过滤。
更典型的写法是:
php artisan list
答案 1 :(得分:3)
您应该使用OR
条件,因为同一列不能在任何时间点取多个值,因此您的条件必然会返回false
。此外,您应该使用OR
运算符
IN
条件
WHERE Country IN ('Germany', 'USA');
(OR)
WHERE Country NOT IN ('Germany', 'USA');
您的当前状况将按以下方式评估:(Country='Germany' AND Country='USA')
将返回false
,NOT false
将返回true
。从而使您的WHERE
部分true
并返回所有结果
答案 2 :(得分:2)
你被操作员优先考虑了。你知道括号是你的朋友。
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;
即,你得到了整张桌子。
答案 3 :(得分:1)
SELECT * FROM Customers
WHERE NOT (Country='Germany' AND Country='USA');
这才是真正说的是这个记录同时不等于两者。你不可能有一行你有以下积极的一面:
(Country='Germany' AND Country='USA')
您可以通过以下方式获得所需的结果:
Where Country not in ('Germany', 'USA')