在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>
打赏
当前共有 0 条评论