在MySQL中,1=1 通常用作一种编程技巧,特别是在构建动态SQL查询时。它的用法及其优点包括以下几个方面

方便SQL的拼接

String sql = "select * from sys_user where 1=1";

if(条件){
 sql = sql + "and name = 'xiaofei'"
}

1=1 是可以避免 where 关键字后面的第一个词直接就是 and 而导致语法错误

拷贝表带数据

create table 新的表名 select * from 需要拷贝的表名 where 1=1

拷贝表不带数据

create table 新的表名 select * from 需要拷贝的表名 where 1<>1

# 下面的SQL也是可以的
create table 新的表名 select * from 需要拷贝的表名 where 1=2

性能问题

explain select * from sys_user where name = 'xiaofei';
explain select * from sys_user where 1=1 and name = 'xiaofei';

换句话来说,1=1 这样的条件对索引和性能没有影响。通过观察 explain 结果,我们可以发现两者之间没有本质区别。这种不同的 SQL 语句呈现出相同结果的现象,是因为 MySQL 对其进行了优化。当 MySQL 处理指令时,它会对 1=1 这类无效条件进行优化处理。这与 Java 编译器的工作原理相似,它们会在编译成字节码的过程中对许多无效判断或语句进行优化。

尽管1=1的条件会被优化器优化,但优化过程本身仍然会对MySQL的性能产生一定影响。因此,从根源上避免这种情况的发生。

Mybatis为例,可以使用 where 标签来代替 1=1

<select id="findUsers" resultType="User">
    SELECT * FROM users
   <where>
        <if test="name != null and name != ''">
            AND name = #{name}
        </if>
    </where>
</select>