where 1=1 有什么用?
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的永真条件,会导致整张表里的记录都被删除了。
语法规范
如果我们不写1=1的话,当条件1为真时,代码拼接后被执行的SQL代码如下:
select *from admin_sys_parameter where and param_name=#{paramName};
结果,这里会出现一个SQL 的语法错误:and必须前后都有条件。
拷贝表
create table_name as select * from Source_table where 1=1;
paste(复制)表结构
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 的后面需要增加其它条件,并且给这些条件建立适当的索引,效率就会大大提高。评论