一、where 1=1
1. ' 1=1 '是条件为永真,得到的结果就是未加入约束条件的
在SQL注入是会用到这个
例如: delete from table_a where a='落尘曦' ①
给强行加上 delete from table_a where a='落尘曦' or 1=1 ②
本来是删除 a值为落尘曦这一条数据,这就又变成了无约束的删除了。
1=1永真 ,1<>1 永假
例如一个模糊查询可能有a,b,c,d 约束,也可能没有,那该如何处理呢?
String sql=select * from table1 where 1=1; if(!a.equals("")){ sql=sql+"a='"+a+"'"; } if(!b.equals("")){ sql=sql+"b='"+b+"'"; } if(!c.equals("")){ sql=sql+"c='"+c+"'"; } if(!d.equals("")){ sql=sql+"d='"+d+"'"; }
where 1=1 的写法是为了检化程序中对条件的检测
上述例子的四个参数都可能为空, 这时你要构造语句的话,一个个检测再写语句就麻烦
这里你怎么写?要不要加where 或直接用 and ?,你这里还要对参数是否为空进行检测
用上 where 1=1 之后,就不存在这样的问题, 条件是 and 就直接and ,是or就直接接 or
如果不写1=1呢,那么在每一个不为空的查询条件面前,都必须判断有没有where字句。否则要在第一个出现的地方加where。
1=1的用处 主要用来构件动态SQL
String sql="select a,b from table_a where 1=1"; if(!b.equals("")) { sql+="and b='"+b+"'" }
当用户选择了b(假如b值为qwe)
结果就是: String sql="select a,b from table_a where 1=1 and b='qwe'";
但是当用户没有选择b 那b就是一个空值
结果就是: String sql ="select a,b from table_a where 1=1"
运行也不会出错,相当于没有限制b这个条件。
但是如果没有1=1的条件,则String sql="select a,b from table_a where ";这样就会报错。
1<>1 的用处: 用于只取结构不取数据的场合
例如:
create table table_temp tablespace tbs_temp as select * from table_ori where 1<>1
建成一个与table_ori 结构相同的表table_temp,但是不要table_ori 里的数据。(除了表结构,其它结构也同理)
除了1=1 或1<>1之外的其它永真永假的条件同理。