为了账号安全,请及时绑定邮箱和手机立即绑定

SQL中where子句的顺序重要吗?

SQL中where子句的顺序重要吗?

慕工程0101907 2019-11-30 14:17:30
假设我有一个叫PEOPLE3列的表ID, LastName, FirstName,这些列都没有索引。LastName比较独特,FirstName却不那么独特。如果我进行2次搜索:select * from PEOPLE where FirstName="F" and LastName="L" select * from PEOPLE where LastName="L" and FirstName="F"我认为第二个更快,因为LastName在where子句中,更独特的标准()首先出现,并且记录将更有效地消除。我认为优化器不够聪明,无法优化第一个sql。我的理解正确吗?
查看完整描述

3 回答

?
繁花如伊

TA贡献2012条经验 获得超12个赞

不,顺序无关紧要(或至少:不重要)。

任何体面的查询优化器都会查看该子句的所有部分,WHERE并找出满足该查询的最有效方法。

我知道SQL Server查询优化器将选择合适的索引-无论您有两个条件都处于哪个顺序。我假设其他RDBMS也会有类似的策略。

重要的是您是否有合适的索引!

对于SQL Server,如果您具有以下条件,它将可能使用索引:

  • 索引 (LastName, FirstName)

  • 索引 (FirstName, LastName)

  • (LastName)或或(FirstName)(或两者)的索引

另一方面-对于SQL Server而言-如果您习惯于从表中SELECT *获取所有列,并且表很小,则查询优化器很有可能只会进行表(或聚集索引)扫描而不是使用一个索引(因为查找整个数据页面以获取所有其他列的代价非常快)。


查看完整回答
反对 回复 2019-11-30
?
慕村9548890

TA贡献1884条经验 获得超4个赞

WHERE子句的顺序不应在符合SQL标准的数据库中有所作为。在大多数数据库中,不能保证评估顺序。


不要以为SQL关心顺序。以下在SQL Server中生成错误:


select *

from INFORMATION_SCHEMA.TABLES

where ISNUMERIC(table_name) = 1 and CAST(table_name as int) <> 0

如果首先执行此子句的第一部分,则仅将数字表名强制转换为整数。但是,它失败了,提供了一个清楚的示例,表明SQL Server(与其他数据库一样)不关心WHERE语句中子句的顺序。


查看完整回答
反对 回复 2019-11-30
?
慕神8447489

TA贡献1780条经验 获得超1个赞

ANSI SQL草稿2003 5WD-01-Framework-2003-09.pdf


6.3.3.3规则评估顺序


...


如果优先级不是由格式或括号确定的,则通常从左到右执行表达式的有效评估。但是,取决于表达式是否实际上是从左到右求值,这取决于实现,特别是在操作数或运算符可能导致条件升高或是否可以在不完全评估表达式所有部分的情况下确定表达式的结果时。


查看完整回答
反对 回复 2019-11-30
  • 3 回答
  • 0 关注
  • 1025 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信