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

2020-11-04 00:00:00 语句 代码 条件 语法 拷贝

点击关注上方“SQL数据库开发”,

设为“置顶或星标”,时间送达干货

程序员在编程过程中,经常会在代码中使用到“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的坏处

我们在写SQL时,加上了1=1后虽然可以保证语法不会出错! 

select * from table where 1=1

但是因为table中根本就没有名称为1的字段,该SQL其实等效于select * from table,这个SQL语句很明显是全表扫描,需要大量的IO操作,数据量越大越慢。


所以在查询时,where1=1的后面需要增加其它条件,并且给这些条件建立适当的索引,效率就会大大提高。
——End——

后台回复关键字:1024,获取一份精心整理的技术干货
后台回复关键字:进群,带你进入高手如云的交流群。
推荐阅读
  • 国产数据库建模工具,看到界面眼,良心了!

  • 快手公司厕所装坑位计时器,网友:再也不能带薪拉屎了!
  • 如何优雅地给妹子优化电脑?
  • 全MySQL面试题集合
  • 有了这 4 款脚本工具,老板再也不怕我写烂SQL了

这是一个能学到技术的公众号,欢迎关注

点击「阅读原文」了解SQL训练营

相关文章