首页 文章详情

where 1=1 有什么用?

微信用户1406327061 | 333 2021-04-18 19:21 0 0 0
UniSMS (合一短信)

SQL注入

加不加where 1=1,查询一样吗?

e.g:

select  *  from  admin_sys_parameter;


select  *  from  admin_sys_parameter where 1=1
是的,上面的查询结果是没有区别。1=1表示true, 即永真,在SQL注入时配合or会有意想不到的的结果。

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

delete from users where name='李四'


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

即:

delete from users where name='李四' or 1=1


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

语法规范

为了保证语法规范的时候,也会使用到where1=1。如:

c6edb12807f9de782a5c6998f2c350d9.webp

如果我们不写1=1的话,当条件1为真时,代码拼接后被执行的SQL代码如下:

select *from  admin_sys_parameter where  and param_name=#{paramName};


结果,这里会出现一个SQL 的语法错误:and必须前后都有条件。

拷贝表

在我们进行数据备份时,也经常使用到where 1=1,其实也可以选择不写,结果是一样的。写上之后方便筛选一些数据再备份也会比较方便,可直接在后面添加and条件即可。
create   table_name   as   select   *   from   Source_table   where   1=1;


paste(复制)表结构

1<>1 的用处: 用于只取结构不取数据的场合 有1=1 就会有1<>1 或1=2之类的永假的条件,这个在拷贝表的时候,加上where1<>1,意思就是没有任何一条记录符合条件,这样我们就可以只拷贝表结构,不拷贝数据了。
create   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操作,数据量越大越慢。所以在查询时,where 1=1 的后面需要增加其它条件,并且给这些条件建立适当的索引,效率就会大大提高。
good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter