mysql多条件筛选需合理组合where子句与and/or/not,配合联合索引、正确数据类型及NULL安全处理;动态sql须用预处理防注入。

多条件筛选在 MySQL 后台查询中,核心是合理组合 WHERE 子句与逻辑运算符(AND、OR、NOT),配合恰当的索引和数据类型设计,才能兼顾准确性和查询效率。
基础写法:用 AND 连接多个等值条件
最常见场景是用户按多个字段精确筛选,比如查“北京地区、状态为启用、创建时间在2024年之后的订单”:
- SQL 示例:
SELECT * FROM orders WHERE city = ‘北京’ AND status = 1 AND created_at > ‘2024-01-01’; - 注意:所有条件默认是“且”关系;字符串需加单引号,数字和日期按类型正确书写
- 建议为常用组合字段建立联合索引,如 INDEX idx_city_status_time (city, status, created_at),顺序按区分度从高到低排列
处理范围与模糊匹配:BETWEEN、LIKE 和 IN 的配合
实际业务常混用精确、范围、枚举和模糊条件。例如筛选“价格在100–500之间、分类属于电子或家电、商品名含‘无线’的上架商品”:
- SQL 示例:
select * FROM products WHERE price BETWEEN 100 AND 500 AND category_id IN (3, 5) AND name LIKE ‘%无线%’ AND is_online = 1; - LIKE 带前导 %(如 ‘%无线’)无法使用索引,尽量用后缀匹配(’无线%’)或全文索引替代
- IN 列表不宜过长(一般不超过 500 项),否则可考虑临时表或 JOIN 优化
空值与逻辑优先级:小心 NULL 和括号嵌套
NULL 在 MySQL 中不参与常规比较(col = NULL 永远为 false),且 AND/OR 有默认优先级(AND 高于 OR),易出错:
- 判断空值必须用 IS NULL 或 IS NOT NULL,不能用
= NULL - 混合 AND/OR 时务必加括号明确逻辑,例如:
WHERE (type = ‘A’ OR type = ‘B’) AND deleted = 0
而不是 WHERE type = ‘A’ OR type = ‘B’ AND deleted = 0(后者等价于 type=’A’ OR (type=’B’ AND deleted=0)) - 对可能为 NULL 的字段做条件时,可结合 ifNULL 或 COALESCE 统一处理,例如:
WHERE IFNULL(score, 0) >= 60
动态条件:后端拼接 SQL 的安全实践
Web 后台常根据用户勾选生成动态 SQL,需防止 SQL 注入并保持可读性: