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 的原因 的相关文章

随机推荐

  • kotlin 没有@Parcelable注解

    在使用kotlin的时候 xff0c 有的时候需要对实体类进行序列化的操作 序列化的方式就两种 xff0c 一种是Serializable xff0c 一种是Parcelable 在android中 xff0c 基本都是使用的Parcela
  • Android studio3.0+ 编译Lame库(CMake方式)

    最近在学习音视频方面的知识 xff0c 购买了音视频开发进阶指南 xff0c 在交叉编译LAME库的时候 xff0c 书中使用的还是旧版本的编译方式 xff0c 现在android studio在2 2以后就开始使用CMake的编译方式了
  • 打印正整数n拆分的所有情况

    题目 xff1a 把一个正整数n拆分成若干个正整数的相加 xff0c 列出所有组合 例如 xff1a 4 61 4 4 61 1 43 3 61 2 43 2 4 61 1 43 1 43 2 4 61 1 43 1 43 1 43 1 动
  • redis实现积分排行榜

    在项目开发中常常遇到一些积分排行的问题 一个典型的积分行榜包括以下常见功能 xff1a 能够记录每个用户的分数 xff1b 能够对用户的分数进行更新 xff1b 能够查询每个用户的分数和名次 xff1b 能够按名次查询排名前N名的用户 xf
  • 如何减小Ubuntu 16.04系统下VMware虚拟机硬盘空间占用过大问题

    VMware虚拟机占用硬盘空间只增大不减少 xff0c 即使你删除文件 xff0c 占用的硬盘空间也不释放 用了一段时间后空间不够了 解决办法 方法一 在vmware的安装目录下 xff0c 有一个vmware vdiskmanager 关
  • 使用Redis实现积分排行榜,并支持同积分按时间排序

    排行榜这个功能很常见 xff0c 多用于激励用户活跃和拉新 xff0c 比如CSDN平台实现的周榜 xff0c 按照每周文章总阅读量进行排名 xff0c 用排名和奖品激励用户持续在平台上输出高质量内容 最近笔者也做了一个积分排行榜的功能 x
  • 神奇的排序

    代码 xff1a 此方法只能对互不相同的正整数排序 xff0c 也成为神奇的排序 xff0c 从编程珠玑中看到的 public class magicSort public static void main String args TODO
  • 学会自己测天气之 起卦篇

    找三个一元的硬币 xff0c 找一个安静的没人的地方 xff0c 把钱合在掌内反复摇动 xff0c 心中反复问神灵你想问的事情 然后抛出硬币 xff0c 记录反面 xff08 有花的那面 xff09 的数量 xff08 总共有四种情况 xf
  • Java 使用 jdbc 连接 mysql

    首先要下载Connector J地址 xff1a http www mysql com downloads connector j 这是MySQL官方提供的连接方式 xff1a 解压后得到jar库文件 xff0c 需要在工程中导入该库文件
  • 找零钱的方案数以及所需最少张数的钞票的方案

    问题描述 xff1a 我们知道人民币有1元 xff0c 2元 xff0c 5元 xff0c 10元 xff0c 20元 xff0c 50元 xff0c 100元这几种表示 xff0c 现在给你一个整数 n 让你找零 xff0c 求出有多少种
  • 2017京东校招编程题 烽火台

    描述 xff1a n 个 烽火台围成一个圈 xff0c 任意两个烽火台只要中间的烽火台比他们两个都低就能看见彼此 xff0c 当然相邻的肯定能看见对面 xff0c 求能看见彼此的对数 输入 5 烽火台的个数 3 2 5 4 1 烽火台的高地
  • 利用Oh-My-Zsh打造你的超级终端

    什么是Zsh Zsh是一款强大的虚拟终端 xff0c 既是一个系统的虚拟终端 xff0c 也可以作为一个脚本语言的交互解析器 Zsh的一些特性 兼容bash xff0c 原来使用bash的兄弟切换过来毫无压力 强大的历史纪录功能 xff0c
  • netty源码分析(二十五)Netty自定义协议与TCP粘包拆包问题解决之道

    上一节说了TCP的粘包和拆包 xff0c 用一个实例的方式做了说明 xff0c 那么在netty里面是怎么解决粘包和拆包问题呢 xff0c 这就需要编解码器 xff0c 我们写一个简单的自动以协议的demo xff0c 说明一下编解码器在解
  • Netty UDP通信Demo

    1 服务端代码 package udp import io netty bootstrap Bootstrap import io netty buffer ByteBuf import io netty buffer Unpooled i
  • 用FTP修改网站服务器内容

    用FTP协议可以登陆网站的服务器对网站内容进行维护 xff0c 如果直接从网页登陆可以进行的操作太少 xff0c 所以通常使用一些FTP客户端进行维护操作 常用的FTP客户端有很多 xff0c 个人觉得FileZila比较容易 xff0c
  • Ubuntu 16.04 安装Java jdk-8u171-linux-x64.tar.gz 教程

    一 xff0c 在线安装java 1 打开终端 xff0c 输入 xff1a sudo add apt repository ppa webupd8team java sudo apt get update sudo apt get ins
  • ARM-qt 开发,串口配置

    在使用终端开发使用串口时 xff0c 配置串口的方式尤为重要 1 要使用串口就先打开串口 int OpenUartPort const char UartPort int fd fd 61 open UartPort O RDWR O NO
  • 手把手教你在Github上建立自己的个人博客网站

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