不懂就問(wèn):SQL 語(yǔ)句中 where 條件后 寫上1=1 是什么意思
點(diǎn)擊關(guān)注上方“SQL數(shù)據(jù)庫(kù)開(kāi)發(fā)”,
設(shè)為“置頂或星標(biāo)”,第一時(shí)間送達(dá)干貨
程序員在編程過(guò)程中,經(jīng)常會(huì)在代碼中使用到“where 1=1”,這是為什么呢?
SQL注入
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é)果。
delete?from?customers where?name='張三'delete?from?customers where?name='張三'?or?1=1當(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";
}select?* from?table_name where?and?var2=value2;String sql="select?* from?table_name";
if( condition 1) {
??sql=sql+"?where?var2=value2 ";
}
if(condition 2) {
??sql=sql+"?where?var3=value3";
}select?* from?table_name where?var2=value2;select?* from?table_name
where?var2=value2
where?var3=value3;在我們進(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;我們?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ù)量越大越慢。
——End——
后臺(tái)回復(fù)關(guān)鍵字:1024,獲取一份精心整理的技術(shù)干貨 后臺(tái)回復(fù)關(guān)鍵字:進(jìn)群,帶你進(jìn)入高手如云的交流群。 推薦閱讀
快手公司廁所裝坑位計(jì)時(shí)器,網(wǎng)友:再也不能帶薪拉屎了! 如何優(yōu)雅地給妹子優(yōu)化電腦? 最全MySQL面試題集合 有了這 4 款腳本工具,老板再也不怕我寫爛SQL了 這是一個(gè)能學(xué)到技術(shù)的公眾號(hào),歡迎關(guān)注 點(diǎn)擊「閱讀原文」了解SQL訓(xùn)練營(yíng)
