欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

[點晴永久免費OA]SQL中為什么不要使用1=1?

freeflydom
2024年2月24日 16:15 本文熱度 875

最近看幾個老項目的SQL條件中使用了1=1,想想自己也曾經這樣寫過,略有感觸,特別拿出來說道說道。

編寫SQL語句就像炒菜,每一種調料的使用都會影響菜品的最終味道,每一個SQL條件的加入也會影響查詢的執行效率。那么 1=1 存在什么樣的問題呢?為什么又會使用呢?

為什么會使用 1=1?

在動態構建SQL查詢時,開發者可能會不確定最終需要哪些條件。這時候,他們就會使用“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 給數據庫帶來額外的負擔,產生性能問題。

這實際上可能不會發生,因為現代數據庫的查詢優化器已經非常智能,它們通常能夠識別出像 1=1 這樣的恒真條件,并在執行查詢計劃時優化掉它們。在許多情況下,即使查詢中包含了1=1,數據庫的性能也不會受到太大影響,優化器會在實際執行查詢時將其忽略。

但是現代優化器雖然很強大,但它們并不是萬能的。在某些復雜的查詢場景中,即使是簡單的 1=1 也可能對優化器的決策造成不必要的影響。

代碼質量

我們仍然需要避免在查詢中包含 1=1,因為還有以下幾點考慮:

  1. 代碼清晰性:即使數據庫可以優化掉這樣的條件,但對于閱讀SQL代碼的人來說,1=1可能會造成困惑。代碼的可讀性和清晰性非常重要,特別是在團隊協作的環境中。

  2. 習慣養成:即使在當前的數據庫系統中1=1不會帶來性能問題,習慣了寫不必要的代碼可能會在其他情況下引入實際的性能問題。比如,更復雜的無用條件可能不會那么容易被優化掉。

  3. 跨數據庫兼容性:不同的數據庫管理系統(DBMS)可能有不同的優化器能力。一個系統可能輕松優化掉1=1,而另一個系統則可能不那么高效。編寫不依賴于特定優化器行為的SQL語句是一個好習慣。

編寫盡可能高效、清晰和準確的SQL語句,不僅有助于保持代碼的質量,也讓代碼具有更好的可維護性和可擴展性。

替代 1=1 的更佳做法

現在開發者普遍使用ORM框架來操作數據庫了,還在完全手寫拼SQL的同學可能需要反思下了,這里給兩個不同ORM框架下替代1=1的方法。

假設我們有一個用戶信息表 user,并希望根據傳入的參數動態地過濾用戶。

首先是Mybatis

<!-- MyBatis映射文件片段 -->

<select id="selectUsersByConditions" parameterType="map" resultType="com.example.User">

  SELECT * FROM user

  <where>

    <!-- 使用if標簽動態添加條件 -->

    <if test="username != null and username != ''">

      AND username = #{username}

    </if>

    <if test="age > 0">

      AND age = #{age}

    </if>

    <!-- 更多條件... -->

  </where>

</select>

在 MyBatis 中,避免使用 WHERE 1=1 的典型方法是利用動態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();

這是一種函數式編程的寫法,最終生成SQL時,框架會決定是否在條件前增加AND,而不需要人為的增加 1=1。

總結

“1=1”在SQL語句中可能看起來無害,但實際上它是一種不良的編程習慣,可能會導致性能下降。就像在做飯時不會無緣無故地多加調料一樣,我們在編寫SQL語句時也應該避免添加無意義的條件。

每一行代碼都應該有它存在的理由,不要讓人和數據庫浪費時間在不必要的事情上。

本文作者:螢火架構,轉自https://www.cnblogs.com/bossma/p/18024285

------------

個人觀點:看個樂行了,1=1該用就用無需顧慮那么多。


該文章在 2024/2/24 16:20:49 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved