久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

SQL語(yǔ)句中Where條件后寫上1=1是什么意思

共計(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)注!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-27發(fā)表,共計(jì)1955字。
轉(zhuǎn)載說(shuō)明:除特殊說(shuō)明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒(méi)有評(píng)論)
主站蜘蛛池模板: 承德市| 施甸县| 兴安县| 鄢陵县| 土默特右旗| 虹口区| 淮安市| 三江| 双桥区| 都江堰市| 昌吉市| 平罗县| 亚东县| 漠河县| 随州市| 张掖市| 德庆县| 广南县| 积石山| 宁都县| 孝感市| 汕尾市| 永仁县| 雷州市| 理塘县| 浪卡子县| 沁水县| 平山县| 孝义市| 皋兰县| 舟曲县| 河源市| 乌拉特中旗| 惠州市| 蛟河市| 禄丰县| 滨海县| 毕节市| 锡林郭勒盟| 湾仔区| 巨野县|