在我的项目编写中,常常会在代码中应用到“where 1=1”,这是为什么呢?
目录
- where前面加"1=1"还是不加
- 不必where 1=1 在多条件查问的困惑
- 应用where 1=1 的益处
- 应用where 1=1 的害处
where前面加"1=1"还是不加
比方当初有一个场景,DB数据库中有一张博客表(blog),想把blog表中的所有记录查问进去,那么能够有两种形式操作。一种写法是where关键词什么也不加,另一种写法是where关键词前面加"1=1",写法如下:
- where关键词什么也不加
select * from blog;
- where关键词前面加 "1=1"
select * from blog where 1 = 1;
这两种SQL语句查问所失去的后果齐全没有区别。那为什么要在where关键字前面增加"1=1"呢?
咱们晓得1=1示意true,即永真。如果应用不失当会造T0级谬误。例如在编写SQL语句时进行where条件查问时配合or运算符会失去动向不到的后果,后果会让你颤抖。不信,往下看:
例如,当咱们要删除博客ID称为“202102111501”的记录,咱们能够这样写:
delete from blog where blogId = "202102111501"
如果这个时候如果在where语句前面加上 or 1=1会是什么结果?
delete from blog where blogId = "202102111501" or 1 = 1
原本只有博客ID称为“202102111501”的记录,后果因为增加了or 1=1的永真条件,会导致整张表里的记录都被删除了。那你可就闯祸了。
不必where 1=1 在多条件查问的困扰
举个例子,如果你想查看以后博客中某条评论记录时,那么依照平时的查问语句的 动静结构,代码大体如下:
String sql="select * from blog where";if ( condition 1) { sql = sql + " blogID = 202102111501";}if (condition 2) { sql = sql + " and commentID = 150101";}
如果上述的两个if判断语句均为true时,那么最终的动静SQL语句为:
select * from table_name where blogID = 202102111501 and commentID = 150101;
能够看进去这是一条残缺的正确的SQL查问语句,可能正确执行。
如果上述的两个if判断语句均为false时,那么最终的动静SQL语句为:
select * from table_name where;
此时咱们看看这条生成的SQL语句,因为where关键字前面须要应用条件,然而这条语句基本不存在,所以该语句就是一条谬误语句,不能被执行,不仅报错,同时还查不到任何数据。
应用where 1=1 的益处
如果咱们在where条件后加上1=1,看看它的真面目:
String sql="select * from blog where 1=1";if ( condition 1) { sql = sql + " and blogID = 202102111501";}if (condition 2) { sql = sql + " and commentID = 150101";}
当condition 1和condition 2都为真时,下面被执行的SQL代码为:
select * from blog where 1=1 and blogID = "202102111501" and commentID = 150101;
能够看进去这是一条残缺的正确的SQL查问语句,可能正确执行。
如果上述的两个if判断语句均为false时,那么最终的动静SQL语句为:
select * from table_name where 1=1;
当初,咱们来看这条语句,因为where 1=1 是为True的语句,因而,该条语句语法正确,可能被正确执行,它的作用相当于:sql="select * from table",即返回表中所有数据。
当在where关键字前面增加1=1时,如果此时查问时不抉择任何字段时,那么必将返回表中的所有数据。如果是依照某个字段进行单条查问时,那么就会此时的条件进行查问。
说到这里,不晓得您是否已明确,其实,where 1=1的利用,不是什么高级的利用,也不是所谓的智能化的结构,仅仅只是为了满足多条件查问页面中不确定的各种因素而采纳的一种结构一条正确能运行的动静SQL语句的一种办法。
应用where 1=1 的害处
咱们在写SQL时,加上了1=1后尽管能够保障语法不会出错!
select * from table_name where 1=1;
然而因为table中基本就没有名称为1的字段,该SQL其实等效于select * from table,这个SQL语句很显著是全表扫描,须要大量的IO操作,数据量越大越慢。
所以在查问时,where1=1的前面须要减少其它条件,并且给这些条件建设适当的索引,效率就会大大提高。
文章也会继续更新,能够微信搜寻「 迈莫coding 」第一工夫浏览。每天分享优质文章、大厂教训、大厂面经,助力面试,是每个程序员值得关注的平台。