日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
不懂就問:SQL語句中where條件后寫上1=1是什么意思

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

我們提供的服務(wù)有:成都網(wǎng)站制作、網(wǎng)站設(shè)計、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、寶豐ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的寶豐網(wǎng)站制作公司

SQL注入

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

select * from customers;

select * from customers where 1=1;

查詢出來的結(jié)果完全沒有區(qū)別呀。

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

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

delete from customers where name='張三'

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

即:

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

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

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

語法規(guī)范

我們在寫代碼的過程中,為了保證語法規(guī)范的時候,也會使用到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的話,當(dāng)condition 1為真時,代碼拼接后被執(zhí)行的SQL代碼如下:

select * from table_name where and var2=value2;

很明顯,這里會出現(xiàn)一個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";
}

當(dāng)condition 1為真,condition 2為假時,上面被執(zhí)行的SQL代碼為:

select * from table_name where var2=value2;

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

select * from table_name
where var2=value2
where var3=value3;

很明顯這是不符合SQL語法規(guī)范的。

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

拷貝表 

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

create table  table_name
as
select * from Source_table
where 1=1;

復(fù)制表結(jié)構(gòu) 

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

create table  table_name
as
select * from
Source_table where 1 <> 1;

1=1的性能問題

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

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


網(wǎng)站題目:不懂就問:SQL語句中where條件后寫上1=1是什么意思
文章出自:http://www.5511xx.com/article/cciejec.html