不要再用where 1=1了,有更好的写法
ztj100 2025-05-30 19:03 18 浏览 0 评论
背景
刚入行的同学,看到在SQL语句中出现where 1 = 1这样的条件可能会有所困惑,而长时间这样使用的朋友可能又习以为常。
那么,你是否还记得当初为什么要这样写?是否有性能问题?有没有更好的写法?
今天这篇文章,带大家从头到尾梳理一下where 1 = 1的使用及改进,或许你能从中得到更多意想不到的收获。
where 1=1的作用
如果要问在SQL语句的where条件中多加1=1目的是什么,很简单:使得where条件语句永远为真。本质上就是虽然加了where条件,但实际上永远为真,也就相当于没有加任何约束条件。
使用该语句的场景主要是:动态构建SQL语句。
String sql = "select * from t_user where 1=1 ";
if(!b.equals("")){
sql += "and b='"+b+"'";
}
在上述语句拼写时,使用where 1=1,当b不等于空时,可以直接拼接“and”语句,而不会导致语法错误。如果没有where 1=1,原来的SQL语句就变成(假设b传入了"abc"):
"select * from t_user where and b= 'abc' ";
很明显,上述SQL语句会有语法错误。所以,之所以添加1=1,就是为了方便SQL拼接。
从另外一个角度来讲,不仅仅1=1可以这样使用,像:1<>2、2>1、'a'='a'等表达式,只要结果为true,都可以如此使用。
where 1<>1
上面讲了where 1=1的来历及使用,那么你是否使用过where 1<>1的形式呢?
你还别说,where 1<>1也是有使用场景的,比如:只获取表结构而不取数据。
create table t_temp as select * from t_user where 1<>1
上述语句,创建了一个与t_user表结构一样但没有任何数据的新表t_temp。
当然,除了表结构,其他的结构也可以如此使用。
where 1=1的性能问题
有人说,使用where 1=1可能会有性能问题,咱们直接来实验一下。
mysql 8.0.18,t_user表,id_no字段有索引:
explain select * from t_user where id_no = 'Tom25';
explain select * from t_user where 1=1 and id_no = 'Tom25';
执行上述两行SQL语句,explain结果都是如下:
也就是说,1=1这样条件,并不影响索引和性能,从explain结果上可以看出两者并无本质区别。
之所以不同的SQL语句,呈现了相同的结果,这是因为被Mysql优化了。Mysql在处理指令时,会对1=1这类无效的条件进行优化处理。这个与Java的编译器有些像,很多无效的判断或语句,在编译成字节码时,编译器会进行优化处理。
where 1=1的改进
虽然说1=1会被优化器优化掉,但优化操作本身还是会消耗MySQL的性能的,如果能够从根本上避免这种情况的出现,那不就更好了。
以Mybatis为例,在使用where 1=1时,通常会是如下写法:
<select id="queryUser" parameterType="com.choupangxia.entity.User" resultType="java.lang.Integer">
select count(id) from t_user u where 1=1
<if test="username !=null and username !='' ">
AND u.username = #{username}
</if>
<if test="userNo !=null and userNo !='' ">
AND u.user_no = #{userNo}
</if>
</select>
这里where 1=1的作用同上。但如果你更进一步去了解Mybatis的语法及标签,可以使用<where>标签来代替where 1=1:
<select id="queryUser" parameterType="com.choupangxia.entity.User" resultType="java.lang.Integer">
select count(id) from t_user u
<where>
<if test="username !=null and username !='' ">
u.username = #{username}
</if>
<if test="userNo !=null and userNo !='' ">
AND u.user_no = #{userNo}
</if>
</where>
</select>
这样,在查询数据比较大的情况下,可减少MySQL为了优化1=1这样的条件而损失的性能。
小结
本文我们从习以为常的where 1=1使用聊起,聊了它的使用场景、MySQL对其优化、以及延伸出来的where 1<>1的使用,同时基于常见的Mybatis框架,如何进一步改进。
其实,写这篇文章想传达的一个思想就是:再小,再习以为常的事物,如果你去思考、研究都会学到很多相关的知识点,也都可以对其进一步优化。
曾经有一个技术大佬说过:再简单的一段代码,如果将访问量扩大100倍、1000倍,都可以会出现问题。不要停止思考和学习!
- 上一篇:Java8流式操作的魅力
- 下一篇:这段代码有问题,但我绝对不改了!
相关推荐
- 这个 JavaScript Api 已被废弃!请慎用!
-
在开发过程中,我们可能会不自觉地使用一些已经被标记为废弃的JavaScriptAPI。这些...
- JavaScript中10个“过时”的API,你的代码里还在用吗?
-
JavaScript作为一门不断发展的语言,其API也在持续进化。新的、更安全、更高效的API不断涌现,而一些旧的API则因为各种原因(如安全问题、性能瓶颈、设计缺陷或有了更好的替代品)被标记为“废...
- 几大开源免费的 JavaScript 富文本编辑器测评
-
MarkDown编辑器用的时间长了,发现发现富文本编辑器用起来是真的舒服。...
- 比较好的网页里面的 html 编辑器 推荐
-
如果您正在寻找嵌入到网页中的HTML编辑器,以便用户可以直接在网页上编辑HTML内容,以下是几个备受推荐的:CKEditor:CKEditor是一个功能强大的、开源的富文本编辑器,可以嵌入到...
- Luckysheet 实现excel多人在线协同编辑
-
前言前些天看到Luckysheet支持协同编辑Excel,正符合我们协同项目的一部分,故而想进一步完善协同文章,但是遇到了一下困难,特此做声明哈,若侵权,请联系我删除文章!若侵犯版权、个人隐私,请联系...
- 从 Element UI 源码的构建流程来看前端 UI 库设计
-
作者:前端森林转发链接:https://mp.weixin.qq.com/s/ziDMLDJcvx07aM6xoEyWHQ引言...
- 手把手教你如何用 Decorator 装饰你的 Typescript?「实践」
-
作者:Nealyang转发连接:https://mp.weixin.qq.com/s/PFgc8xD7gT40-9qXNTpk7A...
- 推荐五个优秀的富文本编辑器
-
富文本编辑器是一种可嵌入浏览器网页中,所见即所得的文本编辑器。对于许多从事前端开发的小伙伴来说并不算陌生,它的应用场景非常广泛,平时发个评论、写篇博客文章等都能见到它的身影。...
- 基于vue + element的后台管理系统解决方案
-
作者:林鑫转发链接:https://github.com/lin-xin前言该方案作为一套多功能的后台框架模板,适用于绝大部分的后台管理系统(WebManagementSystem)开发。基于v...
- 开源富文本编辑器Quill 2.0重磅发布
-
开源富文本编辑器Quill正式发布2.0版本。官方TypeScript声明...
- Python之Web开发框架学习 Django-表单处理
-
在Django中创建表单实际上类似于创建模型。同样,我们只需要从Django类继承,则类属性将是表单字段。让我们在myapp文件夹中添加一个forms.py文件以包含我们的应用程序表单。我们将创建一个...
- Django测试入门:打造坚实代码基础的钥匙
-
这一篇说一下django框架的自动化测试,...
- Django ORM vs SQLAlchemy:到底谁更香?从入门到上头的选择指南
-
阅读文章前辛苦您点下“关注”,方便讨论和分享,为了回馈您的支持,我将每日更新优质内容。...
- 超详细的Django 框架介绍,它来了!
-
时光荏苒,一晃小编的Tornado框架系列也结束了。这个框架虽然没有之前的FastAPI高流量,但是,它也是小编的心血呀。总共16篇博文,从入门到进阶,包含了框架的方方面面。虽然小编有些方面介绍得不是...
- 20《Nginx 入门教程》使用 Nginx 部署 Python 项目
-
今天的目标是完成一个PythonWeb项目的线上部署,我们使用最新的Django项目搭建一个简易的Web工程,然后基于Nginx服务部署该PythonWeb项目。1.前期准备...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)