SQL 语句中 where 条件后 写上1=1 是什么意思
创始人
2024-03-14 11:22:17
0

原标题:SQL 语句中 where 条件后 写上1=1 是什么意思

程序员在编程过程中,经常会在代码中使用到“where 1=1”,这是为什么呢?

SQL注入

初次看到这种写法的同学肯定很纳闷,加不加where 1=1,查询不都一样吗?例如:

select * from customers;

select * from customers where 1=1;

查询出来的结果完全没有区别呀。

是的,上面的查询结果是没有区别,但是这并不是我们要添加它的目的。我们知道1=1表示true,即永真,在SQL注入时配合or运算符会得到意向不到的结果。

例如,当我们要删除客户名称为“张三”的记录,我们可以这样写:

delete from customers where name='张三'

这个时候如果在where语句后面加上 or 1=1会是什么后果?

即:

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

本来只要删除张三的记录,结果因为添加了or 1=1的永真条件,会导致整张表里的记录都被删除了。

当然这种事我们可千万不能干,也不能让别人有机可乘,这里只是为了表述where 1=1的作用之一。

语法规范

我们在写代码的过程中,为了保证语法规范的时候,也会使用到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的话,当condition 1为真时,代码拼接后被执行的SQL代码如下:

select * from table_name where 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_name where var2=value2;

这个确实没有语法错误,但是当condition 1和condition 2都为真呢?那么SQL语句就变成了这样:

select * from table_name

where var2=value2

where var3=value3;

很明显这是不符合SQL语法规范的。

这里写上where 1=1 是为了避免where 关键字后面的第一个词直接就是 “and”而导致语法错误,加上1=1后,不管后面有没有and条件都不会造成语法错误了。

拷贝表

在我们进行数据备份时,也经常使用到where 1=1,当然其实这两可以不写,写上之后如果想过滤一些数据再备份会比较方便,直接在后面添加and条件即可。

create table table_name

as

select * from Source_table

where 1=1;

复制表结构

有1=1就会有1<>1或1=2之类的永假的条件,这个在拷贝表的时候,加上where 1<>1,意思就是没有任何一条记录符合条件,这样我们就可以只拷贝表结构,不拷贝数据了。

create table table_name

as

select * from

Source_table where 1 <> 1;

1=1的性能问题

在MySQL早期的版本中“ where 1=1”可能会对有所影响,使用了“where 1=1”的过滤条件以后数据系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描(即全表扫描)以比较此行是否满足过滤条件,当表中数据量较大时查询速度会非常慢。

但在5.6版本(也可能更早几个版本)以后这个问题被优化了,在写“where 1=1”时,查询分析器会将“1=1”处理掉,所以不会对查询造成性能影响,感兴趣的小伙伴可以试验一下,反正我试过了。

作者丨丶平凡世界

来源丨公众号:SQL数据库开发(ID:sql_road)

dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn

相关内容

热门资讯

巩义市孝义焱阳机械厂 巩义市孝义焱阳机械厂是一家有限责任公司,注册资本为1万,所在地区位于河南郑州市,主营产品或服务为各种...
常州市力薛干燥工程有限公司 本公司位于江苏省常州市武进区。主营干燥设备、制粒设备、除尘设备等。公司秉承“保证*质量,保持一级信誉...
广州铭睿电子科技有限公司(市场... 本公司位于广东省广州市天河区。主营糖量计、盐度计、糖度计等。公司秉承“保证*质量,保持一级信誉”的经...
南京高谦功能材料科技有限公司 本公司位于江苏省南京市鼓楼区。主营仪器设备、膜材料、器件与设备、仪器配件等。公司秉承“保证*质量,保...
郑州市宏鑫矿业设备有限公司(销... 郑州市宏鑫矿业设备有限公司始建于1980年,位于历史名城郑州西经济开发区荥阳,南临310国道,北临郑...
群旭PEEK塑胶材料有限公司 本公司位于江苏省南京市。主营PEEK板棒,PEEK板,PETP板棒,PC板棒,UPE板棒PSU板棒P...
合肥蓝天膜分离技术股份有限公司 本公司位于安徽省合肥市。主营明胶膜浓缩设备、纯水反渗透设备、各种膜元件等。公司秉承“保证*质量,保持...
金湾区鹏启机电设备销售部 本公司位于广东省珠海市。主营压力表、压力开关、滤油器等。在安全防护-监控器材、监控系统行业获得广大客...
泰州市法尔特机械设备有限公司 本公司位于江苏省泰州市高港区。主营滤油机、真空滤油机、双级真空滤油机等。公司秉承“保证*质量,保持一...
南昌华中机床配件有限公司 本公司位于江西省南昌市青云谱区。主营上海机床工作灯、手轮、手把、包塑软管等。公司秉承“保证*质量,保...
连云港顺宝磁电设备制造有限公司 本公司位于江苏省连云港市新浦区。主营强磁磁选机、永磁盘式回收机、强磁干式磁选机等。公司秉承“保证*质...
武汉市高凯化工有限公司 本公司位于湖北省武汉市东西湖区。主营苯并三氮唑、膨胀石墨、二奈酚等。公司秉承“保证*质量,保持一级信...
深圳富康达塑胶制品有限公司 深圳富康达塑胶材料有限公司+++++成立于2005年,是经国家相关部门批准注册的企业。对外追求更高的...
历城区建进化工经营部 建进化工常年代理齐鲁石化,燕山石化,锦州石化,天津助剂,无锡凤凰环氧树脂,产品销往全国我公司今天的成...
宁波市鄞州华奥吹塑制品有限公司 本公司位于浙江省宁波市鄞州区。主营吹塑制品、塑料瓶、矿泉水瓶等。公司秉承“保证*质量,保持一级信誉”...
王伟杨 本公司位于湖北省武汉市硚口区。主营指甲油、护甲油、洗甲水、甲油胶等。公司秉承“保证*质量,保持一级信...
济南汇聚科技有限公司 济南汇聚科技有限公司是由多位博士发起组建的高科技公司,注册资本200万元,长期从事造纸化学品、生物制...
远成集团(吴孟勇) 本公司位于湖北武汉市武昌区,常年对外销售医药原料、化工原料、肉桂系列、医药中间体等产品,公司秉承以用...
济南思诺化工有限公司 本公司位于山东济南市历下区,常年对外销售十八胺锅炉防腐剂、偶氮二异丁腈、EDTA二钠、三羟甲基乙烷、...
湖北恒绿源科技有限公司出口部 公司与世界各大化工原料供应厂商有着密切的联系,并与其保持着良好的合作关系。自成立以来,发挥自身优势,...