
在 SQL 查询中,AND 的优先级高于 OR,若未用括号明确分组,可能导致 deleted = 0 条件未被整体生效,从而返回已删除(deleted = 1)的记录。解决方法是用圆括号显式限定 OR 条件的范围。
在 sql 查询中,and 的优先级高于 or,若未用括号明确分组,可能导致 `deleted = 0` 条件未被整体生效,从而返回已删除(`deleted = 1`)的记录。解决方法是用圆括号显式限定 or 条件的范围。
当你编写类似 WHERE A LIKE '%x%' OR B LIKE '%y%' AND deleted = 0 的查询时,SQL 实际按 WHERE A LIKE '%x%' OR (B LIKE '%y%' AND deleted = 0) 执行——即只要 A 匹配,无论 deleted 值如何,该行都会被返回。这正是你观察到“仍显示 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 组合使用 (),提升可读性与可靠性;
- 考虑性能优化:LIKE '%…%' 无法有效利用索引,如搜索频率高,可评估全文索引或添加计算列+索引;
- 避免隐式类型转换:harga_pelita LIKE '%5%' 若该字段为数值型,应改用 CAST(harga_pelita AS CHAR) LIKE '%5%' 或更精准的数值比较(如 harga_pelita = 5),以提升准确性和性能;
- 验证 JOIN 结果:LEFT JOIN 可能引入 NULL 值,若 deleted 存在于右表(table_formulir_pelita),需确认其所在表并适当调整过滤位置(例如 AND table_formulir_pelita.deleted = 0)。
牢记:SQL 运算符优先级不是“从左到右”,而是 NOT > AND > OR。养成用括号表达业务意图的习惯,是写出健壮、可维护 SQL 的关键一步。











