这只是一个简短的问题,可以获得有关SQL如何工作的更多知识。
如果我有多个where条件的查询,例如第二个语句为false,那么查询中第二个语句之后的其余语句是否仍会被评估,或者SQL只是在此时跳过并再次开始下一行?
示例:
SELECT * FROM MY_TABLE
WHERE NAME = "PETER"
AND LANGUAGE = "ENGLISH"
AND COUNTRY = "UK"
AND ENCRYPTION = "SHA-1";
我们的数据库如下所示:
| NAME | LANGUAGE | COUNTRY | ENCRYPTION |
PETER, ENGLISH, UK, SHA-1
PETER, FRENCH, SWITZERLAND, SHA-1
PETER, ENGLISH, USA, SHA-1
现在当它到达第二个条目时,查询是否会停止在语言条件下,因为它是“false”,忽略以下条件并继续下一个条目或是否仍会检查国家和加密?
答案 0 :(得分:0)
您所描述的内容称为“短路”。实际上,大多数数据库在评估where
子句时都会发生短路 - 如果他们一次评估每个子句一次比较。
然而,这并没有什么不同。 SQL专为大数据而设计。处理数据的开销是从永久存储中读取和写入数据。通过比较,额外的计算时间通常是无关紧要的。并非总是 - 长字符串,JSON字段,复杂算术等可以增加重要的处理时间。
如果您关心性能,则应添加适当的索引。查询的最佳选择是MY_TABLE(NAME, LANGUAGE, COUNTRY, ENCRYPTION)
(或以任何顺序以这四列开头的任何索引)。如果您关心性能,那么您应该学习正确使用索引和表分区。
答案 1 :(得分:0)
这称为short circuiting
,SQL Server拥有它。
在OR
表达式中,如果第一个条件为真,则不检查其他条件,如:
例如,请参阅此简单查询,请参阅(2 / @a = 1)
应返回错误
但它没有被评估
DECLARE @a INT = 0
DECLARE @b INT = 10
SELECT 'name' AS Name
WHERE @b = 10 OR (2 / @a = 1)
在AND
表达式中,如果第一个条件为false,则不检查其他条件,如:
例如,请参阅此简单查询,请参阅(2 / @a = 1)
应返回错误
但它没有被评估
DECLARE @a INT = 0
DECLARE @b INT = 10
SELECT 'name' AS Name
WHERE @b = 14 and (2 / @a = 1)
在您使用AND
时的问题中,如果第一个条件为假,则不会检查其他条件
答案 2 :(得分:0)
SQL检查WHERE子句中的每个条件,直到找到第一个失败的条件,然后它跳过该行。否则返回行。
答案 3 :(得分:0)
SQL
是声明性的,即您的数据库系统可以选择以任何顺序评估WHERE
子句。
此外,数据库系统尝试使用索引。例如,如果在COUNTRY
上声明了索引,则您的数据库系统将使用此索引仅获取元组WITH COUNTRY='UK'
,并且它将仅评估这些元组的剩余条件。 (我假设这是唯一的简单索引)。
这比短路评估更强,因为在短路评估中,仍然存在评估顺序。在SQL
中,编写语句的方式不会强制数据库系统按特定顺序评估您的条件。数据库系统将利用它来改善查询响应时间。