2009-04-21 76 views
0

大多數SQL查詢對where子句沒有數學操作。爲什麼'MS SQL中的數學函數在Where子句中'?

讓他們在'where子句'上有什麼問題? 是否有任何性能問題?

例如:

SELECT * FROM僱員薪水WHERE * 3 = 5000

+0

你問什麼類型的數學運算的? – 2009-04-21 10:43:18

+1

請舉個例子,你的問題現在太模糊了,不能回答。 – 2009-04-21 10:43:30

回答

11

如果where子句可以利用一個索引,它通常(但不總是)更快。在字段上使用數學運算將停止使用索引。例如,如果您有一個包含一百萬行的表和一個已編制索引的日期列,則查詢1在此遠遠超出查詢2(它們都會檢索所有日期在過去7天內的行) :

查詢1:

select date from table where date > dateadd(d, -7, getdate()) 

查詢2:

select date from table where dateadd(d, 7, date) > getdate() 

在您的例子,第e查詢會好得多:

select * from employee where salary = (5000/3) 
+0

對於一個很好的樣本+1 ... – Lucero 2009-04-21 10:48:58

1

咦?不,在一個where子句中有數學是沒有問題的。 where子句可以包含任何使用列名稱,函數或常量的表達式,只要表達式是合法謂詞即可。

CK提供了以下兩個例子:

選擇日期從表,其中日期> DATEADD(d,-7,GETDATE())

從表

選擇日期其中DATEADD(d,7,日期)> getdate()

並解釋第一個可能更快,因爲它可以使用索引。

ck的正確,但也應該注意,第一個可以更快,因爲dateadd(d, -7, getdate())是一個常量表達式(只需要計算一次,無論行數是多少),而dateadd(d, 7, date)需要評估爲每一行。

但是都是 ck的例子是在where子句中使用的「數學」(表達式)的例子,這是OP所要求的。

1

你能舉個例子......你可以用某些功能

SELECT filter, count(*) FROM Test GROUP BY filter HAVING count(*) > 1 

,如果你想在MAXMIN等使用HAVING條款同樣的邏輯也適用於在WHERE子句後使用HAVING條款..

爲了您的例子中,你需要圍繞工資* 3括號

WHERE (Salary * 3) > 5000