sql server—sql如何解释括号及其顺序?

txu3uszq  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(262)

例如,在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的视角

koaltpgm

koaltpgm1#

括号基本上是在查询中生成一对条件。当您在()中放置2个条件时,这意味着两个条件一起将返回一个true/false。此true/false将添加到()之外的其他条件中。您正在()中检查两个条件,它们由一个和连接起来,这意味着如果两个条件都为true,它将返回true。如果任何一个是假的,这将返回假。
例如,您的第一个查询-

SELECT * FROM CUSTOMERS
WHERE NOT (COUNTRY='UK' AND NOT COUNTRY='USA')

您的第一个检查是country='uk',这意味着如果国家是'uk',它将返回true。您添加了另一个条件,该条件不是country='usa',而是and运算符。当任何国家/地区不为“美国”时,此条件将返回true。在组合中,当country='uk'时,这两部分都将返回true。对于任何其他情况,至少有一方返回false,它们一起返回false。
因此,如果country='uk',我们可以将条件转换为-

NOT(True AND True) >> NOT(True) >> False

因此,当您的国家栏包含'uk'时,它返回false,因此,您将获得除'uk'之外的所有国家记录
在你的第二个问题中-

SELECT * FROM CUSTOMERS
WHERE NOT (COUNTRY='UK' AND COUNTRY='USA')

内部部分总是返回false,因为两个国家不能同时存在。因此,我们可以将您的where部分转换为-

NOT(FALSE) >> True

这意味着它将返回真的所有情况下,你得到的结果,为所有国家在这里。
在你的第三个问题中-

SELECT * FROM CUSTOMERS
WHERE NOT (COUNTRY='UK' OR COUNTRY='USA')

如果国家是英国或美国,内部部分将返回true。因此,如果国家是英国或美国,我们可以将您的where部分转换为-

NOT(True) >> False

这意味着,如果国家是英国或美国,则返回false,因此您将获得列表中除英国和美国以外的所有其他国家。由于此查询将为您提供预期输出,因此基本上相当于下面的查询-

SELECT * FROM CUSTOMERS
WHERE COUNTRY NOT IN ('UK','USA')

您的最后一个查询是without(),这意味着两个检查都是独立的,并且当您通过和连接它们时,检查的两个部分都必须为true

SELECT * FROM CUSTOMERS
WHERE NOT COUNTRY='UK' AND NOT COUNTRY='USA'

这基本上是一个类似-

SELECT * FROM CUSTOMERS
WHERE (NOT COUNTRY='UK') AND (NOT COUNTRY='USA')

所以很明显,如果值是uk或usa,条件的一部分将为false,并且该行将不会在输出中返回。如果没有英国和美国的支持,争吵将会发生
希望这能有所帮助:)

ilmyapht

ilmyapht2#

这里有简单的逻辑:

NOT (COUNTRY='UK' AND NOT COUNTRY='USA')

将一切都不是(英国),最后一部分是不需要的-你已经说过排除国家必须是英国在括号内。

NOT (COUNTRY='UK' AND COUNTRY='USA')

因为一个国家不能同时是英国和美国,所以什么也不归还

NOT COUNTRY='UK' AND NOT COUNTRY='USA'

任何不是英国或美国的行

相关问题