SQL语句拼接常加 where 1=1 的原因

2023-05-16

数据库在进行查询的时候,经常看到有的人使用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去掉。
这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL语句拼接常加 where 1=1 的原因 的相关文章

  • 将 JSON 值列表分解为 SNOWFLAKE 数据库表中的行

    我有一个如下图所示的表格 它基本上是一个 JSON 经过解析后得到下面的输出 现在我希望将 City 和 order 列中的值列表拆分为行 有人可以帮我吗 期望的输出如下 这是一种方法 首先去掉 和 因为 city 列中的双引号不包含单个数
  • 如何从数据库获取视图的行数?

    我正在尝试创建一个自定义视图 以获取数据库所有视图和表的行数 在 SQL Server 中获取表的计数是该死的 SELECT TABLE SCHEMA TABLE NAME TABLES TABLE NAME RECORD COUNT MA
  • 在使用 CTE 模拟的 UPSERT 中生成默认值

    在 PostgreSQL 中模拟 UPSERT 的可写 CTE 看起来相当优雅 直到我们在 Postgres 中获得实际的更新插入 合并 请参阅 https stackoverflow com a 8702291 558819 https
  • 将一项选择中的两项计数相除

    我有一个这样的表 date timestamp Error integer someOtherColumns 我有一个查询来选择特定日期的所有行 SELECT from table WHERE date date 2010 01 17 现在
  • has_many 与总活跃记录

    class Product lt ActiveRecord Base belongs to category has many order items dependent destroy end class OrderItem lt Act
  • 如何在字符串中用双撇号替换撇号?

    我有一根绳子 good overview of ESP s in more detail than you probably need 插入 SQL 表时出现错误 所以我想用双撇号替换字符串中的撇号 例如 good overview of
  • Linq to NHibernate 生成到同一个表的多个联接

    当我在 select 和 where 子句中引用同一个表时 linq to Nhibernate 会生成两个连接 一个用于 select 一个用于 where IE from child in Session Query
  • 从 CREATE TABLE SQL 生成图形模式表示

    我有一个包含许多 CREATE TABLE 语句的 sql 文件 没有参考规范 MyISAM 的东西 但我喜欢创建不同的表框 然后手动组成表关系 我正在使用Mac 有免费的程序可以做到这一点吗 是的MySQL工作台 http dev mys
  • 如何命名在存储过程中返回的数据集的表?

    我有以下存储过程 Create procedure psfoo AS select from tbA select from tbB 然后我以这种方式访问 数据 Sql Command mySqlCommand new SqlCommand
  • 在 IF .. ELSE 语句中使用临时表

    为什么SQL Server坚持认为临时表已经存在 其中之一将会发生 所以永远不会出现这种情况 declare checkvar varchar 10 declare tbl TABLE colx varchar 10 set checkva
  • PostgreSQL 列名区分大小写吗?

    我有一个数据库表 persons在另一个团队传下来的 Postgres 中 有一个列名 first Name 现在我尝试使用 PG Commander 来查询这个表的这个列名 select from persons where first
  • 如何查看SQL Server 2008中表空间的总使用量?

    在 SQL server 2008 中 我如何 通过 SQL 查询 找到 SQL Server 2008 R2 的特定实例 或所有实例 的表空间使用百分比 另外 获取 SQL Server 的所有命名实例的列表的最佳方法 查询 是什么 这是
  • SQL - 被 SELECT 困扰 - 请帮忙!

    我试图在 SQL Server 2005 中实现以下目标 SELECT IF EITHER EXISTS usr username pro email FROM table1 AS usr table2 AS pro WHERE usr u
  • ORDER BY 的列有时为空

    Mysql 看起来像这样 SELECT CompanyName LastName FirstName FROM JOIN ORDER BY CompanyName LastName FirstName 现在的问题是 A 列有时是空的 或者是
  • JPA Criteria API:用于可选关系的 LEFT JOIN

    我基本上是第一次使用 Criteria API 这是关于抽象通用构建器的查询 public TypedQuery
  • 检查 SQL Server 中的变量是否包含任何非数字

    我有一个如下查询 DECLARE rptID VARCHAR 8 SET rptID SELECT reportID FROM Reports 一般来说 rptID包含数字 如 00001234 等 但是有什么方法可以验证变量是否 rptI
  • Rails 中 Postgresql 的准备语句

    现在我正在从 SQLite 迁移到 Postgresql 的过程中 遇到了这个问题 以下准备好的语句适用于 SQLite id 5 st ActiveRecord Base connection raw connection prepare
  • SQL 2008 存储过程中的可选 where 子句/参数?

    我正在编写一些更新表的代码 根据用户想要执行的操作 它会更新一大组记录或较小的记录 描述因素是组ID 用户可以选择是更新表中的所有记录 还是仅更新具有该 groupID 的记录 我想对两个实例使用相同的存储过程 其中可能有一些逻辑来区分场景
  • 用于教育目的的公共 SQL 数据库

    我正在寻找一个可以免费访问的公开可用的 SQL 数据库 可以在其中运行一些SELECT免费查询一些有意义的数据 不是 item1 item2 item3 你见过吗 如果能附上一些教程就更好了 供应商并不那么重要 只要可以使用通用 JDBC
  • mysql 选择不同的字母,包括扩展拉丁字符

    原问题 表结构 CREATE TABLE texts letter VARCHAR 1 CHARACTER SET utf8 COLLATE utf8 general ci NOT NULL text VARCHAR 255 CHARACT

随机推荐

  • PX4程序编译过程解析

    第一章 PX4程序编译过程解析 PX4是一款软硬件开源的项目 xff0c 目的在于学习和研究 其中也有比较好的编程习惯 xff0c 大家不妨可以学习一下国外牛人的编程习惯 这个项目是苏黎世联邦理工大学的一个实验室搞出来的 该方案是基于NUT
  • Git使用之——冲突解决一(git merge conflict)

    Git冲突是在多用户协同工作下出现 xff0c 在一些情况下Git可以智能自动合并 xff0c 但有时需要用户手动合并 xff08 本文链接 xff1a http blog csdn net u012150179 article detai
  • git fetch 的简单用法:更新远程代码到本地仓库

    Git中从远程的分支获取最新的版本到本地方式如下 xff0c 如何更新下载到代码到本地 xff0c 请参阅ice的博客基于Github参与eoe的开源项目指南 方式一 1 查看远程仓库 1 2 3 4 5 6 git remote v eo
  • 各类数值型数据间如何混合运算?

    整型 包括int xff0c short xff0c long 实型 包括float xff0c double 可以混合运算 前已述及 xff0c 字符型数据可以与整型通用 xff0c 因此 xff0c 整型 实型 字符型数据间可以混合运算
  • 整型与字符型相加

    想通过整型与字符型相加的到正确的整型数值 xff0c xff0c 见下面的程序 xff1a include lt stdio h gt void main int a 61 2 char c 61 39 3 39 int b 61 a 43
  • Scrapy研究探索(五)——自动多网页爬取(抓取某人博客所有文章)

    首先 xff0c 在教程 xff08 二 xff09 xff08 http blog csdn net u012150179 article details 32911511 xff09 中 xff0c 研究的是爬取单个网页的方法 在教程
  • Scrapy研究探索(六)——自动爬取网页之II(CrawlSpider)

    原创 xff0c 转载注明 xff1a http blog csdn net u012150179 article details 34913315 一 目的 在教程 xff08 二 xff09 xff08 http blog csdn n
  • reStructuredText

    此文章转自 xff1a http wstudio web fc2 com others restructuredtext html 还有一篇中文教程也可以 xff1a http jwch sdut edu cn book rst html
  • 智能指针tr1::shared_ptr、boost::shared_ptr使用

    对于tr1 shared ptr在安装vs同时会自带安装 xff0c 但是版本较低的不存在 而boost作为tr1的实现品 xff0c 包含 Algorithms Broken Compiler Workarounds Concurrent
  • 关于CSDN几点用户体验较差的功能(收藏夹和草稿箱)

    1 收藏夹不去重 同一专栏或博客每点一次 收藏 都会增加到收藏夹中 收藏内容一般有两种形式 xff1a xff08 1 xff09 专栏收藏 xff08 2 xff09 博客文章收藏 对于前者 xff0c 虽然专栏的文章数量可能是不断在增加
  • 关于提高效率的几点

    有些时候感觉一直没闲着却没看见多少成果 突然看见这篇文章 xff08 http www cppfans org 1644 html xff09 xff0c 虽然不能全部认同 xff0c 但是的确有些部分还是值得思考的 以下为转载 xff1a
  • PX4应用examples[1]:px4_simple_app解析与自己的功能模块构建

    PX4应用examples 1 px4 simple app解析与自己的应用构建 px4 simple app源代码学习代码分析第一部分 PX4简单打印消息的发布第二部分 传感器信息的获取关于sensor combined的介绍 xff1a
  • 已将GitHub scrapy-redis库升级,使其兼容最新版本Scrapy

    1 代码升级 之前的问题 xff1a 随着Scrapy库的流行 xff0c scrapy redis作为使用redis支持分布式爬取的工具 xff0c 也不断的被大家发现 但是 xff0c 使用过程中你会发现的问题是由于scrapy red
  • CMake应用:交叉编译

    交叉编译指的在一个平台上生成另一个平台上的可执行代码 很多时候 xff0c 开发的代码可能并不只是在开发主机的平台上执行 xff0c 比如在Windows下开发的程序 xff0c 希望能够在Linux 或者MacOS下执行 xff1b 或者
  • 手把手教你在Github上建立自己的个人博客网站

    概述 之前闲着没事 就利用Github建了一个个人博客网站 效果还不错 今天就来分享一下 建立自己个人博客网站的好处 1 面试装逼 这个不必多说 2 把平时积累的知识和项目记录下来 方便日后查看使用 3 不受其他博客平台的限制 准备工作 开
  • Realsense D435保存图像

    你可以走慢一点 xff0c 但脚步不能停下来 Realsense是我使用的第3款深度传感器 xff0c 前两款分别是Orbbec和Kinect v2 xff0c 奥比中光的深度传感器只需要USB接口 xff0c 但深度图的效果并不好 xff
  • Realsense T265简单测试

    为啥才是周三 xff01 xff01 软硬件配置 CPU xff1a Intel Core i7 7820HQ CPU 64 2 90GHz 8 内存 xff1a 16G 系统版本 xff1a Ubuntu16 04 LTS 64位 深度传
  • 生成随机数方法总结

    使用srand time NULL 或srand time 0 设置当前的系统时间值为随机数种子 xff0c 需要在头文件处使用 include lt cstdlib gt 和 include lt ctime gt 要取得 a b 的随机
  • 尚硅谷_JavaScript_学习笔记

    JavaScript简介 JavaScript 简介 xff1a JavaScript 是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言 xff0c 是一种动态 弱类型 基于原型的语言 xff0c 内置支持类 它的解释器被称为 Ja
  • SQL语句拼接常加 where 1=1 的原因

    数据库在进行查询的时候 xff0c 经常看到有的人使用where 1 61 1和1 61 0 1 61 2等的查询 xff0c 这种条件在执行前 xff0c 就会被计算出true 或者false xff0c 1 61 2实际解释为 NULL