騰訊一面問我SQL語句中where條件為什么寫上1=1

邁莫coding
在項目編寫中,經常會在代碼中使用到“where 1=1”,這是為什么呢?

目錄

  • where后面加"1=1"還是不加
  • 不用where 1=1 在多條件查詢的困惑
  • 使用where 1=1 的好處
  • 使用where 1=1 的壞處

where后面加"1=1"還是不加

比如現在有一個場景,DB數據庫中有一張博客表(blog),想把blog表中的所有記錄查詢出來,那么可以有兩種方式操作。一種寫法是where關鍵詞什么也不加,另一種寫法是where關鍵詞后面加"1=1",寫法如下:

  • where關鍵詞什么也不加
select * from blog;
  • where關鍵詞后面加 "1=1"
select * from blog where 1 = 1;

這兩種SQL語句查詢所得到的結果完全沒有區別。那為什么要在where關鍵字后面添加"1=1"呢?

我們知道1=1表示true,即永真。如果使用不恰當會造T0級錯誤。例如在編寫SQL語句時進行where條件查詢時配合or運算符會得到意向不到的結果,結果會讓你哆嗦。不信,往下看:

例如,當我們要刪除博客ID稱為“202102111501”的記錄,我們可以這樣寫:

delete from blog where blogId = "202102111501"

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

delete from blog where blogId = "202102111501" or 1 = 1

本來只要博客ID稱為“202102111501”的記錄,結果因為添加了or 1=1的永真條件,會導致整張表里的記錄都被刪除了。那你可就闖禍了。

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

舉個例子,如果你想查看當前博客中某條評論記錄時,那么按照平時的查詢語句的 動態構造,代碼大體如下:

String sql="select * from blog where";
if ( condition 1) {
  sql = sql + " blogID = 202102111501";
}
if (condition 2) {
  sql = sql + " and commentID = 150101";
}

如果上述的兩個if判斷語句均為true時,那么最終的動態SQL語句為:

select * from table_name where blogID = 202102111501 and commentID = 150101;

可以看出來這是一條完整的正確的SQL查詢語句,能夠正確執行。

如果上述的兩個if判斷語句均為false時,那么最終的動態SQL語句為:

select * from table_name where;

此時我們看看這條生成的SQL語句,由于where關鍵字后面需要使用條件,但是這條語句根本不存在,所以該語句就是一條錯誤語句,不能被執行,不僅報錯,同時還查不到任何數據。

使用where 1=1 的好處

如果我們在where條件后加上1=1,看看它的真面目:

String sql="select * from blog where 1=1";
if ( condition 1) {
  sql = sql + " and blogID = 202102111501";
}
if (condition 2) {
  sql = sql + " and commentID = 150101";
}

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

select * from blog where 1=1 and blogID = "202102111501" and commentID = 150101;

可以看出來這是一條完整的正確的SQL查詢語句,能夠正確執行。

如果上述的兩個if判斷語句均為false時,那么最終的動態SQL語句為:

select * from table_name where 1=1;

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

當在where關鍵字后面添加1=1時,如果此時查詢時不選擇任何字段時,那么必將返回表中的所有數據。如果是按照某個字段進行單條查詢時,那么就會此時的條件進行查詢。

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

使用where 1=1 的壞處

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

select * from table_name where 1=1;

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

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

文章也會持續更新,可以微信搜索「 邁莫coding 」第一時間閱讀。每天分享優質文章、大廠經驗、大廠面經,助力面試,是每個程序員值得關注的平臺。
閱讀 466

校招面試/go/公眾號同名文章,每天分享優質文章、大廠經驗、大廠面經,助力面試,是每個程序員值得關注的平臺。

9 聲望
1 粉絲
0 條評論

校招面試/go/公眾號同名文章,每天分享優質文章、大廠經驗、大廠面經,助力面試,是每個程序員值得關注的平臺。

9 聲望
1 粉絲
宣傳欄
一本到在线是免费观看_亚洲2020天天堂在线观看_国产欧美亚洲精品第一页_最好看的2018中文字幕 <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>