在 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 '$';
-- 查询包含表情符号的数据
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%'
|%
EXPLAIN
分析查询计划
-- 防止SQL住入(在应用程序中处理)
-- 不要直接拼接用户输入
$search = $_POST['search'];
$stmt = $pdo->prepare("SELECT * FROM products WHERE name LIKE ?");
$stmt->execute(["%$search%"]);
通过掌握这些字符串查询技巧,您可以在 MySQL 中高效地完成各种复杂的文本搜索任务。记得根据实际数据量和性能要求选择合适的查询方法。 另外搭配便捷的80kmMYSQL备份工具,可定时备份、异地备份,MYSQL导出导入。可本地连接LINUX里的MYSQL,简单便捷。可以大大地提高工作效率喔。