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

相关内容

热门资讯

哪吒 L 车型首次 OTA 升... IT之家 7 月 3 日消息,哪吒汽车今日官宣为哪吒 L 纯电 / 增程SUV 推送首次 OTA 升...
驴友徒步遭雷击!致1死1伤 夏季带来了燥热暑湿的烦恼 还伴随着电闪雷鸣 雷电灾害十分危险 一旦发生,便是灾难 6月29日 河北...
美洲杯-拉菲尼亚任意球破门 巴... 北京时间7月3日9时,美洲杯小组赛D组末轮重头戏打响,巴西对阵哥伦比亚,开场第8分钟,J罗任意球中框...
高清:美洲杯巴西1-1哥伦比亚... 北京时间7月3日9:00,美洲杯小组赛D组第3轮的一场焦点之战打响,拉菲尼亚任意球破门,穆尼奥斯扳平...
1分钟,“地天板” 周三上午,A股主要指数走势分化,创业板指涨0.4%。盘面上,免税店概念大涨,1400亿元市值免税龙头...
欧洲杯:土耳其队2:1战胜奥地... 2024年7月3日凌晨,2024欧洲杯1/8决赛,土耳其队2比1战胜奥地利队,成功闯进1/4决赛。开...
2024德国欧洲杯1/8决赛:... 德国莱比锡,2024德国欧洲杯1/8决赛,奥地利VS土耳其。 2024年欧洲杯淘汰赛1/8决赛,土...
奥地利1比2土耳其 北京时间7月2日,2024年欧洲杯淘汰赛1/8决赛,土耳其对阵奥地利。开场57秒,德米拉尔闪击破门;...
原创 3... 欧洲杯1/8决赛最后一个比赛日,赛事1冠老牌豪门荷兰没有遇冷,顺利以3-0大胜罗马尼亚,土耳其则爆冷...
悲剧!3人被海浪卷走,1死1失... 炎炎夏日 正是去海边游玩的好时候 但大家千万不要忽略一件事: 安全永远第一! 据南方新闻网报道,6月...
原创 哈... 登子今年这次续约挺攒人品的。虽然说除了快船别的球队给不了这么大的合同,但对于动荡阶段的快船无疑是一针...
纳指期货周二涨约1% 每经AI快讯,周二(7月2日)纽约尾盘,标普500股指期货最终上涨0.53%,道指期货涨0.34%,...
人工智能概念股多数收涨,阿里涨... 周二,Reddit收涨10.39%,特斯拉涨10.2%,Astera涨超5.1%,阿里巴巴ADR涨约...
1/4决赛对阵:荷兰vs奥地利... 直播吧7月3日讯 欧洲杯1/8决赛,荷兰3-0罗马尼亚晋级8强。 1/4决赛对阵:荷兰将战奥地利/土...
7月1日基金净值:华安中证光伏... 证券之星消息,7月1日,华安中证光伏产业ETF发起式联接A最新单位净值为0.4049元,累计净值为0...
7月1日基金净值:国投瑞银金融... 证券之星消息,7月1日,国投瑞银金融地产ETF最新单位净值为2.2011元,累计净值为2.2011元...
1药网上涨2.2%,报1.1美... 7月2日,1药网(YI)开盘上涨2.2%,截至21:32,报1.1美元/股,成交423.0美元。 财...
逸豪新材:股东拟减持不超1%公... 证券时报e公司讯,逸豪新材(301176)7月2日晚间公告,持股8.5%的股东逸源基金计划在自本公告...