例如,在sql server 2017上的northwind示例中,
当我使用
SELECT * FROM CUSTOMERS
WHERE NOT (COUNTRY='UK' AND NOT COUNTRY='USA')
它显示的是来自其他国家和美国的客户,而不是来自英国的客户
当我使用
SELECT * FROM CUSTOMERS
WHERE NOT (COUNTRY='UK' AND COUNTRY='USA')
它展示了包括美国和英国在内的每个国家的客户
我知道我可以用
SELECT * FROM CUSTOMERS
WHERE NOT (COUNTRY='UK' OR COUNTRY='USA')
这会告诉我我想要的结果。
但我想知道他怎么样了
SELECT * FROM CUSTOMERS
WHERE NOT (COUNTRY='UK' AND NOT COUNTRY='USA')
和
SELECT * FROM CUSTOMERS
WHERE NOT (COUNTRY='UK' AND COUNTRY='USA')
不同于
SELECT * FROM CUSTOMERS
WHERE NOT COUNTRY='UK' AND NOT COUNTRY='USA'
从sql的视角
2条答案
按热度按时间koaltpgm1#
括号基本上是在查询中生成一对条件。当您在()中放置2个条件时,这意味着两个条件一起将返回一个true/false。此true/false将添加到()之外的其他条件中。您正在()中检查两个条件,它们由一个和连接起来,这意味着如果两个条件都为true,它将返回true。如果任何一个是假的,这将返回假。
例如,您的第一个查询-
您的第一个检查是country='uk',这意味着如果国家是'uk',它将返回true。您添加了另一个条件,该条件不是country='usa',而是and运算符。当任何国家/地区不为“美国”时,此条件将返回true。在组合中,当country='uk'时,这两部分都将返回true。对于任何其他情况,至少有一方返回false,它们一起返回false。
因此,如果country='uk',我们可以将条件转换为-
因此,当您的国家栏包含'uk'时,它返回false,因此,您将获得除'uk'之外的所有国家记录
在你的第二个问题中-
内部部分总是返回false,因为两个国家不能同时存在。因此,我们可以将您的where部分转换为-
这意味着它将返回真的所有情况下,你得到的结果,为所有国家在这里。
在你的第三个问题中-
如果国家是英国或美国,内部部分将返回true。因此,如果国家是英国或美国,我们可以将您的where部分转换为-
这意味着,如果国家是英国或美国,则返回false,因此您将获得列表中除英国和美国以外的所有其他国家。由于此查询将为您提供预期输出,因此基本上相当于下面的查询-
您的最后一个查询是without(),这意味着两个检查都是独立的,并且当您通过和连接它们时,检查的两个部分都必须为true
这基本上是一个类似-
所以很明显,如果值是uk或usa,条件的一部分将为false,并且该行将不会在输出中返回。如果没有英国和美国的支持,争吵将会发生
希望这能有所帮助:)
ilmyapht2#
这里有简单的逻辑:
将一切都不是(英国),最后一部分是不需要的-你已经说过排除国家必须是英国在括号内。
因为一个国家不能同时是英国和美国,所以什么也不归还
任何不是英国或美国的行