<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          不懂就問(wèn):SQL 語(yǔ)句中 where 條件后 寫上1=1 是什么意思

          共 2139字,需瀏覽 5分鐘

           ·

          2020-11-07 01:35

          點(diǎn)擊關(guān)注上方“SQL數(shù)據(jù)庫(kù)開(kāi)發(fā)”,

          設(shè)為“置頂或星標(biāo)”,第一時(shí)間送達(dá)干貨

          程序員在編程過(guò)程中,經(jīng)常會(huì)在代碼中使用到“where 1=1”,這是為什么呢?


          SQL注入

          初次看到這種寫法的同學(xué)肯定很納悶,加不加where 1=1,查詢不都一樣嗎?例如:
          select?* from?customers;

          select?* from?customers where?1=1;

          查詢出來(lái)的結(jié)果完全沒(méi)有區(qū)別呀。


          是的,上面的查詢結(jié)果是沒(méi)有區(qū)別,但是這并不是我們要添加它的目的。我們知道1=1表示true,即永真,在SQL注入時(shí)配合or運(yùn)算符會(huì)得到意向不到的結(jié)果。

          例如,當(dāng)我們要?jiǎng)h除客戶名稱為“張三”的記錄,我們可以這樣寫:
          delete?from?customers where?name='張三'
          這個(gè)時(shí)候如果在where語(yǔ)句后面加上 or 1=1會(huì)是什么后果?
          即:
          delete?from?customers where?name='張三'?or?1=1
          本來(lái)只要?jiǎng)h除張三的記錄,結(jié)果因?yàn)樘砑恿薿r ?1=1的永真條件,會(huì)導(dǎo)致整張表里的記錄都被刪除了。


          當(dāng)然這種事我們可千萬(wàn)不能干,也不能讓別人有機(jī)可乘,這里只是為了表述where 1=1的作用之一。


          語(yǔ)法規(guī)范

          我們?cè)趯懘a的過(guò)程中,為了保證語(yǔ)法規(guī)范的時(shí)候,也會(huì)使用到where 1=1。

          我們先看下面這段Java代碼:


          String sql="select?* from?table_name where?1=1";
          if( condition 1) {
          ??sql=sql+"
          ??and??var2=value2";
          }
          if(condition 2) {
          ??sql=sql+"
          ??and?var3=value3";
          }


          如果我們不寫1=1的話,當(dāng)condition 1為真時(shí),代碼拼接后被執(zhí)行的SQL代碼如下:

          select?* from?table_name where?and?var2=value2;


          很明顯,這里會(huì)出現(xiàn)一個(gè)SQL 的語(yǔ)法錯(cuò)誤:and必須前后都有條件。

          有人說(shuō)我直接把where寫在if語(yǔ)句里面,我就不寫where 1=1。


          String sql="select?* from?table_name";
          if( condition 1) {
          ??sql=sql+"
          ?where?var2=value2 ";
          }
          if(condition 2) {
          ??sql=sql+"
          ?where?var3=value3";
          }


          當(dāng)condition 1為真,condition 2為假時(shí),上面被執(zhí)行的SQL代碼為:
          select?* from?table_name where?var2=value2;


          這個(gè)確實(shí)沒(méi)有語(yǔ)法錯(cuò)誤,但是當(dāng)condition 1和condition 2都為真呢?那么SQL語(yǔ)句就變成了這樣:

          select?* from?table_name 
          where?var2=value2
          where?var3=value3;


          很明顯這是不符合SQL語(yǔ)法規(guī)范的。

          這里寫上where 1=1 是為了避免where 關(guān)鍵字后面的第一個(gè)詞直接就是 “and”而導(dǎo)致語(yǔ)法錯(cuò)誤,加上1=1后,不管后面有沒(méi)有and條件都不會(huì)造成語(yǔ)法錯(cuò)誤了。

          拷貝表?

          在我們進(jìn)行數(shù)據(jù)備份時(shí),也經(jīng)常使用到where 1=1,當(dāng)然其實(shí)這兩可以不寫,寫上之后如果想過(guò)濾一些數(shù)據(jù)再備份會(huì)比較方便,直接在后面添加and條件即可。

          create?table??table_name
          as???
          select?* from??Source_table
          where???1=1;



          復(fù)制表結(jié)構(gòu)?

          有1=1就會(huì)有1<>1或1=2之類的永假的條件,這個(gè)在拷貝表的時(shí)候,加上where 1<>1,意思就是沒(méi)有任何一條記錄符合條件,這樣我們就可以只拷貝表結(jié)構(gòu),不拷貝數(shù)據(jù)了。

          create?table??table_name
          as???
          select??* from???
          Source_table where???1?<> 1;



          1=1的壞處

          我們?cè)趯慡QL時(shí),加上了1=1后雖然可以保證語(yǔ)法不會(huì)出錯(cuò)!?

          select?*?from?table?where?1=1

          但是因?yàn)閠able中根本就沒(méi)有名稱為1的字段,該SQL其實(shí)等效于select * from table,這個(gè)SQL語(yǔ)句很明顯是全表掃描,需要大量的IO操作,數(shù)據(jù)量越大越慢。


          所以在查詢時(shí),where1=1的后面需要增加其它條件,并且給這些條件建立適當(dāng)?shù)乃饕?,效率就?huì)大大提高。
          ——End——

          后臺(tái)回復(fù)關(guān)鍵字:1024,獲取一份精心整理的技術(shù)干貨
          后臺(tái)回復(fù)關(guān)鍵字:進(jìn)群,帶你進(jìn)入高手如云的交流群。
          推薦閱讀
          這是一個(gè)能學(xué)到技術(shù)的公眾號(hào),歡迎關(guān)注

          點(diǎn)擊「閱讀原文」了解SQL訓(xùn)練營(yíng)
          瀏覽 42
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产麻豆 | AV成人在线乌鸦 | 无码爱爱视频 | 日韩毛片在线播放 | 午夜理伦无码理论片国产 |