首页 > 解决方案 > SQL 如何解释括号及其中的顺序?

问题描述

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

标签: sqlsql-server

解决方案


括号基本上在您的查询中形成一对条件。当您在 () 中放置 2 个条件时,这意味着两个条件一起将返回一个 True/False。这个 True/False 然后将添加到 () 之外的其他条件。您正在检查 () 中的 2 个条件,它们由 AND 连接,这意味着如果两个条件都为 True,它将返回 True。如果任何一个为 False,这将返回 False。

例如您的第一个查询-

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

您的第一个检查是 COUNTRY='UK',这意味着如果国家/地区是 'UK',它将返回 True。您使用 AND 运算符添加了另一个条件 NOT COUNTRY='USA'。当国家 NOT = 'USA' 时,此条件将返回 True。结合起来,当 Country = 'UK' 时,这两个部分都将返回 True。对于任何其他情况,至少一侧将返回 False,并且它们一起将返回 False。

因此,如果 COUNTRY='UK',我们可以将条件转换为-

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

因此,当您的国家/地区列包含“英国”时,它返回 FALSE,因此,您将获得除“英国”以外的所有国家/地区记录

在您的第二个查询中-

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

内部将始终返回 False,因为一次不能有 2 个国家/地区。因此,我们可以将您的 where 部分转换为 -

NOT(FALSE) >> True

这意味着它将在所有情况下返回 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')

您的最终查询没有 () 这意味着两个检查都是独立的,并且当您通过 AND 加入它们时,检查的两个部分都必须为 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,并且该行不会在输出中返回。结果,行将在没有国家英国和美国的情况下出现

希望这会有所帮助:)


推荐阅读