数据库在进行查询的时候,经常看到有的人使用where 1=1和1=0,1=2等的查询,
这种条件在执行前,就会被计算出true 或者false,
1=2实际解释为(NULL IS NOT NULL)
true 则不影响,false则不会扫描
主要是一些程序员的为了拼凑动态的sql语句,如果使用不好会起到副作用的,是根据个人的一些习惯,是为了避免where 关键字后面的第一个词直接就是 “and”而导致语法错误,是为了后面附加and …方便程序逻辑处理用的。


这段代码应该是由程序(例如Java)中生成的,where条件中 1=1 之后的条件是通过 if 块动态变化的。例如:

  String sql="select * from table_name  where 1=1";if( conditon 1) {sql=sql+"  and  var2=value2";}if(conditon 2) {sql=sql+"  and var3=value3";}

where 1=1 是为了避免where 关键字后面的第一个词直接就是 “and”而导致语法错误。


详细解释:

where 1=1; 这个条件始终为True,在不定数量查询条件情况下,1=1可以很方便的规范语句。

一、不用where 1=1 在多条件查询中的困扰

  举个例子,如果您做查询页面,并且,可查询的选项有多个,同时,还让用户自行选择并输入查询关键词,那么,按平时的查询语句的动态构造,代码大体如下:

  string MySqlStr=”select * from table where”;

  if(Age.Text.Lenght>0)
  {
    MySqlStr=MySqlStr+“Age=“+“’Age.Text’“;
  }

  if(Address.Text.Lenght>0)
  {
    MySqlStr=MySqlStr+“and Address=“+“’Address.Text’“;
  }

  ①种假设

  如果上述的两个IF判断语句,均为True,即用户都输入了查询词,那么,最终的MySqlStr动态构造语句变为:

  MySqlStr=”select * from table where Age=’18’ and Address=’云南省文山州广南县小波吗村’”

  可以看得出来,这是一条完整的正确的SQL查询语句,能够正确的被执行,并根据数据库是否存在记录,返回数据。

  ②种假设

  如果上述的两个IF判断语句不成立,那么,最终的MySqlStr动态构造语句变为:

  MySqlStr=”select * from table where“

  现在,我们来看一下这条语句,由于where关键词后面需要使用条件,但是这条语句根本就不存在条件,所以,该语句就是一条错误的语句,肯定不能被执行,不仅报错,同时还不会查询到任何数据。

  上述的两种假设,代表了现实的应用,说明,语句的构造存在问题,不足以应付灵活多变的查询条件。

  二、使用 where 1=1 的好处

  假如我们将上述的语句改为:

  string MySqlStr=”select * from table where 1=1 ”;

  if(Age.Text.Lenght>0)
  {
    MySqlStr=MySqlStr+“and Age=“+“’Age.Text’“;
  }

  if(Address.Text.Lenght>0)
  {
    MySqlStr=MySqlStr+“and Address=“+“’Address.Text’“;
  }

  现在,也存在两种假设

  ①种假设

  如果两个IF都成立,那么,语句变为:

  MySqlStr=”select * from table where 1=1 and Age=’18’ and Address=’云南省文山州广南县小波吗村’”,很明显,该语句是一条正确的语句,能够正确执行,如果数据库有记录,肯定会被查询到。

  ②种假设

  如果两个IF都不成立,那么,语句变为:

  MySqlStr=”select * from table where 1=1”,现在,我们来看这条语句,由于where 1=1 是为True的语句,因此,该条语句语法正确,能够被正确执行,它的作用相当于:MySqlStr=”select * from table”,即返回表中所有数据。

  言下之意就是:如果用户在多条件查询页面中,不选择任何字段、不输入任何关键词,那么,必将返回表中所有数据;如果用户在页面中,选择了部分字段并且输入了部分查询关键词,那么,就按用户设置的条件进行查询。

  说到这里,不知道您是否已明白,其实,where 1=1的应用,不是什么高级的应用,也不是所谓的智能化的构造,仅仅只是为了满足多条件查询页面中不确定的各种因素而采用的一种构造一条正确能运行的动态SQL语句的一种方法。

where 1=0; 这个条件始终为false,结果不会返回任何数据,只有表结构,可用于快速建表

“SELECT * FROM strName WHERE 1 = 0”; 该select语句主要用于读取表的结构而不考虑表中的数据,这样节省了内存,因为可以不用保存结果集。

create table newtable as select * from oldtable where 1=0; 创建一个新表,而新表的结构与查询的表的结构是一样的。


个人补充:
在 mybatis 中,为了防止此问题发生,做法如下,加where可以自动将第一个and去掉。

SQL语句拼接常加 where 1=1 的原因相关推荐

  1. 拼接字符SQL语句拼接 最后一个字符多出 处理方式

    上班之余抽点时间出来写写博文,希望对新接触的朋友有帮助.今天在这里和大家一起学习一下拼接字符 String [] name=new String[]{"张三","李四&q ...

  2. 自己写的Python数据库连接类和sql语句拼接方法

    这个工具类十分简单和简洁. sql拼接方法 # encoding=utf-8 from django.http import HttpResponse from anyjson import seri ...

  3. python怎么和sql一起用_自己写的Python数据库连接类和sql语句拼接方法

    这个工具类十分简单和简洁. sql拼接方法 # encoding=utf-8 from django.http import HttpResponse from anyjson import seri ...

  4. mybatis 动态sql语句拼接

    mybatis常用占位符的方式传递参数,比较安全,可以防止sql注入. 有些时候,特殊逻辑需要java封装好一些特殊的查询条件,然后和mybatis一起封装成特殊sql进行执行. #{param}:替 ...

  5. php sql报错1054 in,sql语句拼接 报错

    1054:Unknown column 'a.first_letter' in 'where clause' 但数据表是有first_letter这个字段的 [ SQL语句 ] : SELECT a. ...

  6. SQL SERVER 存储过程执行带输出参数的SQL语句拼接

    注意:定义的要执行的SQL语句必须是nvarchar类型 CREATE PROC P_BranchOrderSalesStatistics @beginTime DateTime, --开始时间 @e ...

  7. MySQL——sql语句处理时间——日期加减天数

    增加时间 函数:date_add() 以当前时间为例:now()表示当前时间 select date_add(now(), interval 1 day); -- 加1天 -------------- ...

  8. oracle中sql语句拼接单引号,oracle 单引号拼凑和动态sql

    a.单引号问题(') 在oracle中4个单引号''''代表一个单引号'.在动态sql拼凑中我们经常需要拼凑单引号.比如: 变量 中带单引号:IV_DATE_FORMAT:=''''||'YYYYMM ...

  9. phpsql拼接_SQL存储过程中SQL语句拼接

    set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go -- ============================================= -- Au ...

最新文章

  1. 【深度学习】基于Torch的Python开源机器学习库PyTorch卷积神经网络
  2. C语言学习笔记 (005) - 二维数组作为函数参数传递剖析
  3. 罗泾数据中心顺利投产 中国太保科技建设正式步入“两地三中心”时代
  4. Chrome 浏览器调试移动端
  5. profibus 主站软件_SIMATIC S71500与TIA博途软件的使用连载63
  6. JRE System Library和 Referenced Libraries 的区别和来源
  7. 工作165:混入调用的时候
  8. 这可能是大型复杂项目下数据流的最佳实践
  9. [skill] C与C++对于类型转换的验证
  10. 中科曙光:与VMware合资公司是技术公司
  11. python修改第三方库重写_python安装第三方库时的一些bug 镜像源修改
  12. Python机器学习:评价分类结果008多分类问题中的混淆矩阵
  13. javaweb之mysql数据库
  14. 同步异步、阻塞非阻塞
  15. Jfree 数据可视化
  16. python绘制等边三角形的代码_python 打印直角三角形,等边三角形,菱形,正方形的代码...
  17. ARP 地址解析协议 IP地址到MAC地址的转换过程
  18. 51单片机实现万年历
  19. 人工智能—语音识别技术发展史
  20. EJB到底是什么?(推荐)

热门文章

  1. 基于Java的Selenium学习笔记——Assert
  2. Javascript中的async await
  3. linux 从命令行自动识别文件并将其打开的命令
  4. Linux学习笔记三
  5. 分布式设计与开发(一)------宏观概述
  6. awk按ip统计日志数
  7. DotNet(C#)自定义运行时窗体设计器 一
  8. 知乎上-翻车的笔记本
  9. ETL的数据同步工具调研(持续更新中)
  10. xfce4开始菜单中的小老鼠图标不见了