深入理解where 1=1的用處
where 1=1有什么用?在SQL語言中,寫這么一句話就跟沒寫一樣。
select * from table1 where 1=1與select * from table1完全沒有區(qū)別,甚至還有其他許多寫法,1<>2,'a'='a','a'<>'b',其目的就只有一個(gè),where 的條件為永真,得到的結(jié)果就是未加約束條件的。
在SQL注入時(shí)會用到這個(gè),例如select * from table1 where name='lala'給強(qiáng)行加上select * from table1 where name='lala' or 1=1這就又變成了無約束的查詢了。
最近發(fā)現(xiàn)的妙用在于,在不定數(shù)量查詢條件情況下,1=1可以很方便的規(guī)范語句。例如一個(gè)查詢可能有name,age,height,weight約束,也可能沒有,那該如何處理呢?
String sql=select * from table1 where 1=1
為什么要寫多余的1=1?馬上就知道了。
if(!name.equals("")){
sql=sql+"name='"+name+"'";
}
if(!age.equals("")){
sql=sql+"age'"+age+"'";
}
if(!height.equals("")){
sql=sql+"height='"+height+"'";
}
if(!weight.equals("")){
sql=sql+"weight='"+weight+"'";
}
如果不寫1=1呢,那么在每一個(gè)不為空的查詢條件面前,都必須判斷有沒有where字句,否則要在第一個(gè)出現(xiàn)的地方加where
where 1=1的寫法是為了檢化程序中對條件的檢測
打個(gè)比方有三個(gè)參數(shù)a, b, c
@sql=select * from tb'
這三個(gè)參數(shù)都可能為空
這時(shí)你要構(gòu)造語句的話,一個(gè)個(gè)檢測再寫語句就麻煩
比如
if @a is not null
@sql=@sql + " where a=' + @a
if @b is not null
這里你怎么寫?要不要加where 或直接用 and ?,你這里還要對@a是否為空進(jìn)行檢測
用上 where 1=1 之后,就不存在這樣的問題, 條件是 and 就直接and ,是or就直接接 or
拷貝表
create table_name as select * from Source_table where 1=1;
復(fù)制表結(jié)構(gòu)
create table_name as select * from Source_table where 1 <> 1;
相關(guān)文章
mysql 獲取今天、昨天0點(diǎn)時(shí)間戳的實(shí)例
今天小編就為大家分享一篇mysql 獲取今天、昨天0點(diǎn)時(shí)間戳的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-05-05
一文帶你理解MySql中explain結(jié)果filtered
使用EXPLAIN關(guān)鍵字可以模擬優(yōu)化器執(zhí)行SQL查詢語句,從而知道MySQL是如何處理你的SQL語句的,下面這篇文章主要給大家介紹了關(guān)于MySql中explain結(jié)果filtered的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
mysql8報(bào)錯(cuò):ERROR?1410?(42000):?You?are?not?allowed?to?
電腦新裝的mysql,版本為8.0以上,分配權(quán)限時(shí)直接帶密碼和賬號會報(bào)錯(cuò),這篇文章主要給大家介紹了關(guān)于mysql8報(bào)錯(cuò):ERROR?1410?(42000):?You?are?not?allowed?to?create?a?user?with?GRANT的解決辦法,需要的朋友可以參考下2022-06-06

