where 1=1有什麼用?

哎呀我的天吶發表於2021-10-27

為什麼要在sql語句後邊加上where 1=1 ,對於初次見到的童鞋確實很納悶。

覺得select * from table1 where 1=1 與 select * from table1完全沒有區別。

其實這種想法是錯的。記住本落格爾的名言【存在則合理】~~~

不管sql語句中 where 1=1還是1<>2,'a'='a','a'<>'b',其目的就只有一個,where 的條件為永真,得到的結果就是未加約束條件的。

在SQL隱碼攻擊時會用到這個,

例如:DELETE FROMtable_a WHERE a= '落塵曦' 

給強行加上 DELETE FROM table_a WHERE a= '落塵曦' or 1=1

本來是刪除a值為落塵曦的這一條資料,這就又變成了無約束的刪除了。

1=1 永真, 1<>1 永假。

例如一個模糊查詢可能有a, b, c, d 約束,也可能沒有,那該如何處理呢?

String sql  =  select * from table1 where 1=1  ;
if(!a.equals("")){
sql=sql+"a='"+a+"'";
}
if(!b.equals("")){
sql=sql+"b'"+b+"'";
}
if(!c.equals("")){
sql=sql+"c='"+c+"'";
}
if(!d.equals("")){
sql=sql+"d='"+d+"'";

為什麼要寫多餘的1=1?馬上就知道了。

where 1=1的寫法是為了檢化程式中對條件的檢

上述例子的四個引數都可能為空, 這時你要構造語句的話,一個個檢測再寫語句就麻煩

這裡你怎麼寫?要不要加where 或直接用 and ?,你這裡還要對引數是否為空進行檢測

用上 where 1=1 之後,就不存在這樣的問題, 條件是 and 就直接and ,是or就直接接 or

如果不寫1=1呢,那麼在每一個不為空的查詢條件面前,都必須判斷有沒有where字句。否則要在第一個出現的地方加where  


還不理解?

1=1的用處   主要用來構件動態SQL 

String sql  =  "select a,b from table_a  where 1=1 "; 
if(!b.equals(""))
      sql += "and  b='"+b+"'";
當使用者選擇了b (  假如b值為qwe ) 
結果就是:String sql  =  ''select a,b from table_a  where 1=1 and  b= 'qwe';

但是當使用者沒有選擇b  那b就是一個空值 

結果就是:String sql  =''select a,b from table_a  where 1=1''; ,執行也不會出錯,相當於沒有限制b這個條件。

但是如果沒有1=1的條件,則l String sql  =''select a,b from table_a  where'' ; 這樣就會報錯。 

1<>1 的用處: 用於只取結構不取資料的場合 

例如: 

create table table_temp tablespace  tbs_temp  as  select * from table_ori  where 1<>1 

建成一個與table_ori 結構相同的表table_temp,但是不要table_ori 裡的資料。(除了表結構,其它結構也同理) 


除了1=1 或1<>1之外的其它永真永假的條件同理。


拷貝表 

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


複製表結構 

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


參考:https://blog.csdn.net/qq_23994787/article/details/79045768


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29990276/viewspace-2839656/,如需轉載,請註明出處,否則將追究法律責任。

相關文章