目录

  • where后面加”1=1″还是不加
  • 不用where 1=1 在多条件查询的困惑
  • 使用where 1=1 的好处
  • 使用where 1=1 的坏处

where后面加”1=1″还是不加

比如现在有一个场景,DB数据库中有一张博客表(blog),想把blog表中的所有记录查询出来,那么可以有两种方式操作。一种写法是where关键词什么也不加,另一种写法是where关键词后面加”1=1″,写法如下:

  • where关键词什么也不加
  1. select * from blog;
  • where关键词后面加 “1=1”
  1. select * from blog where 1 = 1;

这两种SQL语句查询所得到的结果完全没有区别。那为什么要在where关键字后面添加”1=1″呢?

我们知道1=1表示true,即永真。如果使用不恰当会造T0级错误。例如在编写SQL语句时进行where条件查询时配合or运算符会得到意向不到的结果,结果会让你哆嗦。不信,往下看:

例如,当我们要删除博客ID称为“202102111501”的记录,我们可以这样写:

  1. delete from blog where blogId = "202102111501"

如果这个时候如果在where语句后面加上 or 1=1会是什么后果?

  1. delete from blog where blogId = "202102111501" or 1 = 1

本来只要博客ID称为“202102111501”的记录,结果因为添加了or 1=1的永真条件,会导致整张表里的记录都被删除了。那你可就闯祸了。

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

举个例子,如果你想查看当前博客中某条评论记录时,那么按照平时的查询语句的 动态构造,代码大体如下:

  1. String sql="select * from blog where";
  2. if ( condition 1) {
  3. sql = sql + " blogID = 202102111501";
  4. }
  5. if (condition 2) {
  6. sql = sql + " and commentID = 150101";
  7. }

如果上述的两个if判断语句均为true时,那么最终的动态SQL语句为:

  1. select * from table_name where blogID = 202102111501 and commentID = 150101;

可以看出来这是一条完整的正确的SQL查询语句,能够正确执行。

如果上述的两个if判断语句均为false时,那么最终的动态SQL语句为:

  1. select * from table_name where;

此时我们看看这条生成的SQL语句,由于where关键字后面需要使用条件,但是这条语句根本不存在,所以该语句就是一条错误语句,不能被执行,不仅报错,同时还查不到任何数据。

使用where 1=1 的好处

如果我们在where条件后加上1=1,看看它的真面目:

  1. String sql="select * from blog where 1=1";
  2. if ( condition 1) {
  3. sql = sql + " and blogID = 202102111501";
  4. }
  5. if (condition 2) {
  6. sql = sql + " and commentID = 150101";
  7. }

当condition 1和condition 2都为真时,上面被执行的SQL代码为:

  1. select * from blog where 1=1 and blogID = "202102111501" and commentID = 150101;

可以看出来这是一条完整的正确的SQL查询语句,能够正确执行。

如果上述的两个if判断语句均为false时,那么最终的动态SQL语句为:

  1. 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后虽然可以保证语法不会出错!

  1. select * from table_name where 1=1;

但是因为table中根本就没有名称为1的字段,该SQL其实等效于select * from table,这个SQL语句很明显是全表扫描,需要大量的IO操作,数据量越大越慢。

所以在查询时,where1=1的后面需要增加其它条件,并且给这些条件建立适当的索引,效率就会大大提高。

转:程序员灯塔

腾讯一面问我SQL语句中where条件为什么写上1=1的更多相关文章

  1. SQL 语句中 where 条件后 写上1=1 的意思

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

  2. sql 语句中使用条件判断case then else end

    sql 语句中使用条件判断case then else end范例: SELECT les.[nLessonNo] FROM BS_Lesson AS les WHERE les.[sClassCod ...

  3. SQL语句中过滤条件放在on、where、having的区别和联系

    摘要:SQL语句中,过滤条件放在不同筛选器on.where和having的区别和联系. 综述   在<SQL语句中过滤条件放在on和where子句中的区别和联系>中,介绍了多表关联SQL语 ...

  4. 判断合同金额是否可以转整形和sql语句中添加条件语句

    主要用到sqlserver语句中的判断语法 if (min_hetonge.Length > 0 && int.TryParse(min_hetonge, out min)) s ...

  5. SQL语句中过滤条件放在on和where子句中的区别和联系

    摘要: 介绍在多表关联SQL语句中,过滤条件放在on和where子句中的区别--inner join中没区别,外连接就不一样. 综述   蚂蚁金服的一道SQL面试题如下:SQL语句中,过滤条件放在on ...

  6. sql语句中----删除表数据drop、truncate和delete的用法

    sql语句中----删除表数据drop.truncate和delete的用法 --drop drop table  tb   --tb表示数据表的名字,下同 删除内容和定义,释放空间.简单来说就是把整 ...

  7. sql语句中获取datetime的日期部分或时间部分

    sql语句中获取datetime的日期部分 sql语句中 经常操作操作datetime类型数据.今天在写一个存储过程的时候需要将 一个datetime的值的 日期部分提取出来.网上有许多这方面的介绍. ...

  8. 解析sql语句中left_join、inner_join中的on与where的区别

    以下是对在sql语句中left_join.inner_join中的on与where的区别进行了详细的分析介绍,需要的朋友可以参考下 table a(id, type):id     type ---- ...

  9. SQL语句中count(1)count(*)count(字段)用法的区别

    SQL语句中count(1)count(*)count(字段)用法的区别 在SQL语句中count函数是最常用的函数之一,count函数是用来统计表中记录数的一个函数, 一. count(1)和cou ...

随机推荐

  1. 「SCOI2005」互不侵犯 (状压DP)

    题目链接 在\(N\times N\) 的棋盘里面放 \(K\)个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共\(8\) 个格子 ...

  2. CF 1400F x-prime Substrings 题解【AC自动机+DP】

    CF 1400F.x-prime Substrings 题意: 给定一个由\('1'\)到\('9'\)组成的字符串\(s\)和一个数\(x\),定义一个串为\(x-prime\)串,当且仅当这个串上 ...

  3. Codeforces Round #555 (Div. 3) C2. Increasing Subsequence (hard version) (贪心)

    题意:给你一组数,每次可以选队首或队尾的数放入栈中,栈中元素必须保持严格单增,问栈中最多能有多少元素,并输出选择情况. 题解:首先考虑队首和队尾元素不相等的情况,如果两个数都大于栈顶元素,那么我们选小 ...

  4. Relatives POJ - 2407 欧拉函数

    题意: 给你一个正整数n,问你在区间[1,n)中有多少数与n互质 题解: 1既不是合数也不是质数(1不是素数) 互质是公约数只有1的两个整数,叫做互质整数.公约数只有1的两个自然数,叫做互质自然数 所 ...

  5. 二、Jmeter 后置处理器(BeanShell PostProcessor)

    1.新建JDBC Request,如下图所示: 重要的参数说明: Variable Name:数据库连接池的名字,需要与JDBC Connection Configuration的Variable N ...

  6. [Python] Pandas的delete、drop函数的用法

    目录 drop函数 Axis(轴)含义 drop用法实验 delete函数 drop函数 DataFrame.drop(labels=None, axis=0, index=None, columns ...

  7. Python_小程序

    一.开发前的准备工作 1.申请AppID:一个账号对应一个小程序,个人/个体只能申请5个小程序 2.下载开发工具 二.小程序的文件结构 三. 1.数据绑定 1.1数据的设置 Page( data:{ ...

  8. Celery&Flower文档笔记

    1.Celery # tasks.py from celery import Celery app = Celery('tasks', broker='redis://localhost:6379', ...

  9. mark::开源绘图工具graphviz

    http://blog.csdn.net/iamljj/article/details/5862930 http://codeforces.com/contest/601/problem/D

  10. CodeForces 348D Turtles(LGV定理)题解

    题意:两只乌龟从1 1走到n m,只能走没有'#'的位置,问你两只乌龟走的时候不见面的路径走法有几种 思路:LGV定理模板.但是定理中只能从n个不同起点走向n个不同终点,那么需要转化.显然必有一只从1 ...