溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL中where?1=1方法怎么使用

發(fā)布時間:2022-05-25 13:43:15 來源:億速云 閱讀:410 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了MySQL中where 1=1方法怎么使用的相關(guān)知識,內(nèi)容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇MySQL中where 1=1方法怎么使用文章都會有所收獲,下面我們一起來看看吧。

where 1=1的作用

如果要問在SQL語句的where條件中多加1=1目的是什么,很簡單:使得where條件語句永遠為真。本質(zhì)上就是雖然加了where條件,但實際上永遠為真,也就相當于沒有加任何約束條件。

使用該語句的場景主要是:動態(tài)構(gòu)建SQL語句

String sql  =  "select * from t_user  where 1=1 "; 
if(!b.equals("")){
  sql += "and  b='"+b+"'";
}

在上述語句拼寫時,使用where 1=1,當b不等于空時,可以直接拼接“and”語句,而不會導(dǎo)致語法錯誤。如果沒有where 1=1,原來的SQL語句就變成(假設(shè)b傳入了"abc"):

"select * from t_user  where and  b= 'abc' ";

很明顯,上述SQL語句會有語法錯誤。所以,之所以添加1=1,就是為了方便SQL拼接。

從另外一個角度來講,不僅僅1=1可以這樣使用,像:1<>2、2>1'a'='a'等表達式,只要結(jié)果為true,都可以如此使用。

where 1<>1

上面講了where 1=1的來歷及使用,那么你是否使用過where 1<>1的形式呢?

你還別說,where 1<>1也是有使用場景的,比如:只獲取表結(jié)構(gòu)而不取數(shù)據(jù)。

create table t_temp as select * from t_user  where 1<>1

上述語句,創(chuàng)建了一個與t_user表結(jié)構(gòu)一樣但沒有任何數(shù)據(jù)的新表t_temp。

當然,除了表結(jié)構(gòu),其他的結(jié)構(gòu)也可以如此使用。

where 1=1的性能問題

有人說,使用where 1=1可能會有性能問題,咱們直接來實驗一下。

mysql 8.0.18,t_user表,id_no字段有索引:

explain select * from t_user where id_no = 'Tom25';
explain select * from t_user where 1=1 and id_no = 'Tom25';

執(zhí)行上述兩行SQL語句,explain結(jié)果都是如下:

MySQL中where?1=1方法怎么使用

也就是說,1=1這樣條件,并不影響索引和性能,從explain結(jié)果上可以看出兩者并無本質(zhì)區(qū)別。

之所以不同的SQL語句,呈現(xiàn)了相同的結(jié)果,這是因為被Mysql優(yōu)化了。Mysql在處理指令時,會對1=1這類無效的條件進行優(yōu)化處理。這個與Java的編譯器有些像,很多無效的判斷或語句,在編譯成字節(jié)碼時,編譯器會進行優(yōu)化處理。

where 1=1的改進

雖然說1=1會被優(yōu)化器優(yōu)化掉,但優(yōu)化操作本身還是會消耗MySQL的性能的,如果能夠從根本上避免這種情況的出現(xiàn),那不就更好了。

以Mybatis為例,在使用where 1=1時,通常會是如下寫法:

<select id="queryUser" parameterType="com.choupangxia.entity.User" resultType="java.lang.Integer">
  select count(id) from t_user u where 1=1
<if test="username !=null and username !='' ">
  AND u.username = #{username} 
</if> 
<if test="userNo !=null and userNo !='' ">
  AND u.user_no = #{userNo}
</if> 
</select>

這里where 1=1的作用同上。但如果你更進一步去了解Mybatis的語法及標簽,可以使用<where>標簽來代替where 1=1

<select id="queryUser" parameterType="com.choupangxia.entity.User" resultType="java.lang.Integer">
  select count(id) from t_user u
<where>
<if test="username !=null and username !='' ">
 u.username = #{username} 
</if>
<if test="userNo !=null and userNo !='' ">
 AND u.user_no = #{userNo}
</if>
</where>
</select>

這樣,在查詢數(shù)據(jù)比較大的情況下,可減少MySQL為了優(yōu)化1=1這樣的條件而損失的性能。

關(guān)于“MySQL中where 1=1方法怎么使用”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“MySQL中where 1=1方法怎么使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI