成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

不要再用 Where 1=1了!有更好的寫法!

數(shù)據(jù)庫 MySQL
本文我們從習(xí)以為常的where 1=1使用聊起,聊了它的使用場景、MySQL對其優(yōu)化、以及延伸出來的where 1<>1的使用,同時基于常見的Mybatis框架,如何進一步改進。

背景

剛?cè)胄械耐瑢W(xué),看到在SQL語句中出現(xiàn)where 1 = 1這樣的條件可能會有所困惑,而長時間這樣使用的朋友可能又習(xí)以為常。

那么,你是否還記得當初為什么要這樣寫?是否有性能問題?有沒有更好的寫法?

今天這篇文章,帶大家從頭到尾梳理一下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é)果都是如下:

索引

也就是說,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 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這樣的條件而損失的性能。

小結(jié)

本文我們從習(xí)以為常的where 1=1使用聊起,聊了它的使用場景、MySQL對其優(yōu)化、以及延伸出來的where 1<>1的使用,同時基于常見的Mybatis框架,如何進一步改進。

其實,寫這篇文章想傳達的一個思想就是:再小,再習(xí)以為常的事物,如果你去思考、研究都會學(xué)到很多相關(guān)的知識點,也都可以對其進一步優(yōu)化。

責(zé)任編輯:武曉燕 來源: 程序新視界
相關(guān)推薦

2022-04-18 09:54:37

JDK8日期前端

2010-09-08 15:51:53

SQL語句where

2011-03-10 13:18:54

SQLwhere

2024-08-05 01:23:41

SQL語句MySQL

2024-05-31 13:04:09

2020-05-19 17:09:33

Pandas大數(shù)據(jù)數(shù)據(jù)分析

2022-07-22 09:15:07

OpitonalJava代碼

2024-02-20 22:13:49

SQL語句編程

2021-11-15 06:56:45

MyBatis開發(fā)項目

2024-06-27 08:36:12

Lodash對象類型isObject?

2024-05-27 00:21:09

數(shù)據(jù)庫技巧SQL

2023-06-28 16:03:44

2024-10-29 12:54:27

2020-12-02 11:18:50

print調(diào)試代碼Python

2020-12-04 10:05:00

Pythonprint代碼

2025-05-19 04:00:00

2024-03-01 19:47:27

SQL數(shù)據(jù)庫

2021-02-21 09:09:24

GoGOPATH代碼

2021-12-22 10:25:13

locateLinuxplocate

2020-07-17 07:15:38

數(shù)據(jù)庫ID代碼
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 中文在线a在线 | 极品销魂美女一区二区 | 五月综合久久 | 99久久精品一区二区成人 | 九九热精 | 1级黄色大片 | 日韩精品视频在线 | 亚洲成人精品一区 | 99热精品久久 | 一本一道久久a久久精品综合蜜臀 | 久久一本| 超碰在线人人 | 亚洲一区在线日韩在线深爱 | 日本欧美国产 | 午夜精品视频一区 | 中文字幕一区二区三区不卡 | 精品伊人久久 | 亚洲一区 中文字幕 | 99久久久国产精品免费消防器 | 久久久久久久一区 | 亚洲免费在线 | 亚洲综合在线视频 | 亚洲成年影院 | 免费观看毛片 | 操网站| 成人性视频在线 | 日韩看片 | 美日韩精品 | 国产欧美在线一区二区 | 日韩精品在线观看一区二区三区 | 亚洲一区视频在线 | 青青草亚洲 | 超碰在线国产 | 91视频免费| 精品香蕉一区二区三区 | 在线免费观看视频你懂的 | 男人阁久久 | 一级做a毛片 | 美日韩中文字幕 | 一区二区三区四区在线视频 | 狠狠色综合久久婷婷 |