LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

[點(diǎn)晴永久免費(fèi)OA]SQL中為什么不要使用1=1?

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

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

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

為什么會(huì)使用 1=1?

在動(dòng)態(tài)構(gòu)建SQL查詢時(shí),開發(fā)者可能會(huì)不確定最終需要哪些條件。這時(shí)候,他們就會(huì)使用“1=1”作為一個(gè)始終為真的條件,讓接下來的所有條件都可以方便地用“AND”連接起來,就像是搭積木的時(shí)候先放一個(gè)基座,其他的積木塊都可以在這個(gè)基座上疊加。

就像下邊這樣:

SELECT * FROM table WHERE 1=1

<if test="username != null">

    AND username = #{username}

</if>

<if test="age > 0">

    AND age = #{age}

</if>

這樣就不用在增加每個(gè)條件之前先判斷是否需要添加“AND”。

1=1 帶來的問題

性能問題?

有的同學(xué)會(huì)擔(dān)心 1=1 給數(shù)據(jù)庫帶來額外的負(fù)擔(dān),產(chǎn)生性能問題。

這實(shí)際上可能不會(huì)發(fā)生,因?yàn)楝F(xiàn)代數(shù)據(jù)庫的查詢優(yōu)化器已經(jīng)非常智能,它們通常能夠識(shí)別出像 1=1 這樣的恒真條件,并在執(zhí)行查詢計(jì)劃時(shí)優(yōu)化掉它們。在許多情況下,即使查詢中包含了1=1,數(shù)據(jù)庫的性能也不會(huì)受到太大影響,優(yōu)化器會(huì)在實(shí)際執(zhí)行查詢時(shí)將其忽略。

但是現(xiàn)代優(yōu)化器雖然很強(qiáng)大,但它們并不是萬能的。在某些復(fù)雜的查詢場(chǎng)景中,即使是簡(jiǎn)單的 1=1 也可能對(duì)優(yōu)化器的決策造成不必要的影響。

代碼質(zhì)量

我們?nèi)匀恍枰苊庠诓樵冎邪?1=1,因?yàn)檫€有以下幾點(diǎn)考慮:

  1. 代碼清晰性:即使數(shù)據(jù)庫可以優(yōu)化掉這樣的條件,但對(duì)于閱讀SQL代碼的人來說,1=1可能會(huì)造成困惑。代碼的可讀性和清晰性非常重要,特別是在團(tuán)隊(duì)協(xié)作的環(huán)境中。

  2. 習(xí)慣養(yǎng)成:即使在當(dāng)前的數(shù)據(jù)庫系統(tǒng)中1=1不會(huì)帶來性能問題,習(xí)慣了寫不必要的代碼可能會(huì)在其他情況下引入實(shí)際的性能問題。比如,更復(fù)雜的無用條件可能不會(huì)那么容易被優(yōu)化掉。

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

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

替代 1=1 的更佳做法

現(xiàn)在開發(fā)者普遍使用ORM框架來操作數(shù)據(jù)庫了,還在完全手寫拼SQL的同學(xué)可能需要反思下了,這里給兩個(gè)不同ORM框架下替代1=1的方法。

假設(shè)我們有一個(gè)用戶信息表 user,并希望根據(jù)傳入的參數(shù)動(dòng)態(tài)地過濾用戶。

首先是Mybatis

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

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

  SELECT * FROM user

  <where>

    <!-- 使用if標(biāo)簽動(dòng)態(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 的典型方法是利用動(dòng)態(tài)SQL標(biāo)簽(如 <if>)來構(gòu)建條件查詢。<where> 標(biāo)簽會(huì)自動(dòng)處理首條條件前的 AND 或 OR。當(dāng)沒有滿足條件的 <if> 或其他條件標(biāo)簽時(shí),<where> 標(biāo)簽內(nèi)部的所有內(nèi)容將被忽略,從而不會(huì)生成多余的 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時(shí),框架會(huì)決定是否在條件前增加AND,而不需要人為的增加 1=1。

總結(jié)

“1=1”在SQL語句中可能看起來無害,但實(shí)際上它是一種不良的編程習(xí)慣,可能會(huì)導(dǎo)致性能下降。就像在做飯時(shí)不會(huì)無緣無故地多加調(diào)料一樣,我們?cè)诰帉慡QL語句時(shí)也應(yīng)該避免添加無意義的條件。

每一行代碼都應(yīng)該有它存在的理由,不要讓人和數(shù)據(jù)庫浪費(fèi)時(shí)間在不必要的事情上。

本文作者:螢火架構(gòu),轉(zhuǎn)自https://www.cnblogs.com/bossma/p/18024285

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

個(gè)人觀點(diǎn):看個(gè)樂行了,1=1該用就用無需顧慮那么多。


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

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
欧美一区二区影院 | 熟女精品激情免费视频 | 中文字幕日本二三请区 | 洲国产精品一区第一页 | 亚洲午夜精品A品久久 | 自偷精品精品国产日韩 |