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)。