
当在 where 子句中混合使用 or 和 and 时,因运算符优先级差异(and 优先于 or),未加括号会导致 deleted=0 条件未按预期生效;正确做法是用圆括号明确逻辑分组。
当在 where 子句中混合使用 or 和 and 时,因运算符优先级差异(and 优先于 or),未加括号会导致 deleted=0 条件未按预期生效;正确做法是用圆括号明确逻辑分组。
在 SQL 查询中,逻辑运算符 AND 的优先级高于 OR。这意味着,若不显式使用括号,数据库会先计算所有 AND 条件,再处理 OR,从而可能产生不符合业务逻辑的结果。
例如,原始查询:
SELECT * FROM table_tutup_kas LEFT JOIN table_formulir_pelita ON table_formulir_pelita.id_formulir = table_tutup_kas.id_formulir WHERE nomor_formulir LIKE '%mikha%' OR harga_pelita LIKE '%5%' AND deleted = 0;
实际执行等价于:
WHERE nomor_formulir LIKE '%mikha%' OR (harga_pelita LIKE '%5%' AND deleted = 0);
这导致:只要 nomor_formulir 匹配 'mikha',即使 deleted = 1,该行仍会被返回——这正是你观察到“已删除数据仍出现”的根本原因。
✅ 正确写法是将 OR 条件整体括起,确保 deleted = 0 作为全局过滤条件:
SELECT * FROM table_tutup_kas LEFT JOIN table_formulir_pelita ON table_formulir_pelita.id_formulir = table_tutup_kas.id_formulir WHERE (nomor_formulir LIKE '%mikha%' OR harga_pelita LIKE '%5%') AND deleted = 0;
? 关键注意事项:
- 始终对多条件 OR 组合使用 () 显式分组,避免依赖默认优先级;
- 若后续还需增加其他条件(如 status = 'active'),同样应置于 AND 后,并确认其作用范围;
- 在复杂查询中,可借助格式化工具或分段缩进提升可读性,便于审查逻辑边界;
- 测试时建议用 SELECT COUNT(*) 或添加 deleted 字段到结果中,快速验证过滤是否生效。
掌握运算符优先级与括号的合理使用,是编写健壮、可维护 SQL 查询的基础能力。











