SQL如何处理Oracle 11g中的where子句?

时间:2017-10-13 12:11:44

标签: sql where-clause

这只是一个简短的问题,可以获得有关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”,忽略以下条件并继续下一个条目或是否仍会检查国家和加密?

4 个答案:

答案 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中,编写语句的方式不会强制数据库系统按特定顺序评估您的条件。数据库系统将利用它来改善查询响应时间。