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_nameas   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的后面需要增加其它条件,并且给这些条件建立适当的索引,效率就会大大提高。
(0)

相关推荐

  • SQL sever基础语法

    SQL sever基础语法 语法简介: l Create database 数据库名: l Use database 数据库名: l SQL对字母大小写不敏感: l 文本或字符串用单引号: 常用命令: ...

  • 成功sql语句中直接写变量

    public static PagedResultInOut<T> SqlPage<T>(string sql, string order, int page, int siz ...

  • mybatis sql语句中 in() 长度为0或null的情况

    比如: select * from A where colName IN <foreach collection="moCodeList" item="item&q ...

  • sql语句,筛选条件、聚合分组、连接查询

    筛选条件.聚合分组.连接查询 mysql三:表结构修改.约束条件.python交互 一.表结构修改 --- alter 1.修改表名: alter table 原名 rename to 新名; 2.修 ...

  • oracle sql语句中like %参数%的用法

    oracle sql语句中like %参数%的用法,在网上找了很久没找到类似的帖子,因此分享一下我的收获,希望对看到的人有帮助 今天在处理oracle数据库数据merge的时候遇到一个问题: 在mer ...

  • 【Access】SQL语句中WHERE子句和HAVING 子句的异同

    初学SQL语句的时候,很多朋友总是无法理解HAVING 子句和WHERE子句之间区别,今天我们就来细细谈一谈这个问题.首先列出它们之间的相同和区别,然后我们举例说明. 一.相同点: 二者的相同点是在功 ...

  • 【Access】SQL语句中别名的使用之字段名别名

    别名主要使我们得到的查询结果更容易理解和阅读,关于别名的使用,我们还是先看个例子吧,如下图是一份简易的销售表: 现在假如我们想要查询每个员工的总销售额,我们可以建立如下的SQL查询: 运行一下得到如下 ...

  • 【Access】SQL语句中别名的使用之表名别名

    大家好,上次课我们学习了SQL语句中别名的使用之字段名别名的用法,今天我们学习SQL语句中别名的使用之表名别名,顾名思义,表名别名就是给表取一个别名,那么你会问有什么用呢,瞎折腾吗?肯定不是啦,我们看 ...

  • 【Access】SQL语句中自然连接的使用

    大家好,上次课程我们讲了等值连接,本节课跟随小编来学习一下自然连接.自然连接是按照公共属性值相等的条件进行连接,是一种特殊的等值连接,公共属性值不相等的行会被删除,同时在结果中消除重复的属性列. 我们 ...

  • 【Access】SQL语句中内连接的使用

    大家好,上次课程我们讲了自然连接的使用,本节课再跟随小编来学习一下内连接.内连接的效果和等值连接是一样的,只不过在Access数据库中的操作不一样罢了,这里先放上内连接的SQL语法格式: SELECT ...