2017-10-13 110 views
0

这只是一个简单的问题,以获得有关SQL如何工作的更多知识。SQL如何处理Oracle 11g中的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 

现在,当它到达第二个条目,将在语言条件查询停止,因为它是“假” ,请忽略以下条件并继续进行下一个条目,否则它会检查国家和加密吗?

+6

您正在使用哪个[DBMS](https://en.wikipedia.org/wiki/DBMS)产品? Postgres的?甲骨文? “_SQL_”只是一种查询语言,而不是特定数据库产品的名称。但是一般来说,“SQL”不会对表达式进行短路。 –

+0

MySQL也对WHERE条件中的条件执行短路评估,但它不一定按您在查询中编写它们的顺序对它们进行评估。无论如何,为了查询的目的,它应该没有关系。 – axiac

回答

0

SQL是声明性的,即您的数据库系统可以选择以任何顺序评估WHERE子句。

此外,数据库系统尝试使用索引。例如,如果你有一个在COUNTRY上声明的索引,你的数据库系统将使用这个索引来得到元组WITH WITH SOURCE SOURCE,它只会评估这些元组的剩余条件。 (为了简单,我假设这是唯一的索引)。

这比短路评估更强,因为在短路评估中,仍然存在一个评估顺序。在SQL中,您编写语句的方式不会强制数据库系统按特定顺序评估您的条件。数据库系统将利用它来改善查询响应时间。

0

你所描述的是所谓的“短路”。事实上,大多数数据库在评估where条款时会发生短路 - 如果他们一次只评估一个条款的每个条款。

但是,这并没有什么区别。 SQL是为大数据而设计的。处理数据的开销是从永久存储中读取和写入数据。额外的计算时间通常与比较无关。并不总是 - 长字符串,JSON字段,复杂算术等可以增加重要的处理时间。

如果你关心性能,你应该添加适当的索引。最适合您的查询将在MY_TABLE(NAME, LANGUAGE, COUNTRY, ENCRYPTION)(或以任意顺序以这四列开头的任何索引)。如果您关心性能,正确使用索引和表分区是您应该了解的内容。

+0

你怎么知道索引(名称,语言,国家,加密)将是最好的? – jarlh

+0

@jarlh。 。 。我澄清。任何以任意顺序开头的索引。 –

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,它不检查其他条件,如果第一个条件是假

0

SQL支票在每个条件WHERE子句,直到找到第一个失败的条件,然后跳过该行。否则,返回行。