SQL 語句中 where 條件后 寫上1=1 是什么意思


程序員在編程過程中,經常會在代碼中使用到“where 1=1”,這是為什么呢?

 

SQL注入

初次看到這種寫法的同學肯定很納悶,加不加where 1=1,查詢不都一樣嗎?例如:

select count(1) from student;

select count(1) from student where 1=1;

查詢出來的結果完全沒有區別呀。

 

 

 

是的,上面的查詢結果是沒有區別,但是這並不是我們要添加它的目的。我們知道1=1表示true,即永真,在SQL注入時配合or運算符會得到意向不到的結果。

例如,當我們要刪除客戶名稱為“張三”的記錄,我們可以這樣寫:

delete from customers where name='張三'

這個時候如果在where語句后面加上 or 1=1會是什么后果?即:

delete from customers where name='張三' or 1=1

本來只要刪除張三的記錄,結果因為添加了or  1=1的永真條件,會導致整張表里的記錄都被刪除了。

 

當然這種事我們可千萬不能干,也不能讓別人有機可乘,這里只是為了表述where 1=1的作用之一。

 

語法規范

我們在寫代碼的過程中,為了保證語法規范的時候,也會使用到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的話,當condition 1為真時,代碼拼接后被執行的SQL代碼如下:

select * from table_name where and var2=value2;

 

很明顯,這里會出現一個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";
}

 

當condition 1為真,condition 2為假時,上面被執行的SQL代碼為:

select * from table_name where var2=value2;

 

這個確實沒有語法錯誤,但是當condition 1和condition 2都為真呢?那么SQL語句就變成了這樣:

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

 

很明顯這是不符合SQL語法規范的。
這里寫上where 1=1 是為了避免where 關鍵字后面的第一個詞直接就是 “and”而導致語法錯誤,加上1=1后,不管后面有沒有and條件都不會造成語法錯誤了。
拷貝表 

在我們進行數據備份時,也經常使用到where 1=1,當然其實這兩可以不寫,寫上之后如果想過濾一些數據再備份會比較方便,直接在后面添加and條件即可。

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

 

 

復制表結構 

有1=1就會有1<>1或1=2之類的永假的條件,這個在拷貝表的時候,加上where 1<>1,意思就是沒有任何一條記錄符合條件,這樣我們就可以只拷貝表結構,不拷貝數據了。

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

 


1=1的壞處

我們在寫SQL時,加上了1=1后雖然可以保證語法不會出錯! 

select * from table where 1=1

但是因為table中根本就沒有名稱為1的字段,該SQL其實等效於select * from table,這個SQL語句很明顯是全表掃描,需要大量的IO操作,數據量越大越慢。


所以在查詢時,where1=1的后面需要增加其它條件,並且給這些條件建立適當的索引,效率就會大大提高。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM