3
我在一次採訪中被問到棘手的SQL問題。值之間的區別=字段與字段=值在sql中
Select * from Employee where EmployeeId = 23
Select * from Employee where 23 = EmployeeId
請幫我找出上述聲明之間的區別,是否有關於索引?
我在一次採訪中被問到棘手的SQL問題。值之間的區別=字段與字段=值在sql中
Select * from Employee where EmployeeId = 23
Select * from Employee where 23 = EmployeeId
請幫我找出上述聲明之間的區別,是否有關於索引?
我在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;
沒有在桌子上它不一樣,表掃描索引:
如果添加一個索引,然後做兩個相同的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;
如果你打算去測試它,記得要刪除該表:)
DROP TABLE #Employees;
等於運算符和假設一個健全的優化,就應該同樣評估。 –
現代的RDBMS足夠聰明,可以把'where'當作* same *;如果你想強制*全面掃描*(在'EmployeeId'上沒有索引使用),把它作爲'EmployeeId * 1 = 23'或者一樣 –
完全沒有區別。 None anyove –