2009-12-31 23 views
19

在進行沒有WHERE約束的MySQL查詢時,大多數人在查詢中使用WHERE 1。但是,省略WHERE 1不會影響查詢。兩者有什麼不同?被認爲是最佳做法嗎?WHERE 1在MySQL查詢中的重要性

回答

47

我不認爲這是最佳實踐的問題,但人們有時使用它來使構建動態查詢變得更容易一些。

string sql = "SELECT * FROM mytable WHERE 1 "; 
if (somecondition) { 
    sql += "AND somefield = somevalue "; 
} 

if (someothercondition) { 
    sql += "AND someotherfield = someothervalue "; 
} 

... etc 

沒有WHERE 1在那裏我需要在每個if塊我是否需要把在WHEREAND檢查。

+1

+1你比我快:P – Diadistis 2009-12-31 02:35:54

+0

@Eric在WHERE 1和WHERE 1 = 1之間有速度差嗎? – fire 2011-09-26 15:41:45

+0

@fire - 不知道,你需要測試才能發現,但我會認爲任何體面的優化器都會將這兩個表達式都視爲與查詢無關。 – 2011-09-27 18:43:12

11

沒有必要。 99.9%的時間意味着查詢是動態構建的,並且將WHERE 1導致動態條件子句的邏輯更簡單,這意味着您可以繼續將AND id = 3添加到查詢的末尾,並且不會破壞語法。如果您沒有WHERE 1,您不得不擔心是否存在WHERE條款,以及是否將您的條件與AND相加。

所以這只是懶惰基本上。

+6

+1但它不只是懶惰。這也是更簡單,更快,更安全 – Diadistis 2009-12-31 02:40:05

+0

KISS原則:) – Lexib0y 2016-04-09 22:44:46

8

對於自動化代碼生成器和其他SQL語句操縱器來說,這是一個較少的情況。通過使用where 1(或where 1 = 1)啓動過濾部分,您的自動代碼生成器可以添加帶有and前綴的新過濾器。

否則你會落得像代碼:

query = "select * from tbl" 
sep = " where " 
foreach clause in all_clauses: 
    query = query + sep + clause 
    sep = "and " 

這是不一樣乾淨:

query = "select * from tbl where 1 = 1" 
foreach clause in all_clauses: 
    query = query + " and " + clause 

應該讓非常差別不大什麼像樣的DBMS因爲執行引擎應該在執行查詢之前去除這些子句。

這是否是最佳實踐取決於您是否希望在查詢生成器中使用「更乾淨」的代碼,或者您是否希望公司的數據庫管理員試圖追蹤您並使用此類工具來擊敗您愚蠢的從句:-)當然,如果你使用的是MySQL,你可能會的DBA,所以這可能不成問題。