共計(jì) 1955 個(gè)字符,預(yù)計(jì)需要花費(fèi) 5 分鐘才能閱讀完成。
這篇文章主要講解了“SQL 語(yǔ)句中 Where 條件后寫上 1 = 1 是什么意思”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著丸趣 TV 小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“SQL 語(yǔ)句中 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)樘砑恿?or 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è)趯?SQL 時(shí),加上了 1 = 1 后雖然可以保證語(yǔ)法不會(huì)出錯(cuò)!
select * from table where 1=1
但是因?yàn)?table 中根本就沒(méi)有名稱為 1 的字段,該 SQL 其實(shí)等效于 select * from table,這個(gè) SQL 語(yǔ)句很明顯是全表掃描,需要大量的 IO 操作,數(shù)據(jù)量越大越慢。
所以在查詢時(shí),where1= 1 的后面需要增加其它條件,并且給這些條件建立適當(dāng)?shù)乃饕示蜁?huì)大大提高。
感謝各位的閱讀,以上就是“SQL 語(yǔ)句中 Where 條件后寫上 1 = 1 是什么意思”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì) SQL 語(yǔ)句中 Where 條件后寫上 1 = 1 是什么意思這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!