
SQL 中 AND 的运算优先级高于 OR,若不加括号,可能导致 deleted = 0 条件未按预期生效;本文详解运算符优先级问题、修复方法及编写健壮模糊搜索查询的最佳实践。
sql 中 and 的运算优先级高于 or,若不加括号,可能导致 `deleted = 0` 条件未按预期生效;本文详解运算符优先级问题、修复方法及编写健壮模糊搜索查询的最佳实践。
在编写多条件 WHERE 子句时,逻辑运算符的执行顺序直接影响查询结果的准确性。你遇到的问题——即使添加了 AND deleted = 0,仍返回 deleted = 1 的记录——正是由于 SQL 解析器将原查询:
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 值为何,整行都会被选中。deleted = 0 仅约束在 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;
? 进阶建议:
- 若需支持多个关键词(如同时匹配 'mikha' 或 'andi'),可扩展为:
(nomor_formulir LIKE '%mikha%' OR nomor_formulir LIKE '%andi%' OR harga_pelita LIKE '%5%') AND deleted = 0 - 考虑使用 COALESCE() 防止 NULL 值干扰模糊匹配:
COALESCE(nomor_formulir, '') LIKE '%mikha%' - 在高并发或大数据量场景下,为 nomor_formulir、harga_pelita 和 deleted 字段建立组合索引(如 (deleted, nomor_formulir))可显著提升性能。
⚠️ 注意事项:
- 永远不要依赖运算符默认优先级编写复杂逻辑,显式括号是可读性与正确性的双重保障;
- LIKE '%xxx%' 无法利用前导通配符的索引,如需高性能全文检索,可考虑 MySQL 的 FULLTEXT 索引或专用搜索引擎(如 Elasticsearch);
- LEFT JOIN 后的 WHERE 条件若涉及右表字段(如 table_formulir_pelita.xxx),可能意外将 LEFT JOIN 退化为 INNER JOIN;确保业务语义与连接类型一致。
掌握括号的合理使用,是写出可靠、可维护 SQL 查询的基础一步。











