[點晴永久免費OA]SQL中為什么不要使用1=1?
最近看幾個老項目的SQL條件中使用了1=1,想想自己也曾經這樣寫過,略有感觸,特別拿出來說道說道。 編寫SQL語句就像炒菜,每一種調料的使用都會影響菜品的最終味道,每一個SQL條件的加入也會影響查詢的執(zhí)行效率。那么 1=1 存在什么樣的問題呢?為什么又會使用呢? 為什么會使用 1=1?在動態(tài)構建SQL查詢時,開發(fā)者可能會不確定最終需要哪些條件。這時候,他們就會使用“1=1”作為一個始終為真的條件,讓接下來的所有條件都可以方便地用“AND”連接起來,就像是搭積木的時候先放一個基座,其他的積木塊都可以在這個基座上疊加。 就像下邊這樣: SELECT * FROM table WHERE 1=1 <if test="username != null"> AND username = #{username} </if> <if test="age > 0"> AND age = #{age} </if> 這樣就不用在增加每個條件之前先判斷是否需要添加“AND”。 1=1 帶來的問題性能問題?有的同學會擔心 1=1 給數(shù)據(jù)庫帶來額外的負擔,產生性能問題。 這實際上可能不會發(fā)生,因為現(xiàn)代數(shù)據(jù)庫的查詢優(yōu)化器已經非常智能,它們通常能夠識別出像 1=1 這樣的恒真條件,并在執(zhí)行查詢計劃時優(yōu)化掉它們。在許多情況下,即使查詢中包含了1=1,數(shù)據(jù)庫的性能也不會受到太大影響,優(yōu)化器會在實際執(zhí)行查詢時將其忽略。 但是現(xiàn)代優(yōu)化器雖然很強大,但它們并不是萬能的。在某些復雜的查詢場景中,即使是簡單的 1=1 也可能對優(yōu)化器的決策造成不必要的影響。 代碼質量我們仍然需要避免在查詢中包含 1=1,因為還有以下幾點考慮:
編寫盡可能高效、清晰和準確的SQL語句,不僅有助于保持代碼的質量,也讓代碼具有更好的可維護性和可擴展性。 替代 1=1 的更佳做法現(xiàn)在開發(fā)者普遍使用ORM框架來操作數(shù)據(jù)庫了,還在完全手寫拼SQL的同學可能需要反思下了,這里給兩個不同ORM框架下替代1=1的方法。 假設我們有一個用戶信息表 user,并希望根據(jù)傳入的參數(shù)動態(tài)地過濾用戶。 首先是Mybatis: <!-- MyBatis映射文件片段 --> <select id="selectUsersByConditions" parameterType="map" resultType="com.example.User"> SELECT * FROM user <where> <!-- 使用if標簽動態(tài)添加條件 --> <if test="username != null and username != ''"> AND username = #{username} </if> <if test="age > 0"> AND age = #{age} </if> <!-- 更多條件... --> </where> </select> 在 MyBatis 中,避免使用 WHERE 1=1 的典型方法是利用動態(tài)SQL標簽(如 <if>)來構建條件查詢。<where> 標簽會自動處理首條條件前的 AND 或 OR。當沒有滿足條件的 <if> 或其他條件標簽時,<where> 標簽內部的所有內容將被忽略,從而不會生成多余的 AND 或 WHERE 子句。 再看看 Entity Framework 的方法: var query = context.User.AsQueryable(); if (!string.IsNullOrEmpty(username)) { query = query.Where(b => b.UserName.Contains(username)); } if (age>0) { query = query.Where(b => b.Age = age); } var users = query.ToList(); 這是一種函數(shù)式編程的寫法,最終生成SQL時,框架會決定是否在條件前增加AND,而不需要人為的增加 1=1。 總結“1=1”在SQL語句中可能看起來無害,但實際上它是一種不良的編程習慣,可能會導致性能下降。就像在做飯時不會無緣無故地多加調料一樣,我們在編寫SQL語句時也應該避免添加無意義的條件。 每一行代碼都應該有它存在的理由,不要讓人和數(shù)據(jù)庫浪費時間在不必要的事情上。 本文作者:螢火架構,轉自https://www.cnblogs.com/bossma/p/18024285 ------------ 個人觀點:看個樂行了,1=1該用就用無需顧慮那么多。 該文章在 2024/2/24 16:20:49 編輯過 |
關鍵字查詢
相關文章
正在查詢... |