sql - 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
解决方案
括号基本上在您的查询中形成一对条件。当您在 () 中放置 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,并且该行不会在输出中返回。结果,行将在没有国家英国和美国的情况下出现
希望这会有所帮助:)
推荐阅读
- audio - 将ffmpeg音频和视频拆分到不同的管道输出
- powershell - 使用变量运行循环时出现问题
- r - 当k在R中已知时,如何计算knn的AUC ROC?
- firebase - 我如何通过多字段过滤来自firebase firestore的数据,颤动
- node.js - 未捕获的类型错误:无法读取 null 的属性“project_issue_tracker”
- reactjs - 反应分页组件编号的项目显示问题
- java - 使用 MockMVC 和 Spring Security 测试 Spring MVC 应用程序时在哪里重置 SecurityContextHolder
- javascript - 如何将此消息更改为代码块消息?
- excel - Excel VBA - 如果B列包含特定字母,则将连字符添加到A列
- coordinates - GeoServer - 预置图块与给定的边界框不匹配