3 回答

TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個(gè)贊
不,順序無關(guān)緊要(或至少:不重要)。
任何體面的查詢優(yōu)化器都會查看該子句的所有部分,WHERE
并找出滿足該查詢的最有效方法。
我知道SQL Server查詢優(yōu)化器將選擇合適的索引-無論您有兩個(gè)條件都處于哪個(gè)順序。我假設(shè)其他RDBMS也會有類似的策略。
重要的是您是否有合適的索引!
對于SQL Server,如果您具有以下條件,它將可能使用索引:
索引
(LastName, FirstName)
索引
(FirstName, LastName)
(LastName)
或或(FirstName)
(或兩者)的索引
另一方面-對于SQL Server而言-如果您習(xí)慣于從表中SELECT *
獲取所有列,并且表很小,則查詢優(yōu)化器很有可能只會進(jìn)行表(或聚集索引)掃描而不是使用一個(gè)索引(因?yàn)椴檎艺麄€(gè)數(shù)據(jù)頁面以獲取所有其他列的代價(jià)非常快)。

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊
WHERE子句的順序不應(yīng)在符合SQL標(biāo)準(zhǔn)的數(shù)據(jù)庫中有所作為。在大多數(shù)數(shù)據(jù)庫中,不能保證評估順序。
不要以為SQL關(guān)心順序。以下在SQL Server中生成錯(cuò)誤:
select *
from INFORMATION_SCHEMA.TABLES
where ISNUMERIC(table_name) = 1 and CAST(table_name as int) <> 0
如果首先執(zhí)行此子句的第一部分,則僅將數(shù)字表名強(qiáng)制轉(zhuǎn)換為整數(shù)。但是,它失敗了,提供了一個(gè)清楚的示例,表明SQL Server(與其他數(shù)據(jù)庫一樣)不關(guān)心WHERE語句中子句的順序。

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超1個(gè)贊
ANSI SQL草稿2003 5WD-01-Framework-2003-09.pdf
6.3.3.3規(guī)則評估順序
...
如果優(yōu)先級不是由格式或括號確定的,則通常從左到右執(zhí)行表達(dá)式的有效評估。但是,取決于表達(dá)式是否實(shí)際上是從左到右求值,這取決于實(shí)現(xiàn),特別是在操作數(shù)或運(yùn)算符可能導(dǎo)致條件升高或是否可以在不完全評估表達(dá)式所有部分的情況下確定表達(dá)式的結(jié)果時(shí)。
添加回答
舉報(bào)