2021-07-09 06:02:59
在SQL中,可通过AND或OR运算符组合多个LIKE条件实现多条件模糊查询,同时需注意性能优化。 以下是具体技巧与注意事项:
一、基础语法与示例AND组合条件用于筛选同时满足多个模糊匹配的记录。示例:查询名字包含John且姓氏包含Doe的用户
SELECT * FROM users WHERE first_name LIKE '%John%' AND last_name LIKE '%Doe%';OR组合条件用于筛选满足任一模糊匹配的记录。示例:查询名字包含John或Jane的用户
SELECT * FROM users WHERE first_name LIKE '%John%' OR first_name LIKE '%Jane%';混合AND与OR通过括号明确优先级,实现复杂逻辑。示例:查询名字包含John或Jane,且姓氏包含Doe或Smith的用户
SELECT * FROM users WHERE (first_name LIKE '%John%' OR first_name LIKE '%Jane%') AND (last_name LIKE '%Doe%' OR last_name LIKE '%Smith%');索引优化
普通索引:在LIKE字段上创建索引可加速查询,但需注意通配符位置。
❌ 低效:LIKE '%John%'(无法利用索引前缀)
✅ 高效:LIKE 'John%'(可利用索引前缀)
覆盖索引:若查询仅涉及索引列,可避免回表操作。
全文索引(FULLTEXT)
适用于大规模文本搜索(如文章内容、评论等)。
示例(MySQL):CREATE FULLTEXT INDEX idx_name ON users(first_name, last_name);SELECT * FROM users WHERE MATCH(first_name, last_name) AGAINST('John Doe' IN NATURAL LANGUAGE MODE);
分解查询
将复杂查询拆分为多个简单查询,在应用层合并结果。
适用场景:数据量大且LIKE条件无法优化时。
示例:-- 查询1:名字包含JohnSELECT * FROM users WHERE first_name LIKE '%John%';-- 查询2:名字包含JaneSELECT * FROM users WHERE first_name LIKE '%Jane%';在应用层合并结果并去重。
避免过度使用LIKE
优先使用精确匹配(=)或范围查询(BETWEEN、>、<)。
若需模糊匹配,尽量将通配符放在字符串末尾(如'John%')。
场景:在数百万条用户记录中,查询名字包含John或Jane,且注册时间在2020年后的用户。优化步骤:
创建复合索引:
CREATE INDEX idx_name_date ON users(first_name, registration_date);优化查询语句:
SELECT * FROM users WHERE (first_name LIKE 'John%' OR first_name LIKE 'Jane%') AND registration_date >= '2020-01-01';将通配符移至开头后,索引可被部分利用。
添加时间范围条件进一步缩小扫描范围。
测试与调整:
使用EXPLAIN分析查询执行计划,确认索引使用情况。
若性能仍不足,可考虑分解查询或引入全文索引。
通过掌握多条件LIKE查询的语法与优化技巧,可高效处理复杂搜索需求,同时平衡性能与灵活性。