程序员为啥总在 SQL 里写 WHERE 1=1?懂了之后直呼真香

0 阅读3分钟

刚工作懵了:同事写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 吗?还是有更优雅的写法?欢迎在评论区交流~