|
|
|
|
公众号矩阵

不懂就问:SQL 语句中 Where 条件后 写上1=1 是什么意思

在MySQL早期的版本中“ where 1=1”可能会对有所影响,使用了“where 1=1”的过滤条件以后数据系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描(即全表扫描)以比较此行是否满足过滤条件,当表中数据量较大时查询速度会非常慢。

作者:丶平凡世界 来源:SQL数据库开发|2021-09-16 06:44

程序员在编程过程中,经常会在代码中使用到“where 1=1”,这是为什么呢?

SQL注入

初次看到这种写法的同学肯定很纳闷,加不加where 1=1,查询不都一样吗?例如:

  1. select * from customers; 
  2. 与 
  3. select * from customers where 1=1; 

查询出来的结果完全没有区别呀。

是的,上面的查询结果是没有区别,但是这并不是我们要添加它的目的。我们知道1=1表示true,即永真,在SQL注入时配合or运算符会得到意向不到的结果。

例如,当我们要删除客户名称为“张三”的记录,我们可以这样写:

  1. delete from customers where name='张三' 

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

即:

  1. delete from customers where name='张三' or 1=1 

本来只要删除张三的记录,结果因为添加了or 1=1的永真条件,会导致整张表里的记录都被删除了。

当然这种事我们可千万不能干,也不能让别人有机可乘,这里只是为了表述where 1=1的作用之一。

语法规范

我们在写代码的过程中,为了保证语法规范的时候,也会使用到where 1=1。

我们先看下面这段Java代码:

  1. String sql="select * from table_name where 1=1"
  2. if( condition 1) { 
  3.   sql=sql+"  and  var2=value2"
  4. if(condition 2) { 
  5.   sql=sql+"  and var3=value3"

如果我们不写1=1的话,当condition 1为真时,代码拼接后被执行的SQL代码如下:

  1. select * from table_name where and var2=value2; 

很明显,这里会出现一个SQL 的语法错误:and必须前后都有条件。

有人说我直接把where写在if语句里面,我就不写where 1=1。

  1. String sql="select * from table_name"
  2. if( condition 1) { 
  3.   sql=sql+" where var2=value2 "
  4. if(condition 2) { 
  5.   sql=sql+" where var3=value3"

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

  1. select * from table_name where var2=value2; 

这个确实没有语法错误,但是当condition 1和condition 2都为真呢?那么SQL语句就变成了这样:

  1. select * from table_name  
  2. where var2=value2  
  3. where var3=value3; 

很明显这是不符合SQL语法规范的。

这里写上where 1=1 是为了避免where 关键字后面的第一个词直接就是 “and”而导致语法错误,加上1=1后,不管后面有没有and条件都不会造成语法错误了。

拷贝表

在我们进行数据备份时,也经常使用到where 1=1,当然其实这两可以不写,写上之后如果想过滤一些数据再备份会比较方便,直接在后面添加and条件即可。

  1. create table  table_name 
  2. as    
  3. select * from  Source_table 
  4. where   1=1; 

复制表结构

有1=1就会有1<>1或1=2之类的永假的条件,这个在拷贝表的时候,加上where 1<>1,意思就是没有任何一条记录符合条件,这样我们就可以只拷贝表结构,不拷贝数据了。

  1. create table  table_name 
  2. as    
  3. select  * from    
  4. Source_table where   1 <> 1; 

1=1的性能问题

在MySQL早期的版本中“ where 1=1”可能会对有所影响,使用了“where 1=1”的过滤条件以后数据系统就无法使用索引等查询优化策略,数据库系统将会被迫对每行数据进行扫描(即全表扫描)以比较此行是否满足过滤条件,当表中数据量较大时查询速度会非常慢。

但在5.6版本(也可能更早几个版本)以后这个问题被优化了,在写“where 1=1”时,查询分析器会将“1=1”处理掉,所以不会对查询造成性能影响,感兴趣的小伙伴可以试验一下,反正我试过了。

【编辑推荐】

  1. 鸿蒙官方战略合作共建——HarmonyOS技术社区
  2. 12个数据库安全故障和错误,看看你“踩雷”没?
  3. Access2013数据库零基础入门实例教程第5部
  4. Veeam 备份还原SQL Server 数据库(物理机版)
  5. 除了 MySQL 数据库,你还要了解的一些数据库
  6. 10个人有9个答错,另外1个只对一半:数据库的锁,到底锁的是什么?
【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

带你轻松入门 RabbitMQ

带你轻松入门 RabbitMQ

轻松入门RabbitMQ
共4章 | loong576

45人订阅学习

数据湖与数据仓库的分析实践攻略

数据湖与数据仓库的分析实践攻略

助力现代化数据管理:数据湖与数据仓库的分析实践攻略
共3章 | 创世达人

14人订阅学习

云原生架构实践

云原生架构实践

新技术引领移动互联网进入急速赛道
共3章 | KaliArch

42人订阅学习

视频课程+更多

强哥带你学习k8s

强哥带你学习k8s

讲师:周玉强3908人学习过

金蝶K3 WISE 视频教程全集

金蝶K3 WISE 视频教程全集

讲师:金速鹏99982人学习过

Linux下PHP多进程编程

Linux下PHP多进程编程

讲师:可用行师26197人学习过

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微