2017-10-10 53 views
3

我在一次採訪中被問到棘手的SQL問題。值之間的區別=字段與字段=值在sql中

Select * from Employee where EmployeeId = 23 
Select * from Employee where 23 = EmployeeId 

請幫我找出上述聲明之間的區別,是否有關於索引?

+1

等於運算符和假設一個健全的優化,就應該同樣評估。 –

+1

現代的RDBMS足夠聰明,可以把'where'當作* same *;如果你想強制*全面掃描*(在'EmployeeId'上沒有索引使用),把它作爲'EmployeeId * 1 = 23'或者一樣 –

+2

完全沒有區別。 None anyove –

回答

2

我在SQL Server中這樣做了,但我認爲每個優化器都以相同的邏輯方式工作。這兩個查詢做同樣的事情:

CREATE TABLE #Employees (ID INT IDENTITY(1, 1), name NVARCHAR(100)); 
INSERT INTO #Employees VALUES('Test1'), ('Test2'); 

SELECT * FROM #Employees WHERE ID = 1; 
SELECT * FROM #Employees WHERE 1 = ID; 

沒有在桌子上它不一樣,表掃描索引:

enter image description here

如果添加一個索引,然後做兩個相同的querys你會得到同樣的計劃,但有一個索引查找,而不是表掃描

ALTER TABLE #Employees ADD CONSTRAINT [PK_Employees] PRIMARY KEY CLUSTERED([ID] ASC); 

SELECT * FROM #Employees WHERE ID = 1; 
SELECT * FROM #Employees WHERE 1 = ID; 

enter image description here

如果你打算去測試它,記得要刪除該表:)

DROP TABLE #Employees;