最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL中where?1=1方法的使用及改進(jìn)

 更新時(shí)間:2022年05月25日 11:23:37   作者:??程序新視界????  
這篇文章主要介紹了MySQL中where?1=1方法的使用及改進(jìn),文章主要通對(duì)where?1?=?1的使用及改進(jìn)展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

背景

剛?cè)胄械耐瑢W(xué),看到在SQL語句中出現(xiàn)where 1 = 1這樣的條件可能會(huì)有所困惑,而長(zhǎng)時(shí)間這樣使用的朋友可能又習(xí)以為常。那么,你是否還記得當(dāng)初為什么要這樣寫?是否有性能問題?有沒有更好的寫法?

今天這篇文章,帶大家從頭到尾梳理一下where 1 = 1的使用及改進(jìn),或許你能從中得到更多意想不到的收獲。

where 1=1的作用

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

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

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

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

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

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

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

where 1<>1

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

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

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

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

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

where 1=1的性能問題

有人說,使用where 1=1可能會(huì)有性能問題,咱們直接來實(shí)驗(yàn)一下。

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é)果,這是因?yàn)楸籑ysql優(yōu)化了。Mysql在處理指令時(shí),會(huì)對(duì)1=1這類無效的條件進(jìn)行優(yōu)化處理。這個(gè)與Java的編譯器有些像,很多無效的判斷或語句,在編譯成字節(jié)碼時(shí),編譯器會(huì)進(jìn)行優(yōu)化處理。

where 1=1的改進(jìn)

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

以Mybatis為例,在使用where 1=1時(shí),通常會(huì)是如下寫法:

<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的作用同上。但如果你更進(jìn)一步去了解Mybatis的語法及標(biāo)簽,可以使用<where>標(biāo)簽來代替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ù)比較大的情況下,可減少M(fèi)ySQL為了優(yōu)化1=1這樣的條件而損失的性能。

小結(jié)

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

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

到此這篇關(guān)于MySQL中where 1=1方法的使用及改進(jìn)的文章就介紹到這了,更多相關(guān) MySQL where 1=1 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql函數(shù)全面總結(jié)

    mysql函數(shù)全面總結(jié)

    這篇文章主要介紹了mysql函數(shù),下面文章從MySQL常用的函數(shù)開始介紹、還有數(shù)值函數(shù),利用舉例說明的形式展開內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • 查看MySQL初始密碼并修改的正確方式

    查看MySQL初始密碼并修改的正確方式

    這篇文章主要給大家介紹了關(guān)于查看MySQL初始密碼并修改的正確方式,MySQL是一款廣泛使用的開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng),安裝后找回初始密碼是MySQL使用中的一個(gè)基礎(chǔ)問題,需要的朋友可以參考下
    2023-10-10
  • Mysql中Cast()函數(shù)的用法案例詳解

    Mysql中Cast()函數(shù)的用法案例詳解

    CAST 函數(shù)是 SQL 中的一種類型轉(zhuǎn)換函數(shù),它用于將一個(gè)數(shù)據(jù)類型轉(zhuǎn)換為另一個(gè)數(shù)據(jù)類型,這篇文章主要介紹了Mysql中Cast()函數(shù)的用法,需要的朋友可以參考下
    2023-05-05
  • Mac OS系統(tǒng)下mysql 5.7.20安裝教程圖文詳解

    Mac OS系統(tǒng)下mysql 5.7.20安裝教程圖文詳解

    這篇文章主要介紹了Mac OS系統(tǒng)下mysql 5.7.20安裝教程圖文詳解,本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-11-11
  • Ubuntu Server下MySql數(shù)據(jù)庫備份腳本代碼

    Ubuntu Server下MySql數(shù)據(jù)庫備份腳本代碼

    為了mysql數(shù)據(jù)庫的安全,我們需要定時(shí)備份mysql數(shù)據(jù)庫,這里提供下腳本代碼,需要的朋友可以參考下
    2013-06-06
  • 詳解mysql索引總結(jié)----mysql索引類型以及創(chuàng)建

    詳解mysql索引總結(jié)----mysql索引類型以及創(chuàng)建

    索引是一種特殊的文件(InnoDB數(shù)據(jù)表上的索引是表空間的一個(gè)組成部分),它們包含著對(duì)數(shù)據(jù)表里所有記錄的引用指針。這篇文章主要介紹了詳解mysql索引總結(jié)----mysql索引類型以及創(chuàng)建,有興趣的可以了解一下。
    2016-11-11
  • K8s 如何部署 MySQL 8.0.20 主從復(fù)制結(jié)構(gòu)

    K8s 如何部署 MySQL 8.0.20 主從復(fù)制結(jié)構(gòu)

    這篇文章主要介紹了K8s 如何部署 MySQL 8.0.20 主從復(fù)制結(jié)構(gòu),本次使用 OpenEBS 來作為存儲(chǔ)引擎,OpenEBS 是一個(gè)開源的、可擴(kuò)展的存儲(chǔ)平臺(tái),它提供了一種簡(jiǎn)單的方式來創(chuàng)建和管理持久化存儲(chǔ)卷,需要的朋友可以參考下
    2024-04-04
  • mysql外鍵的三種關(guān)系實(shí)例詳解

    mysql外鍵的三種關(guān)系實(shí)例詳解

    這篇文章主要介紹了mysql外鍵的三種關(guān)系,結(jié)合實(shí)例形式詳細(xì)分析了mysql外鍵多對(duì)一、多對(duì)多、一對(duì)一3種關(guān)系及相關(guān)使用技巧,需要的朋友可以參考下
    2020-01-01
  • Mysql索引常見問題匯總

    Mysql索引常見問題匯總

    這篇文章主要介紹了Mysql索引常見問題匯總,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-10-10
  • MySQL視圖的概念和操作函數(shù)詳解

    MySQL視圖的概念和操作函數(shù)詳解

    對(duì)MySQL數(shù)據(jù)庫的查詢,除了基本的查詢外,有時(shí)候需要對(duì)查詢的結(jié)果集進(jìn)行處理,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫基本SQL語句教程之高級(jí)操作中視圖的相關(guān)資料,需要的朋友可以參考下
    2023-03-03

最新評(píng)論

吉林市| 鄂托克前旗| 水富县| 伊春市| 东丽区| 邵东县| 正定县| 浦县| 苏尼特左旗| 青河县| 德化县| 怀来县| 泸定县| 时尚| 阳山县| 二手房| 普陀区| 南漳县| 连南| 南城县| 留坝县| 宽甸| 克山县| 宝丰县| 随州市| 思南县| 佛坪县| 亚东县| 高要市| 年辖:市辖区| 九台市| 当涂县| 泰兴市| 泰和县| 平顺县| 宣武区| 卓尼县| 隆子县| 海丰县| 万安县| 鸡东县|