刚工作懵了:同事写SQL必带 WHERE 1=1,我以为多余,用一次就真香了
刚工作那会儿,看到同事写 SQL 总带一句 WHERE 1=1,我当场就懵了:1 永远等于 1,这条件写了跟没写一样,到底图啥?
怕问了显得太菜,就自己默默研究了一下,结果用了一次就彻底爱上 —— 这根本不是多余代码,而是写动态查询的神器小技巧。
一、1=1 到底是干嘛的?
简单说,它就是 SQL 里的一个万能占位符。
平时正常查询:
SELECT * FROM users WHERE age > 18
加上 1=1 之后:
SELECT * FROM users WHERE 1=1 AND age > 18
乍一看很多余,但放到动态拼接条件的场景里,优势直接拉满。
二、真实场景:多条件可选查询(核心用途)
做后台管理系统最常见:用户搜索页面,筛选条件全是可选的。
比如:
- 用户名(可选)
- 年龄(可选)
- 状态(可选)
用户可能只填一个,可能都填,也可能啥都不填。
不用 1=1 的噩梦写法
你得专门定义标记变量,每次拼接都要判断:前面有没有条件?
有就加 AND,没有就不加,代码又长又容易出语法错。
用 1=1 的优雅写法
直接一句 WHERE 1=1 兜底,AND 后面所有条件统一加 就行,不用任何判断!
SELECT * FROM users
WHERE 1=1
AND username = '张三'
AND age > 18
AND status = 'active'
✅ 代码清爽干净 ✅ 逻辑简单无脑 ✅ 彻底避免语法错误
三、会不会影响性能?
完全不用担心!
现在的数据库优化器(MySQL/Oracle/PostgreSQL)都非常智能,看到 1=1 这种恒成立条件,执行时会直接优化掉,根本不会真的去判断。
我在百万级数据表里实测过:加不加 1=1,执行速度、执行计划几乎一模一样,没有性能损耗。
四、调试时的隐藏神技:快速注释条件
调试 SQL 想临时屏蔽某个条件,有 1=1 超级方便:
SELECT * FROM users
WHERE 1=1
AND username = '张三'
-- AND age > 18 直接注释,不影响其他语句
AND status = 'active'
直接注释掉一行就行,不用管后面的 AND 会不会报错。
如果没有 1=1,你还得顺手删掉下一个条件前的 AND,麻烦又容易漏。
五、这几个坑一定要避开
好用归好用,但别乱用,这 3 个坑踩了会出大问题:
1. 千万别和 OR 一起用
-- 错误示例:条件恒成立,会导致全表扫描!
WHERE 1=1 OR age > 18
2. 拼接字符串记得防 SQL 注入
不要直接拼接变量,尽量用预编译语句(? 占位符)。
3. 遵守团队规范
有些公司编码规范不推荐这种写法,按团队要求来即可。
六、总结
WHERE 1=1 不是什么花活,就是一个实用的开发小习惯:
- ✅ 简化动态 SQL 拼接
- ✅ 不用判断是不是第一个条件
- ✅ 调试时方便注释条件
- ✅ 数据库自动优化,几乎不影响性能
- ✅ 代码更简洁,维护更轻松
用过之后就知道,这波是真的香。
互动话题
你平时写 SQL 会用 1=1 吗?还是有更优雅的写法?欢迎在评论区交流~