SQL如何处理条件

时间:2017-09-22 15:30:29

标签: sql sql-server

我想知道如何查询

SELECT * FROM A WHERE A.created_by = 1 AND (A.name LIKE %app% OR A.description LIKE %app%)

正在处理中。我不是,如果这是一个有效的查询,但我认为这个想法很清楚。

从我的角度来看,我不确定SQL Server是否通过该条件处理每一行并检查它是否通过它然后返回通过该条件的所有行,或者SQL Server是否为每个行收集数据集条件,然后交叉/组合它们以获得最终数据集(如created_by收集一个数据集,该数据集稍后与其他两个条件收集的组合数据集相交),或者以其他更抽象的方式完成(至少对我来说)方法。

我希望我的问题足够具体。如果我不够清楚,请询问我将提供的进一步解释。

2 个答案:

答案 0 :(得分:0)

在SQL中无法保证评估顺序,它将取决于RDBMS的实现。

  

6.3.3.3规则评估顺序

     

[...]

     

优先级不是由格式决定的   括号,表达式的有效评价一般   从左到右执行。但是,它依赖于实现   表达式是否实际上从左到右进行了评估,尤其是   当操作数或运算符可能导致条件被提升或者是否   表达式的结果可以在没有完全确定的情况下确定   评估表达式的所有部分。

来自here

通常,RDBMS会尝试尽可能地优化查询,并产生可能最终重新排序查询的最佳结果。索引可以发挥巨大作用。如果您在WHERE子句中使用索引字段,则无论在WHERE子句中写入哪个字段,都可能会首先评估其中一个约束,因为评估时获得的速度有利索引列。

如果您对如何处理该查询更加好奇,可以检查您的RDBMS是否提供了显示查询执行计划的选项。在那里,您通常可以看到条款的评估顺序。

答案 1 :(得分:0)

即使对于相同的SQL查询,SQL服务器也可以使用不同的策略。

SQL Server查看使用了哪些条件/连接/选定字段,并查看涉及的表,索引等,以决定要执行的操作。

例如。如果聚簇索引具有正确顺序查询中使用的所有字段,则SQL Server不会触及原始表,但只会从索引中读取数据。

要知道您的查询是哪种情况,您只能要求实际的执行计划。您可以在Management Studio中找到。它是一个按钮,当激活时,它将导致SQL服务器不仅返回查询的任何结果,还会执行包含执行该查询时SQL服务器使用的所有算法的执行计划。

PS例如,问题SQL Server必须通过开头.your-class:after{ visibility: visible; content: ''; background-color: #fff; display: inline-block; position: relative; width: 2px; height: 1em; top: 5px; margin-left: 3px; } 中的通配符进行字符串搜索,因此无法优化表格中的所有行。