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

2020-12-09 酷扯兒

本文轉載自【微信公眾號:五角錢的程式設計師,ID:xianglin965】經微信公眾號授權轉載,如需轉載與原文作者聯繫

程式設計師在編程過程中,經常會在代碼中使用到「where 1=1」,這是為什麼呢?

SQL注入

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

select *from customers;select *from customerswhere 1=1;

查詢出來的結果完全沒有區別呀。

是的,上面的查詢結果是沒有區別,但是這並不是我們要添加它的目的。我們知道1=1表示true,即永真,在SQL注入時配合or運算符會得到意向不到的結果。

例如,當我們要刪除客戶名稱為「張三」的記錄,我們可以這樣寫:

delete from customerswhere name='張三'

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

即:

delete from customerswhere name='張三' or 1=1

本來只要刪除張三的記錄,結果因為添加了or 1=1的永真條件,會導致整張表裡的記錄都被刪除了。

當然這種事我們可千萬不能幹,也不能讓別人有機可乘,這裡只是為了表述where 1=1的作用之一。

語法規範

我們在寫代碼的過程中,為了保證語法規範的時候,也會使用到where 1=1。

我們先看下面這段Java代碼:

String sql="select *from table_namewhere 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_namewhere 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_namewhere var2=value2;

這個確實沒有語法錯誤,但是當condition 1和condition 2都為真呢?那麼SQL語句就變成了這樣:

select *from table_namewhere var2=value2where var3=value3;

很明顯這是不符合SQL語法規範的。

這裡寫上where 1=1 是為了避免where 關鍵字後面的第一個詞直接就是 「and」而導致語法錯誤,加上1=1後,不管後面有沒有and條件都不會造成語法錯誤了。

拷貝表

在我們進行數據備份時,也經常使用到where 1=1,當然其實這兩可以不寫,寫上之後如果想過濾一些數據再備份會比較方便,直接在後面添加and條件即可。

create table table_nameas select *from Source_tablewhere 1=1;

複製表結構

有1=1就會有1<>1或1=2之類的永假的條件,這個在拷貝表的時候,加上where 1<>1,意思就是沒有任何一條記錄符合條件,這樣我們就可以只拷貝表結構,不拷貝數據了。

create table table_nameas select *from Source_tablewhere 1 <>1;

1=1的壞處

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

select * from table where 1=1

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

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

結束!

相關焦點

  • 不懂就問:SQL 語句中 where 條件後 寫上1=1 是什麼意思
    例如,當我們要刪除客戶名稱為「張三」的記錄,我們可以這樣寫:delete from customers where name='張三'這個時候如果在where語句後面加上 or 1=1會是什麼後果?有人說我直接把where寫在if語句裡面,我就不寫where 1=1。
  • SQL 語句中 where 條件後 寫上1=1 是什麼意思
    這段代碼應該是由程序(例如Java)中生成的,where條件中 1=1 之後的條件是通過 if 塊動態變化的。
  • SQL 語句中 where 條件後 寫上1=1 是什麼意思
    ,where條件中 1=1 之後的條件是通過 if 塊動態變化的。例如:  String sql="select * from table_name  where 1=1";        if( conditon 1) {              sql=sql+"  and  var2=value2";            }        if(conditon 2) {
  • SQL 語句中 where 條件後 寫上 1=1 是什麼意思
    ,where條件中 1=1 之後的條件是通過 if 塊動態變化的。例如:  String sql="select * from table_name where 1=1";  if( conditon 1) {  sql=sql+" and var2=value2";  }  if(conditon 2) {  sql=sql+" and var3=value3";
  • SQL 語句中 where 條件後 寫上 1=1 是什麼意思!
    來源:cloud.tencent.com/developer/article/1475146這段代碼應該是由程序(例如Java)中生成的,where條件中 1=1 之後的條件是通過 if 塊動態變化的例如:String sql="select * from table_name where 1=1";if( conditon 1) {  sql=sql+"  and  var2=value2";}if(conditon 2) {  sql=sql+"  and var3=value3";
  • SQL 語句中 where 條件後 寫上 1=1 是什麼意思?
    來源:cloud.tencent.com/developer/article/1475146這段代碼應該是由程序(例如Java)中生成的,where條件中 1=1 之後的條件是通過 if 塊動態變化的。
  • SQL語句中where條件為什麼寫上1=1
    例如在編寫SQL語句時進行where條件查詢時配合or運算符會得到意向不到的結果,結果會讓你哆嗦。where blogId = "202102111501" 如果這個時候如果在where語句後面加上 or 1=1會是什麼後果?
  • 面試被問where 1=1 ,到底是個什麼鬼?
    1 資料庫語句 where 1=1 的用法和作用這是一種怎樣的查詢語句呢?首先說明,1=1不是查詢語句中的任何關鍵詞,所以,請您放心,不管你會不會使用 這種語句,都沒有任何關係,對於您而言,沒有任何損失。
  • where 1=1 是什麼鬼?
    ,where條件中 1=1 之後的條件是通過 if 塊動態變化的。    sql=sql+"  and var3=value3";    }   where 1=1 是為了避免where 關鍵字後面的第一個詞直接就是 「and」而導致語法錯誤。
  • Mybatis 動態sql語句if和where標籤巧妙使用
    本文章描述的是 Mybatis if標籤和where標籤的結合使用需求是:根據電話和名字查用戶數據1 sql 查詢查詢sql語句如下:SELECT id , gender , nickname , mobile , avatar FROM dts_user WHERE gender = 1 AND mobile LIKE '%456%'查詢結果如下圖所示:2 mybatis動態sql配置
  • Oracle優化:sql語句的執行順序
    理解 sql 語句的執行順序對我們優化 sql 有很大的幫助,那麼 sql 語句的執行順序是怎樣的呢,以一條簡單的的語句做分析:① 先執行 from 子句,明確數據的來源,從哪個表或哪個視圖來查詢② 接著執行
  • mysql常用sql語句總結
    子查詢、from子查詢、exists子查詢where子查詢先執行where後的語句,得到內層結果。子句的作用是在對查詢結果進行分組前,將不符合where條件的行去掉,即在分組之前過濾數據,條件中不能包含聚組函數,使用where條件顯示特定的行。
  • 請確保你查詢mysql資料庫時,sql語句沒有這麼寫
    資料庫索引,可以讓查詢sql語句效率更高。所以大家在寫查詢的sql語句時為了讓語句執行效率高會讓語句能命中索引,或者新建合適的索引。可是,有時候大家會遇到像下面說的這樣的情況。明明我sql語句where條件的欄位是符合索引,應該可以命中索引的,但是執行時卻沒有命中索引。為什麼會這樣呢,是人性的……額,串臺了,調回來。要說明這個問題,大家先來比較一下下面的這兩個sql語句。
  • 資料庫性能優化之 SQL 語句優化 1
    在這些where子句中,即使某些列存在索引,但是由於編寫了劣質的SQL,系統在運行該SQL語句時也不能使用該索引,而同樣使用全表掃描,這就造成了響應速度的極大降低。1. 操作符優化(a) IN 操作符用IN寫出來的SQL的優點是比較容易寫及清晰易懂,這比較適合現代軟體開發的風格。
  • 使用explain和show profile來分析SQL語句實現優化SQL語句
    SQL語句優化是建立在慢查詢分析的基礎上,通過慢查詢定位有問題的SQL語句,關於慢查詢的介紹及其分析工具,可以參考[mysql慢查詢及慢查詢日誌分析工具]一、通過explain查詢1 用法:explain sql2 作用:用於分析sql語句
  • 一道簡單的sql語句題
    結果才發現,數據分析崗位大多注重的是資料庫的能力,比如sql語句的考察,hive的考察,以及一些運營思維的考察,所以第一次面試就很悲劇啦,不過題目還是很有代表性的。其他的不寫了,這裡只分享一個關於sql的題目。1、問題引出現在有兩個數據表,一個數據表記錄司機的信息,比如司機id,司機姓名,司機註冊時間等等,一個數據表記錄一天的訂單情況,比如訂單ID,訂單司機id,訂單時間。
  • IT大叔詳談mysql中update語句和delete語句及應用
    首先查看我們的student表數據;1、精準更新;為什麼叫精準更新呢,因為語句中有where條件,會精準的對符合要求的行進行更新,標準寫法:update 表名 set 運算表達式 where 列名=值;從上面圖片可以看到有老韓信息,但是老韓的信息有錯誤,老韓的班級信息和password錯誤了,老韓轉到二班了,密碼也重置成「888888」了,
  • SQL where
    SQL where子句用於指定SELECT語句返回符合查詢條件的行記錄。
  • 「看這篇就夠了」Mysql join條件是要寫在on裡還是在where裡?
    我們先建兩個表和添加一批數據,注意只有a表的f1有索引,a表和B表的數據不完全一致:結果集區別上圖可以看出,結果集是不一樣的,條件寫在ON裡,數據有6條,比條件放在where裡面多出2條。2、順序掃描b表,每一條數據跟join_buffer的a的數據進行on條件判斷,匹配則放入結果集中。最後a中未匹配的補上null,合併到結果集中返回。以上這種查找方法就是Mysql的Block Nexted Loop Join(簡稱BNL)算法。
  • SQL語句條件判斷之case when基本用法
    在日常開發中有些需求我們無法避免的要在SQL語句中進行類似於Java中if判斷的操作,那SQL語句是否可以滿足呢?