當前位置:編程學習大全網 - 編程語言 - 不懂就問:SQL 語句中 where 條件後 寫上1=1 是什麽意思?

不懂就問:SQL 語句中 where 條件後 寫上1=1 是什麽意思?

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

SQL註入

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

select * from customers;

select * from customers 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的性能問題

在MySQL早期的版本中“ where 1=1”可能會對有所影響,使用了“where 1=1”的過濾條件以後數據系統就無法使用索引等查詢優化策略,數據庫系統將會被迫對每行數據進行掃描(即全表掃描)以比較此行是否滿足過濾條件,當表中數據量較大時查詢速度會非常慢。

但在5.6版本(也可能更早幾個版本)以後這個問題被優化了,在寫“where 1=1”時,查詢分析器會將“1=1”處理掉,所以不會對查詢造成性能影響,感興趣的小夥伴可以試驗壹下,反正我試過了圖片。

  • 上一篇:如何得到播放視頻的標準幀率
  • 下一篇:RobeRAVE比賽是什麽樣的機器人比賽,跟其它機器人比賽有啥區別?
  • copyright 2024編程學習大全網