數據庫中SQL語句where 1=1及where 11或1=0的妙用

最精簡的理解:

  • where 1=1 恆真,爲了拼裝語句用的(便於動態連接後續條件)
  • where 1<>1 恆假,爲了只獲取表結構用的
  • 而“1 = 0”與“1<>1”是一個道理。

下面是網上摘抄加自己理解:

我們先來看看這個語句的結果:select * from table where 1=1,其中where 1=1,由於1=1永遠是成立的,返回TRUE,條件爲真;所以,這條語句,就相當於select * from table,返回查詢表中的所有數據。

一、不用where 1=1 在多條件查詢中的困擾

舉個例子,如果您做查詢頁面,並且,可查詢的選項有多個,同時,還讓用戶自行選擇並輸入查詢關鍵詞,那麼,按平時的查詢語句的動態構造,代碼大 體如下:

string MySqlStr=”select * from table where”;

if(Age.Text.Lenght>0)
{
MySqlStr=MySqlStr+“Age=“+“’Age.Text’“;
}

if(Address.Text.Lenght>0)
{
MySqlStr=MySqlStr+“and Address=“+“’Address.Text’“;
}

①種假設

如果上述的兩個IF判斷語句,均爲True,即用戶都輸入了查詢詞,那麼,最終的MySqlStr動態構造語句變爲:

MySqlStr=”select * from table where Age=’18′ and Address=’雲南省文山州廣南縣小波嗎村’”

可以看得出來,這是一條完整的正確的SQL查詢語句,能夠正確的被執行,並根據數據庫是否存在記錄,返回數據。

②種假設

如果上述的兩個IF判斷語句不成立,那麼,最終的MySqlStr動態構造語句變爲:

MySqlStr=”select * from table where“

現在,我們來看一下這條語句,由於where關鍵詞後面需要使用條件,但是這條語句根本就不存在條件,所以,該語句就是一條錯誤的語句,肯定不 能被執行,不僅報錯,同時還不會查詢到任何數據。

上述的兩種假設,代表了現實的應用,說明,語句的構造存在問題,不足以應付靈活多變的查詢條件。

二、使用 where 1=1 的好處

假如我們將上述的語句改爲:

string MySqlStr=”select * from table where 1=1 ”;

if(Age.Text.Lenght>0)
{
MySqlStr=MySqlStr+“and Age=“+“’Age.Text’“;
}

if(Address.Text.Lenght>0)
{
MySqlStr=MySqlStr+“and Address=“+“’Address.Text’“;
}

現在,也存在兩種假設

①種假設

如果兩個IF都成立,那麼,語句變爲:

MySqlStr=”select * from table where 1=1 and Age=’18′ and Address=’雲南省文山州廣南縣小波嗎村’”,很明顯,該語句是一條正確的語句,能夠正確執行,如果數據庫有記錄,肯定會被查詢到。

②種假設

如果兩個IF都不成立,那麼,語句變爲:

MySqlStr=”select * from table where 1=1”,現在,我們來看這條語句,由於where 1=1 是爲True的語句,因此,該條語句語法正確,能夠被正確執行,它的作用相當於:MySqlStr=”select * from table”,即返回表中所有數據。

言下之意就是:如果用戶在多條件查詢頁面中,不選擇任何字段、不輸入任何關鍵詞,那麼,必將返回表中所有數據;如果用戶在頁面中,選擇了部分字 段並且輸入了部分查詢關鍵詞,那麼,就按用戶設置的條件進行查詢。

說到這裏,不知道您是否已明白,其實,where 1=1的應用,不是什麼高級的應用,也不是所謂的智能化的構造,僅僅只是爲了滿足多條件查詢頁面中不確定的各種因素而採用的一種構造一條正確能運行的動態 SQL語句的一種方法。

三、我必須使用 where 1=1 才能做多條件查詢嗎

非也,您愛使用就使用,您不喜歡使用就不使用,對於您而言,不損失什麼,也不會多得什麼;

那麼,如果我不使用where 1=1做多條件查詢,該如何構造動態查詢語句呢?非常簡單,在下給您提供一種思維:

如下語句:

string MySqlStr=”select * from table”;

if(Age.Text.Lenght>0)
{
QuerySqlStr=QuerySqlStr+“Age=“+“’Age.Text’“;
}

if(Address.Text.Lenght>0)
{
QuerySqlStr=QuerySqlStr+“and Address=“+“’Address.Text’“;
}

if(QuerySqlStr.Lenght>0)
{
MySqlStr=MySqlStr+“ where “+QuerySqlStr;
}

不管你使用不使用where 1=1做多條件查詢,只要您能夠保證您構造出來的查詢語句,是正確的就萬無一失了。

四、where 1=1 的總結

爲方便構造動態的多條件之不確定因素的複雜的正確的查詢語句所採取的一種“江湖手段”。

此類方法,一般,在書籍上不常見,而在實際的應用中,人們得從現實角度考慮,即要保證能滿足多條件查詢、同時還要能應付不確定因素的靈活性,最 後還要保證語句不出現任何語法錯誤。

以上文章轉載自:法月博客博客 – http://www.zhangpingyong.com/

  • 1<>1 的用處:
    用於只取結構不取數據的場合
    例如:
    create table table_temp tablespace tbs_temp as
    select * from table_ori where 1<>1
    建成一個與table_ori 結構相同的表table_temp,但是不要table_ori 裏的數據。(除了表結構,其它結構也同理)

where 1=1有什麼用?在SQL語言中,寫這麼一句話就跟沒寫一樣。

select * from table1 where 1=1與select * from table1完全沒有區別,甚至還有其他許多寫法,1<>2,'a'='a','a'<>'b',其目的就只有一個,where 的條件爲永真,得到的結果就是未加約束條件的。

在SQL注入時會用到這個,例如select * from table1 where name='lala'給強行加上select * from table1 where name='lala' or 1=1這就又變成了無約束的查詢了。

最近發現的妙用在於,在不定數量查詢條件情況下,1=1可以很方便的規範語句。例如一個查詢可能有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呢,那麼在每一個不爲空的查詢條件面前,都必須判斷有沒有where字句,否則要在第一個出現的地方加where

where 1=1的寫法是爲了檢化程序中對條件的檢測

打個比方有三個參數a, b, c

sql =select * from tb'

這三個參數都可能爲空

這時你要構造語句的話,一個個檢測再寫語句就麻煩

比如

if @a is not null

sql = sql + " where a=' + @a

if @b is not null

這裏你怎麼寫?要不要加where 或直接用 and ?,你這裏還要對@a是否爲空進行檢測,用上 where 1=1 之後,就不存在這樣的問題, 條件是 and 就直接and ,是or就直接接 or。

² where 1 = 0

今天看到:

"SELECT * FROM strName WHERE 1 = 0"; 不理解爲什麼有1=0

查詢得出答案:

該select語句主要用於讀取表的結構而不考慮表中的數據,這樣節省了內存,因爲可以不用保存結果集。另外,這個用在什麼地方呢?主要用於創建一個新表,而新表的結構與查詢的表的結構是一樣的。如下SQL語句: create table newtable as select * from oldtable where 1=0;

總結:

拷貝表

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

複製表結構

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

而“1 = 0”與“1<>1”是一個道理。

希望本文對您有所幫助。爲了共同學習及進步,您有什麼建議及指導意見,請留言交流。謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章