SQL里where后面的1=1是干嘛的,走的是什么索引

一、WHERE 1=1 是干嘛的

一句话:纯粹为了方便拼接 SQL,没有任何逻辑意义。

最常见的使用场景:动态 SQL

java 复制代码
// 后端动态拼接查询条件
String sql = "SELECT * FROM user WHERE 1=1";

if (name != null) {
    sql += " AND name = '" + name + "'";
}
if (age != null) {
    sql += " AND age = " + age;
}

生成的 SQL 可能是:

sql 复制代码
-- name 和 age 都传了
SELECT * FROM user WHERE 1=1 AND name = '张三' AND age = 25;

-- 只传了 name
SELECT * FROM user WHERE 1=1 AND name = '张三';

-- 什么都没传
SELECT * FROM user WHERE 1=1;

好处:

  • 不用判断"是不是第一个条件"来决定加 WHERE 还是 AND
  • 动态拼接时代码简洁,不用处理首条件前缀问题

那 WHERE 1=1 本身对性能有影响吗?

几乎没有。 优化器会直接把它当成恒真条件消掉:

sql 复制代码
-- 优化器眼里,这两条完全等价:
SELECT * FROM user WHERE 1=1 AND name = '张三';
SELECT * FROM user WHERE name = '张三';

MySQL / PostgreSQL / Oracle 的优化器都会做 常量折叠(Constant Folding) ,把 1=1 直接去掉,执行计划一模一样。


二、用的是什么索引?

1=1 本身不用任何索引。

它只是一个恒为 TRUE 的布尔表达式 ,优化器直接忽略它。真正决定走不走索引、走哪个索引的,是 AND 后面的有效条件:

sql 复制代码
-- 决定索引的是 name = '张三',不是 1=1
SELECT * FROM user WHERE 1=1 AND name = '张三';
条件 是否用索引 原因
1=1 ❌ 不用 恒真,被优化器直接消除
name = '张三' ✅ 看情况 name 列有索引就可能走,没有就全表扫描
1=0 ❌ 不用 恒假,优化器直接返回空结果集,连表都不扫

三、顺便提几个相关的"奇怪写法"

1. WHERE 1=0 → 快速拿表结构,不返回数据

sql 复制代码
SELECT * FROM user WHERE 1=0;

优化器直接判定结果为空,连表都不打开,常用于:

  • 只想要字段结构(比如 BI 工具探测表结构)
  • 创建空表:CREATE TABLE t2 AS SELECT * FROM t1 WHERE 1=0;

2. WHERE 1 → 和 WHERE 1=1 等价

有些老代码写 WHERE 1,效果完全一样,都是恒真。

3. 动态 SQL 的现代写法(推荐)

现在用 MyBatis 等框架,不需要手写 1=1 了:

xml 复制代码
<select id="query" resultType="User">
    SELECT * FROM user
    <where>
        <if test="name != null">
            AND name = #{name}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </where>
</select>

<where> 标签会自动处理:

  • 如果里面没有条件,不生成 WHERE 关键字
  • 自动去掉第一个条件前的 AND / OR

四、一句话总结

WHERE 1=1 是给程序员用的,不是给数据库用的。 它不参与索引选择,不影响执行计划,优化器直接把它当空气。真正决定性能和索引的是后面那些有意义的条件。

相关推荐
余槐i6 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
数据库小学妹6 小时前
PostgreSQL表膨胀怎么办?autovacuum清不动的根因与排查命令
数据库·postgresql·表膨胀·mvcc·数据库运维
mister_guo6 小时前
MySQL-1267错误:排序规则冲突的原因与解决方案
数据库·mysql
骇客野人7 小时前
在麒麟操作系统上 分别安装 jdk1.8, 达梦数据库,redis ,memcache 的操作实施方案和步骤
数据库·redis·memcached
美狐美颜SDK开放平台8 小时前
直播APP如何实现美白滤镜功能?视频美颜SDK技术开发方案详解
前端·数据库·人工智能·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
花间相见10 小时前
【计算基础|MySQL01】【上手】安装连接、数据类型与建库建表
数据库·后端
花间相见10 小时前
【计算基础|MySQL02】【上手】SQL 增删改查
数据库·后端
ITxiaobing202310 小时前
IP 库与 AppsFlyer 国家/地区数据不一致,如何系统地对账?
数据库·网络协议·tcp/ip
这个DBA有点耶10 小时前
从时间到语义:时序数据库与向量数据库的核心机制、选型与多模融合趋势
数据库·mysql·架构
对空六课11 小时前
RFM分层边界变化的回溯计算
大数据·服务器·前端·数据库·人工智能·算法·数据分析