<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
剛入行的同學,看到在SQL語句中出現where 1 = 1
這樣的條件可能會有所困惑,而長時間這樣使用的朋友可能又習以為常。那麼,你是否還記得當初為什麼要這樣寫?是否有效能問題?有沒有更好的寫法?
今天這篇文章,帶大家從頭到尾梳理一下where 1 = 1
的使用及改進,或許你能從中得到更多意想不到的收穫。
如果要問在SQL語句的where條件中多加1=1
目的是什麼,很簡單:使得where條件語句永遠為真。本質上就是雖然加了where條件,但實際上永遠為真,也就相當於沒有加任何約束條件。
使用該語句的場景主要是:動態構建SQL語句。
String sql = "select * from t_user where 1=1 "; if(!b.equals("")){ sql += "and b='"+b+"'"; }
在上述語句拼寫時,使用where 1=1
,當b不等於空時,可以直接拼接“and”語句,而不會導致語法錯誤。如果沒有where 1=1
,原來的SQL語句就變成(假設b傳入了"abc"):
"select * from t_user where and b= 'abc' ";
很明顯,上述SQL語句會有語法錯誤。所以,之所以新增1=1
,就是為了方便SQL拼接。
從另外一個角度來講,不僅僅1=1
可以這樣使用,像:1<>2
、2>1
、'a'='a'
等表示式,只要結果為true,都可以如此使用。
上面講了where 1=1
的來歷及使用,那麼你是否使用過where 1<>1
的形式呢?
你還別說,where 1<>1
也是有使用場景的,比如:只獲取表結構而不取資料。
create table t_temp as select * from t_user where 1<>1
上述語句,建立了一個與t_user表結構一樣但沒有任何資料的新表t_temp。
當然,除了表結構,其他的結構也可以如此使用。
有人說,使用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';
執行上述兩行SQL語句,explain結果都是如下:
也就是說,1=1
這樣條件,並不影響索引和效能,從explain結果上可以看出兩者並無本質區別。
之所以不同的SQL語句,呈現了相同的結果,這是因為被Mysql優化了。Mysql在處理指令時,會對1=1
這類無效的條件進行優化處理。這個與Java的編譯器有些像,很多無效的判斷或語句,在編譯成位元組碼時,編譯器會進行優化處理。
雖然說1=1會被優化器優化掉,但優化操作本身還是會消耗MySQL的效能的,如果能夠從根本上避免這種情況的出現,那不就更好了。
以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>
這樣,在查詢資料比較大的情況下,可減少MySQL為了優化1=1
這樣的條件而損失的效能。
本文我們從習以為常的where 1=1
使用聊起,聊了它的使用場景、MySQL對其優化、以及延伸出來的where 1<>1
的使用,同時基於常見的Mybatis框架,如何進一步改進。
其實,寫這篇文章想傳達的一個思想就是:再小,再習以為常的事物,如果你去思考、研究都會學到很多相關的知識點,也都可以對其進一步優化。
到此這篇關於MySQL中where 1=1方法的使用及改進的文章就介紹到這了,更多相關 MySQL where 1=1 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45