【实战宝典】MySQL字符串包含查询大全:LIKE、REGEXP、全文索引深度剖析与实战代码
在 MySQL 中查询包含某个字符串的数据是一个非常常见的需求。下面为您详细介绍各种查询方法和技巧。
一、基础字符串查询方法
- 使用
LIKE
操作符(最常用)
-- 查询包含"apple"的记录
SELECT * FROM products WHERE name LIKE '%apple%';-- 查询以"apple"开头的记录
SELECT * FROM products WHERE name LIKE 'apple%';-- 查询以"apple"结尾的记录
SELECT * FROM products WHERE name LIKE '%apple';
- 使用
REGEXP
正则表达式
-- 查询包含"apple"的记录
SELECT * FROM products WHERE name REGEXP 'apple';-- 查询包含"apple"或"orange"的记录
SELECT * FROM products WHERE name REGEXP 'apple|orange';-- 查询包含数字的记录
SELECT * FROM products WHERE name REGEXP '[0-9]';
二、高级查询技巧
- 多列同时查询
-- 在标题或内容中搜索
SELECT * FROM articles
WHERE title LIKE '%mysql%' OR content LIKE '%mysql%';-- 使用 CONCAT 合并多列搜索
SELECT * FROM users
WHERE CONCAT(first_name, ' ', last_name) LIKE '%john%';
- 精确匹配与模糊匹配
-- 精确匹配(完全相等)
SELECT * FROM products WHERE name = 'apple';-- 模糊匹配(包含)
SELECT * FROM products WHERE name LIKE '%apple%';-- 单个字符通配符
SELECT * FROM products WHERE name LIKE 'app_e'; -- 匹配"apple", "appse"等
- 大小写敏感查询
-- 默认不区分大小写
SELECT * FROM products WHERE name LIKE '%apple%';-- 区分大小写查询(使用 BINARY)
SELECT * FROM products WHERE BINARY name LIKE '%Apple%';-- 使用 COLLATE 指定排序规则
SELECT * FROM products
WHERE name COLLATE utf8mb4_bin LIKE '%Apple%';
三、性能优化方案
- 避免全表扫描的优化
-- 不推荐的写法(无法使用索引)
SELECT * FROM products WHERE name LIKE '%apple%';-- 优化的写法(可以使用索引)
SELECT * FROM products WHERE name LIKE 'apple%';-- 使用全文索引(针对大文本字段)
SELECT * FROM articles
WHERE MATCH(title, content) AGAINST('mysql' IN NATURAL LANGUAGE MODE);
- 创建索引优化查询
-- 为经常搜索的列创建索引
CREATE INDEX idx_product_name ON products(name);-- 创建前缀索引
CREATE INDEX idx_product_name_prefix ON products(name(20));-- 创建全文索引
CREATE FULLTEXT INDEX idx_article_content ON articles(title, content);
四、实际应用场景
- 用户搜索功能
-- 用户姓名搜索
SELECT user_id, first_name, last_name, email
FROM users
WHERE first_name LIKE '%john%' OR last_name LIKE '%john%'OR email LIKE '%john%';-- 搜索结果高亮显示(应用层处理)
SELECT title,content,REPLACE(content, 'mysql', '<mark>mysql</mark>') as highlighted_content
FROM articles
WHERE content LIKE '%mysql%';
- 日志分析查询
-- 查找包含错误信息的日志
SELECT * FROM system_logs
WHERE message LIKE '%error%' OR message LIKE '%exception%'OR message LIKE '%failed%';-- 查找特定时间段的日志
SELECT * FROM system_logs
WHERE message LIKE '%login%' AND log_time BETWEEN '2024-01-01' AND '2024-01-31';
- 数据清洗和验证
-- 查找包含特殊字符的数据
SELECT * FROM user_input
WHERE input_text REGEXP '[<>"&]';-- 查找无效邮箱格式
SELECT * FROM users
WHERE email NOT LIKE '%@%.%';-- 查找包含HTML标签的内容
SELECT * FROM comments
WHERE content REGEXP '<[^>]+>';
五、正则表达式高级用法
- 常用正则模式
-- 邮箱验证
SELECT * FROM users WHERE email REGEXP '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$';-- 手机号验证(简单版)
SELECT * FROM users WHERE phone REGEXP '^1[3-9][0-9]{9}$';-- URL验证
SELECT * FROM links WHERE url REGEXP '^https?://[^\s/$.?#].[^\s]*$';-- 查找重复单词
SELECT * FROM documents WHERE content REGEXP '\\b(\\w+)\\s+\\1\\b';
- 复杂模式匹配
-- 查找价格格式
SELECT * FROM products
WHERE price_text REGEXP '^\\$?[0-9]+(\\.[0-9]{2})?$';-- 查找版本号
SELECT * FROM software
WHERE version REGEXP '^[0-9]+\\.[0-9]+\\.[0-9]+$';-- 查找IP地址
SELECT * FROM access_logs
WHERE ip_address REGEXP '^[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}$';
六、全文搜索方案
- 创建全文索引
-- 创建全文索引
ALTER TABLE articles ADD FULLTEXT(title, content);-- 使用自然语言模式搜索
SELECT * FROM articles
WHERE MATCH(title, content) AGAINST('mysql database' IN NATURAL LANGUAGE MODE);-- 使用布尔模式搜索(更强大)
SELECT * FROM articles
WHERE MATCH(title, content) AGAINST('+mysql -oracle' IN BOOLEAN MODE);
- 全文搜索运算符
-- + 必须包含
WHERE MATCH(content) AGAINST('+mysql +performance' IN BOOLEAN MODE);-- - 排除
WHERE MATCH(content) AGAINST('mysql -oracle' IN BOOLEAN MODE);-- * 通配符
WHERE MATCH(content) AGAINST('data*' IN BOOLEAN MODE);-- " " 短语搜索
WHERE MATCH(content) AGAINST('"mysql database"' IN BOOLEAN MODE);
七、特殊字符处理
- 转义特殊字符
-- 查询包含百分号的数据
SELECT * FROM products WHERE name LIKE '%\%%';-- 查询包含下划线的数据
SELECT * FROM products WHERE name LIKE '%\_%';-- 使用 ESCAPE 指定转义字符
SELECT * FROM products WHERE name LIKE '%$%%' ESCAPE '$';
- Unicode 和特殊字符查询
-- 查询包含表情符号的数据
SELECT * FROM messages WHERE content LIKE '%😊%';-- 查询包含中文的数据
SELECT * FROM products WHERE name LIKE '%中文%';-- 查询包含换行符的数据
SELECT * FROM documents WHERE content LIKE '%\n%';
八、性能测试和优化
- 查询性能分析
-- 查看查询执行计划
EXPLAIN SELECT * FROM products WHERE name LIKE '%apple%';-- 测试不同查询方式的性能
SELECT SQL_NO_CACHE * FROM products WHERE name LIKE '%apple%';
SELECT SQL_NO_CACHE * FROM products WHERE name REGEXP 'apple';
- 优化建议
-- 使用覆盖索引
CREATE INDEX idx_covering ON products(name, id, price);-- 分页查询优化
SELECT * FROM products
WHERE name LIKE '%apple%'
ORDER BY id
LIMIT 20 OFFSET 0;-- 使用子查询优化
SELECT * FROM products
WHERE id IN (SELECT id FROM products WHERE name LIKE '%apple%' LIMIT 1000
);
九、实用函数组合
- 字符串处理函数
-- 结合 LENGTH 函数
SELECT * FROM products
WHERE name LIKE '%apple%'
AND LENGTH(name) BETWEEN 10 AND 100;-- 结合 SUBSTRING 函数
SELECT * FROM products
WHERE SUBSTRING(name, 1, 5) = 'apple';-- 结合 REPLACE 函数
SELECT name,REPLACE(name, 'apple', 'APPLE') as replaced_name
FROM products
WHERE name LIKE '%apple%';
- 条件判断函数
-- 使用 CASE 语句
SELECT name,CASE WHEN name LIKE '%apple%' THEN '包含apple'WHEN name LIKE '%orange%' THEN '包含orange'ELSE '其他'END as category
FROM products;-- 使用 IF 函数
SELECT name,IF(name LIKE '%apple%', '是', '否') as contains_apple
FROM products;
十、最佳实践总结
- 查询方法选择指南 | 场景 | 推荐方法 | 示例 | |------|----------|------| | 简单包含查询 |
LIKE '%keyword%'
|WHERE name LIKE '%apple%'
| | 前缀查询 |LIKE 'keyword%'
|WHERE name LIKE 'apple%'
| | 复杂模式匹配 |REGEXP
|WHERE name REGEXP '^[A-Z]'
| | 全文搜索 |MATCH AGAINST
|WHERE MATCH(content) AGAINST('mysql')
| | 性能敏感 |LIKE 'keyword%'
+ 索引 |WHERE name LIKE 'apple%'
| - 性能优化 checklist
- ✅ 为搜索列创建合适的索引
- ✅ 避免在模式开头使用通配符
%
- ✅ 对大文本字段使用全文索引
- ✅ 使用
EXPLAIN
分析查询计划 - ✅ 考虑使用搜索引擎(如 Elasticsearch)处理复杂搜索
- 安全注意事项
-- 防止SQL注入(在应用程序中处理)
-- 不要直接拼接用户输入
$search = $_POST['search'];
$stmt = $pdo->prepare("SELECT * FROM products WHERE name LIKE ?");
$stmt->execute(["%$search%"]);
通过掌握这些字符串查询技巧,您可以在 MySQL 中高效地完成各种复杂的文本搜索任务。记得根据实际数据量和性能要求选择合适的查询方法。 另外搭配便捷的80kmMYSQL备份工具,可定时备份、异地备份,MYSQL导出导入。可本地连接LINUX里的MYSQL,简单便捷。可以大大地提高工作效率喔。