«

Mysql where默认条件为啥写成1=1而不是1

nciaer 发布于 阅读:15


比如:

$where = '1';
$where = '1=1'

在功能上是等价的,但从规范度、可读性和扩展性来说有明显区别,我来详细解释一下:

一、核心区别:语法形式不同,但效果一致

在 SQL 语句中,WHERE 1 和 WHERE 1=1 都表示「条件永远为真」,最终都会查询满足其他条件(如user_info_id = {$userid})的所有记录,数据库执行引擎会把这两种写法优化成完全相同的执行计划,性能上没有任何差异。
举个例子:

-- 原代码拼接后的SQL(type=0时)
SELECT * FROM user_orders WHERE user_info_id = 123 AND 1 ORDER BY id DESC;

-- 优化后拼接的SQL(type=0时)
SELECT * FROM user_orders WHERE user_info_id = 123 AND 1=1 ORDER BY id DESC;

这两条 SQL 在数据库中执行的结果、效率完全一样。

二、为什么我要改成1=1?

可读性更强
1=1 是程序员通用的「恒真条件」写法,一看就知道是 “无额外筛选” 的意思;
而1在 SQL 中是 “布尔值真” 的简写,新手可能会困惑:“这个 1 代表什么?是字段值?还是状态?”,可读性差。

扩展性更好

假设后续需要给「全部」类型增加额外的基础筛选条件(比如只查近 1 年的记录),1=1的写法可以无缝拼接:

// 扩展示例:全部类型只查近1年的记录
$whereTypes = "1=1 AND duty_date >= '".date('Y-m-d', strtotime('-1 year'))."'";

而如果用1,拼接后会变成AND 1 AND duty_date >= ...,虽然也能运行,但逻辑上不连贯,不如1=1的写法自然。
语法更规范
SQL 标准中,WHERE子句后应该跟「布尔表达式」(如a=b、c>10),1=1是标准的布尔表达式;而1是 MySQL 等数据库对布尔值的简化支持(把非 0 数值视为真),并非所有数据库都兼容(比如 Oracle 中WHERE 1会报错,必须写WHERE 1=1)。