SQL如何处理Oracle 11g中的where子句?
这只是一个简单的问题,以获得有关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
现在,当它到达第二个条目,将在语言条件查询停止,因为它是“假” ,请忽略以下条件并继续进行下一个条目,否则它会检查国家和加密吗?
SQL
是声明性的,即您的数据库系统可以选择以任何顺序评估WHERE
子句。
此外,数据库系统尝试使用索引。例如,如果你有一个在COUNTRY
上声明的索引,你的数据库系统将使用这个索引来得到元组WITH WITH SOURCE SOURCE,它只会评估这些元组的剩余条件。 (为了简单,我假设这是唯一的索引)。
这比短路评估更强,因为在短路评估中,仍然存在一个评估顺序。在SQL
中,您编写语句的方式不会强制数据库系统按特定顺序评估您的条件。数据库系统将利用它来改善查询响应时间。
你所描述的是所谓的“短路”。事实上,大多数数据库在评估where
条款时会发生短路 - 如果他们一次只评估一个条款的每个条款。
但是,这并没有什么区别。 SQL是为大数据而设计的。处理数据的开销是从永久存储中读取和写入数据。额外的计算时间通常与比较无关。并不总是 - 长字符串,JSON字段,复杂算术等可以增加重要的处理时间。
如果你关心性能,你应该添加适当的索引。最适合您的查询将在MY_TABLE(NAME, LANGUAGE, COUNTRY, ENCRYPTION)
(或以任意顺序以这四列开头的任何索引)。如果您关心性能,正确使用索引和表分区是您应该了解的内容。
你怎么知道索引(名称,语言,国家,加密)将是最好的? – jarlh
@jarlh。 。 。我澄清。任何以任意顺序开头的索引。 –
这叫做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
,它不检查其他条件,如果第一个条件是假
SQL支票在每个条件WHERE子句,直到找到第一个失败的条件,然后跳过该行。否则,返回行。
您正在使用哪个[DBMS](https://en.wikipedia.org/wiki/DBMS)产品? Postgres的?甲骨文? “_SQL_”只是一种查询语言,而不是特定数据库产品的名称。但是一般来说,“SQL”不会对表达式进行短路。 –
MySQL也对WHERE条件中的条件执行短路评估,但它不一定按您在查询中编写它们的顺序对它们进行评估。无论如何,为了查询的目的,它应该没有关系。 – axiac