騰訊一面問我SQL語句中where條件爲何寫上1=1

在項目編寫中,常常會在代碼中使用到「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運算符會獲得意向不到的結果,結果會讓你哆嗦。不信,往下看:sql

例如,當咱們要刪除博客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的永真條件,會致使整張表裏的記錄都被刪除了。那你可就闖禍了。code

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

舉個例子,若是你想查看當前博客中某條評論記錄時,那麼按照平時的查詢語句的 動態構造,代碼大致以下:blog

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語句爲:it

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 」第一時間閱讀。天天分享優質文章、大廠經驗、大廠面經,助力面試,是每一個程序員值得關注的平臺。
相關文章
相關標籤/搜索