<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SQL中為什么不要使用1=1?

          共 3970字,需瀏覽 8分鐘

           ·

          2024-08-19 07:40

          閱讀本文大概需要 4 分鐘。

          來自:

          推薦一個程序員編程資料站:
          http://cxyroad.com

          2024年IDEA最新激活方法
          后臺回復(fù):激活碼

          CSDN免登錄復(fù)制代碼插件下載:
          CSDN復(fù)制插件

          以下是正文。




          在工作中的老項目中經(jīng)常會看到代碼中使用了1=1的情況,想起來之前自己也這個樣子寫過,感覺也沒有啥影響就沒有當(dāng)回事,隨著工作年限,工作經(jīng)驗的增加,對著一塊有了更深的理解,下面我們就來看一看
          代碼開發(fā)中,編寫SQL語句其實就和家常炒菜差不多,每個條件語句就是一個調(diào)料,所以每一種調(diào)料都會影響菜的味道,對于SQL來說查詢條件的增加,影響的就是執(zhí)行SQL的效率。那么1=1這種為什么又會存在呢,存在即有它的道理,下面我們更深一層次的分析一下。
          為什么會使用 1=1?
          Java代碼開發(fā)中,使用最多的 Mybatis框架,在判斷條件的時候,會在條件前面增加AND連接,而有的條件不需要拼接,所以為了第一個條件是否要帶AND連接符,出現(xiàn)了始終為真的1=1的條件。
          就像下邊這樣:

          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 帶來的問題
          性能問題?
          對于數(shù)據(jù)庫的查詢優(yōu)化器了解的就會知道,其實寫了1=1這種條件,在SQL語句經(jīng)過優(yōu)化器的時候也會被優(yōu)化掉,但是對于不同的數(shù)據(jù)庫就有了不同的結(jié)果。另一個點就是如果都是1=1,沒有進(jìn)行優(yōu)化,相當(dāng)于把表中的全部數(shù)據(jù)都要進(jìn)行一遍循環(huán),判斷一下這個毫無用處的條件是否滿足。
          查詢優(yōu)化器就相當(dāng)于是個圖書管理員,他知道如何最快的查找到你所需要的書,當(dāng)你告訴它你所需要的書的特征之后,他會根據(jù)這些信息選擇一個最快定位到該圖書的方式路徑。
          但是如果我們告訴它一些無關(guān)緊要的信息,這不就相當(dāng)于廢話了嗎,加密??哈哈哈哈哈想起來廢話文學(xué)了,聽君一席話,勝聽一席話啊。所以說的多不一定有用,只需要把關(guān)鍵信息提供出來就可以。一個帶有“1=1”的查詢可能就相當(dāng)與讓圖書管理員一本書一本書的去比較來檢查是不是你所需要的,顯然這是不合理的。
          你可能會說:數(shù)據(jù)庫沒有這么傻吧?
          確實,數(shù)據(jù)庫不會這點都沒做好。數(shù)據(jù)庫在執(zhí)行查詢的時候都會把這種1=1的始終為真的條件進(jìn)行優(yōu)化掉,對于數(shù)據(jù)庫的性能也不會收到太多的影響。但是優(yōu)化器也不是萬能的,在個別的場景中還是有可能會造成全表掃描的,所以我們還是要避免的。
          代碼質(zhì)量
          在代碼質(zhì)量的角度來看,我們也是需要避免“1=1”這種寫法的,可以從以下幾點來考慮:
          • 代碼清晰性: 在復(fù)雜的SQL中,避免“1=1”這種引起歧義。
          • 習(xí)慣: 代碼規(guī)范。
          • 兼容: 跨數(shù)據(jù)的兼容性。避免有的數(shù)據(jù)庫無法進(jìn)行優(yōu)化掉“1=1”這種條件造成的全表掃描。
          編寫盡可能高效、清晰和準(zhǔn)確的SQL語句,不僅有助于保持代碼的質(zhì)量,也讓代碼具有更好的可維護(hù)性和可擴(kuò)展性。
          替代 1=1 的更佳做法
          在代碼開發(fā)中,使用MyBatis框架的居多,所以我們可以使用Where標(biāo)簽來進(jìn)行優(yōu)化SQL寫法。
          假設(shè)我們有一個用戶信息表 user,并希望根據(jù)傳入的參數(shù)動態(tài)地過濾用戶。
          首先是Mybatis:

          <!-- MyBatis映射文件片段 -->
          <select id='selectUsersByConditions' parameterType='map' resultType='com.example.User'>
            SELECT * FROM user
          <where>
          <!-- 使用if標(biāo)簽動態(tài)添加條件 -->
          <if test='username != null and username != '''>
                AND username = #{username}
          </if>
          <if test='age > 0'>
                AND age = #{age}
          </if>
          <!-- 更多條件... -->
          </where>
          </select>

          在 MyBatis 中,避免使用 1=1 的典型方法是利用動態(tài)SQL標(biāo)簽(如 <if>)來構(gòu)建條件查詢。<where> 標(biāo)簽會自動處理首條條件前的 AND 或 OR。當(dāng)沒有滿足條件的 <if> 或其他條件標(biāo)簽時,<where> 標(biāo)簽內(nèi)部的所有內(nèi)容都會被忽略,從而不會生成多余的 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。
          總結(jié)
          “1=1”在SQL語句中可能看起來無害,但實際上它是一種不良的編程習(xí)慣,可能會導(dǎo)致性能下降。就像在做飯時不會無緣無故地多加調(diào)料一樣,我們在編寫SQL語句時也應(yīng)該避免添加無意義的條件。
          每一行代碼都應(yīng)該有它存在的理由,不要讓人和數(shù)據(jù)庫浪費時間在不必要的事情上。

          <END>

          推薦閱讀:

          Facebook為什么要棄用Git?

          Spring-Security 認(rèn)證流程分析及多方式登錄認(rèn)證實踐

               
          程序員在線工具站:cxytools.com

          推薦一個自己寫的工具站:http://cxytools.com,專為程序員設(shè)計,包括時間日期、JSON處理、SQL格式化、隨機(jī)字符串生成、UUID生成、文本Hash...等功能,提升開發(fā)效率。

          ?戳閱讀原文直達(dá)!                                  朕已閱 

          瀏覽 112
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  www亚洲天堂 | 蜜桃成人综合 | 国产精品卡_卡2卡3卡4一商战-信息网 | 黄色五月天视频 | 二区三区导航 |