服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

不懂就问:SQL 语句中 where 条件后 写上1=1 是什么意思

日期: 来源:SQL数据库开发收集编辑:丶平凡世界

点击关注公众号,SQL干货及时获取

后台回复:1024,获取海量学习资源

程序员在编程过程中,经常会在代码中使用到“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两件套:《SQL基础知识第二版》《SQL高级知识第二版》的PDF电子版。里面有各个语法的解释、大量的实例讲解和批注等等,非常通俗易懂,方便大家跟着一起来实操。

有需要的读者可以下载学习,在下面的公众号「数据前线」(非本号)后台回复关键字:SQL,就行
数据前线

后台回复关键字:1024,获取一份精心整理的技术干货
后台回复关键字:进群,带你进入高手如云的交流群。

推荐阅读

相关阅读

  • 2023,为什么找数据还那么难?

  • ▍没有数据,我们是否无能为力?对多数人来说,遇事不决问淘宝。但从专业角度来看,淘来的数据未必靠谱,一份“可用”的数据其实需要满足很多条件。首先,数据的来源是否清晰?无论是学术
  • #0 数据团情报所 | 专栏说明

  • (AI画师:飞桨文心一格)城市数据团每一篇高质量的研究,背后都是依靠海量多源的数据作为支撑,在这个过程中我们接触了各行各业的垂直数据供应商。同时后台也收到大量读者留言,希望能
  • 因为一个数据,我又想写点东西了

  • 这是我今天早上看到的数据。也许其他人看到的只是一组数据,可是我却在想,这数据背后的一个个人们,一个个家庭,又将上演什么样的故事呢?毕竟,我在昨晚看到了这样的悲剧。在媒体今天
  • 来了来了!通用人工智能(AGI)真的来了

  • 发刊词老同学,老室友,新话题一夜之间,感觉所有人都在玩ChatGPT、聊人工智能。大家都很嗨,觉得 ChatGPT 就是 PC 时代的 Google、是移动互联网时代的 iPhone。虽然现在还一堆问题
  • 明年,新冠会杀死多少人?

  • 筒子们应该是很关心新冠死亡率,要说新冠的死亡率,那必须要聊的是当地对于新冠死亡的判断标准,不同国家/地区标准是不一样的,所以我们分开来说。我整理了相关数据,我们可以根据其
  • 马尧:神秘雪豹在哪里

  • 2023年1月12日,在腾讯科技向善创新周2023上,腾讯公益慈善基金会公益高级项目总监马尧发表了演讲,题为《雪豹保护的背后》。以下为马尧的演讲全文:我是马尧,来自腾讯基金会,在负责
  • ChatGPT爆火背后,再看合成数据与人工智能的未来

  • 曹建峰 腾讯研究院高级研究员陈楚仪 腾讯研究院高级研究员导语:随着ChatGPT持续火爆,背后的大型语言模型(LLM)和生成式AI技术(Generative AI)日益备受关注。AI领域的新一轮竞赛已
  • 如何看11月的经济数据

  • 文 | 红塔证券 李奇霖 杨欣 卢婉琪 联系方式 | yaxi_yx_11月经济数据出来,多少还是有些低于市场预期,其实11月的数据无论是消费、生产还是投资,或多或少还是受到了疫情的影响。
  • 「赠书」数据安全实践指南

  • 随着互联网、物联网、云计算等技术的快速发展,全球数据量出现爆炸式增长,我们已进入大数据时代。大数据不断向各个行业渗透,在深刻影响国家政治、经济、民生和国防的同时,也给国

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 快来,疯狂戴夫喊你来清理草坪了!

  • 鹅友们,感觉怎么样?今天抗拒上班这件事全国应该是统一的吧鹅寻思着,这生物钟刚调整为假期模式怎么就开始工作了呢?这种时刻咱就要来搞点刺激的清醒清醒来!music!战歌一响,谁的dna动
  • 我在北京管控区种菜、散步、送药 | 谷雨

  • 封控刚刚进行四天,生活似乎也并非不可忍受,但静下心来,我愈发清楚地意识到,因为疫情,我所拥有的选择余地在不断缩小,就像我能够到达的地理空间。上一次出国已经是3年前。再上一次
  • 300亿露营生意,要和万达广场抢人丨棱镜

  • 来源:视觉中国作者 | 陈弗也 编辑 | 杨布丁出品 | 棱镜·腾讯小满工作室欢迎下载腾讯新闻APP,阅读更多优质资讯一条金毛突然闯到帐篷里,看了一眼眼前的人类,歪头想了想,这不是和
  • 2022年11月2日丨腾讯新闻早报

  • 27省份前三季度GDP出炉13个中西部省份增速跑赢全国截至10月31日,全国31个省(区、市,不含港澳台)中,已有27个省份公布前三季度国民经济运行情况。从各地公布的GDP总量看,27个省份中