不懂就問:SQL 語句中 Where 條件后 寫上1=1 是什么意思
程序員在編程過程中,經(jīng)常會在代碼中使用到“where 1=1”,這是為什么呢?
SQL注入
初次看到這種寫法的同學(xué)肯定很納悶,加不加where 1=1,查詢不都一樣嗎?例如:
- select * from customers;
- 與
- select * from customers where 1=1;
查詢出來的結(jié)果完全沒有區(qū)別呀。
是的,上面的查詢結(jié)果是沒有區(qū)別,但是這并不是我們要添加它的目的。我們知道1=1表示true,即永真,在SQL注入時配合or運(yùn)算符會得到意向不到的結(jié)果。
例如,當(dāng)我們要刪除客戶名稱為“張三”的記錄,我們可以這樣寫:
- delete from customers where name='張三'
這個時候如果在where語句后面加上 or 1=1會是什么后果?即:
- delete from customers where name='張三' or 1=1
本來只要刪除張三的記錄,結(jié)果因?yàn)樘砑恿薿r 1=1的永真條件,會導(dǎo)致整張表里的記錄都被刪除了。
當(dāng)然這種事我們可千萬不能干,也不能讓別人有機(jī)可乘,這里只是為了表述where 1=1的作用之一。
語法規(guī)范
我們在寫代碼的過程中,為了保證語法規(guī)范的時候,也會使用到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為真時,代碼拼接后被執(zhí)行的SQL代碼如下:
- select * from table_name where and var2=value2;
很明顯,這里會出現(xiàn)一個SQL 的語法錯誤:and必須前后都有條件。
有人說我直接把where寫在if語句里面,我就不寫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為假時,上面被執(zhí)行的SQL代碼為:
- select * from table_name where var2=value2;
這個確實(shí)沒有語法錯誤,但是當(dāng)condition 1和condition 2都為真呢?那么SQL語句就變成了這樣:
- select * from table_name
- where var2=value2
- where var3=value3;
很明顯這是不符合SQL語法規(guī)范的。
這里寫上where 1=1 是為了避免where 關(guān)鍵字后面的第一個詞直接就是 “and”而導(dǎo)致語法錯誤,加上1=1后,不管后面有沒有and條件都不會造成語法錯誤了。
拷貝表
在我們進(jìn)行數(shù)據(jù)備份時,也經(jīng)常使用到where 1=1,當(dāng)然其實(shí)這兩可以不寫,寫上之后如果想過濾一些數(shù)據(jù)再備份會比較方便,直接在后面添加and條件即可。
- create table table_name
- as
- select * from Source_table
- where 1=1;
復(fù)制表結(jié)構(gòu)
有1=1就會有1<>1或1=2之類的永假的條件,這個在拷貝表的時候,加上where 1<>1,意思就是沒有任何一條記錄符合條件,這樣我們就可以只拷貝表結(jié)構(gòu),不拷貝數(shù)據(jù)了。
- create table table_name
- as
- select * from
- Source_table where 1 <> 1;
1=1的壞處
我們在寫SQL時,加上了1=1后雖然可以保證語法不會出錯!
- select * from table where 1=1
但是因?yàn)閠able中根本就沒有名稱為1的字段,該SQL其實(shí)等效于select * from table,這個SQL語句很明顯是全表掃描,需要大量的IO操作,數(shù)據(jù)量越大越慢。
所以在查詢時,where1=1的后面需要增加其它條件,并且給這些條件建立適當(dāng)?shù)乃饕?,效率就會大大提高?/p>