成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

不懂就問:SQL 語句中 Where 條件后 寫上1=1 是什么意思

數據庫 SQL Server
程序員在編程過程中,經常會在代碼中使用到“where 1=1”,這是為什么呢?

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

[[350547]]

SQL注入

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

  1. select * from customers; 
  2. 與 
  3. select * from customers where 1=1; 

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

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

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

  1. delete from customers where name='張三' 

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

  1. delete from customers where name='張三' or 1=1 

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

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

語法規范

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

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

  1. String sql="select * from table_name where 1=1"
  2. if( condition 1) { 
  3.   sql=sql+"  and  var2=value2"
  4. if(condition 2) { 
  5.   sql=sql+"  and var3=value3"

如果我們不寫1=1的話,當condition 1為真時,代碼拼接后被執行的SQL代碼如下: 

  1. select * from table_name where and var2=value2; 

很明顯,這里會出現一個SQL 的語法錯誤:and必須前后都有條件。

有人說我直接把where寫在if語句里面,我就不寫where 1=1。 

  1. String sql="select * from table_name"
  2. if( condition 1) { 
  3.   sql=sql+" where var2=value2 "
  4. if(condition 2) { 
  5.   sql=sql+" where var3=value3"

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

  1. select * from table_name where var2=value2; 

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

  1. select * from table_name 
  2. where var2=value2 
  3. where var3=value3; 

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

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

拷貝表

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

  1. create table  table_name 
  2. as    
  3. select * from  Source_table 
  4. where   1=1; 

復制表結構

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

  1. create table  table_name 
  2. as    
  3. select  * from    
  4. Source_table where   1 <> 1; 

1=1的壞處

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

  1. select * from table where 1=1 

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

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

 

責任編輯:華軒 來源: SQL數據庫開發
相關推薦

2020-11-06 07:09:06

SQL注入編程

2022-11-05 08:37:00

MySQL數據索引

2021-09-16 06:44:07

數據庫SQL語句

2010-09-08 15:51:53

SQL語句where

2011-03-10 13:18:54

SQLwhere

2021-05-27 20:56:51

esbuild 工具JavaScript

2021-05-29 06:23:47

webpack esbuild

2021-10-09 07:10:32

Shell腳本linux

2020-10-14 07:50:57

DNS劫持

2024-05-27 00:02:00

UpdateWhere索引

2024-10-05 00:00:10

SQL語句指定連接條

2021-11-15 06:56:45

MyBatis開發項目

2018-10-08 15:42:37

VoLTE4G流量語音

2010-09-26 10:29:45

JVMJava虛擬機

2021-01-21 21:24:34

DevOps開發工具

2010-09-09 09:23:42

CSSDIV

2010-08-25 10:28:05

margin

2010-09-03 15:47:40

SQL語句鎖定

2010-09-03 14:39:15

SQLSELECT語句

2010-09-03 14:47:50

SQLSELECT語句
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 麻豆va| 欧美日韩国产一区二区三区 | 中文字幕日韩欧美一区二区三区 | 91久色 | 国内毛片毛片毛片毛片 | 国产韩国精品一区二区三区 | 羞羞视频免费观 | 久久精品成人 | 日韩在线播放av | 中文字幕一区二区三区四区五区 | 黄片毛片在线观看 | 亚洲精品一二区 | 国产伦一区二区三区四区 | 亚洲国产高清免费 | 一区二区国产在线观看 | 午夜伊人| 欧美久久久久久 | 国产在线视频一区二区 | 国产欧美日韩一区二区三区 | 综合久久综合久久 | 91久久精品国产免费一区 | 亚洲看片网站 | 精品国产一区二区三区久久 | 日韩精品久久 | 精品欧美一区二区中文字幕视频 | 99热视 | 欧美日韩国产精品一区 | 亚洲国产精品一区二区www | 最新免费视频 | 婷婷激情综合 | 亚洲高清成人在线 | 红色av社区| 91丨九色丨国产在线 | 日韩视频一区在线观看 | 性网址| 欧美一级大片 | 国产三级电影网站 | 91成人在线视频 | 久久成人精品 | 欧美精品一区二区三区在线 | 一区二区免费在线视频 |