当前位置: 首页 > news >正文

【实战宝典】MySQL字符串包含查询大全:LIKE、REGEXP、全文索引深度剖析与实战代码

在 MySQL 中查询包含某个字符串的数据是一个非常常见的需求。下面为您详细介绍各种查询方法和技巧。

一、基础字符串查询方法

  1. 使用 ​​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';
  1. 使用 ​​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]';

二、高级查询技巧

  1. 多列同时查询
-- 在标题或内容中搜索
SELECT * FROM articles 
WHERE title LIKE '%mysql%' OR content LIKE '%mysql%';-- 使用 CONCAT 合并多列搜索
SELECT * FROM users 
WHERE CONCAT(first_name, ' ', last_name) LIKE '%john%';
  1. 精确匹配与模糊匹配
-- 精确匹配(完全相等)
SELECT * FROM products WHERE name = 'apple';-- 模糊匹配(包含)
SELECT * FROM products WHERE name LIKE '%apple%';-- 单个字符通配符
SELECT * FROM products WHERE name LIKE 'app_e'; -- 匹配"apple", "appse"等
  1. 大小写敏感查询
-- 默认不区分大小写
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%';

三、性能优化方案

  1. 避免全表扫描的优化
-- 不推荐的写法(无法使用索引)
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);
  1. 创建索引优化查询
-- 为经常搜索的列创建索引
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);

四、实际应用场景

  1. 用户搜索功能
-- 用户姓名搜索
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%';
  1. 日志分析查询
-- 查找包含错误信息的日志
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';
  1. 数据清洗和验证
-- 查找包含特殊字符的数据
SELECT * FROM user_input 
WHERE input_text REGEXP '[<>"&]';-- 查找无效邮箱格式
SELECT * FROM users 
WHERE email NOT LIKE '%@%.%';-- 查找包含HTML标签的内容
SELECT * FROM comments 
WHERE content REGEXP '<[^>]+>';

五、正则表达式高级用法

  1. 常用正则模式
-- 邮箱验证
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';
  1. 复杂模式匹配
-- 查找价格格式
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}$';

六、全文搜索方案

  1. 创建全文索引
-- 创建全文索引
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);
  1. 全文搜索运算符
-- + 必须包含
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);

七、特殊字符处理

  1. 转义特殊字符
-- 查询包含百分号的数据
SELECT * FROM products WHERE name LIKE '%\%%';-- 查询包含下划线的数据
SELECT * FROM products WHERE name LIKE '%\_%';-- 使用 ESCAPE 指定转义字符
SELECT * FROM products WHERE name LIKE '%$%%' ESCAPE '$';
  1. Unicode 和特殊字符查询
-- 查询包含表情符号的数据
SELECT * FROM messages WHERE content LIKE '%😊%';-- 查询包含中文的数据
SELECT * FROM products WHERE name LIKE '%中文%';-- 查询包含换行符的数据
SELECT * FROM documents WHERE content LIKE '%\n%';

八、性能测试和优化

  1. 查询性能分析
-- 查看查询执行计划
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';
  1. 优化建议
-- 使用覆盖索引
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
);

九、实用函数组合

  1. 字符串处理函数
-- 结合 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%';
  1. 条件判断函数
-- 使用 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;

十、最佳实践总结

  1. 查询方法选择指南 | 场景 | 推荐方法 | 示例 | |------|----------|------| | 简单包含查询 | 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%' |
  2. 性能优化 checklist
  • ✅ 为搜索列创建合适的索引
  • ✅ 避免在模式开头使用通配符 ​​%​
  • ✅ 对大文本字段使用全文索引
  • ✅ 使用 ​​EXPLAIN​​ 分析查询计划
  • ✅ 考虑使用搜索引擎(如 Elasticsearch)处理复杂搜索
  1. 安全注意事项
-- 防止SQL注入(在应用程序中处理)
-- 不要直接拼接用户输入
$search = $_POST['search'];
$stmt = $pdo->prepare("SELECT * FROM products WHERE name LIKE ?");
$stmt->execute(["%$search%"]);

通过掌握这些字符串查询技巧,您可以在 MySQL 中高效地完成各种复杂的文本搜索任务。记得根据实际数据量和性能要求选择合适的查询方法。 另外搭配便捷的80kmMYSQL备份工具,可定时备份、异地备份,MYSQL导出导入。可本地连接LINUX里的MYSQL,简单便捷。可以大大地提高工作效率喔。

http://www.dtcms.com/a/491074.html

相关文章:

  • 手机网站推荐哪些学做莱网站
  • 建设网站的价格分析网站构架图
  • 后端八股之mysql
  • 力扣2563. 统计公平数对的数目
  • 在VMware上运行Linux(我选择的是Ubuntu)
  • 【Linux内核】Linux系统启动之旅
  • 正则表达式匹配不到表达式情况?
  • 【数据结构与算法_学习精华】
  • 第18讲:C语言内存函数
  • 外贸网站如何做推广论坛网站 备案
  • 深圳网站建设首选h5case是什么网站
  • Matlab的交通标志定位实现
  • 课堂网站开发企业管理培训班哪个好
  • 记录一个自动学习的脚本开发过程
  • h5游戏免费下载:一起蛙蛙跳
  • chrome中的axure插件提示无法不受支持
  • 石家庄住房城乡建设厅网站著名企业vi设计
  • 深圳做网站的公司排名开个人网站如何赚钱
  • centos 生产环境搭建最佳实践 (一)
  • RocketMQ 实战:马拉松系统异步化与延时任务落地(含死信队列处理)
  • 通达信指标平台
  • 网站建设及推广培训网站备案查询站长工具
  • MATLAB2025B版本新特点
  • Node.js使用Express+SQLite实现登录认证
  • 仿百度百科网站源码设计类专业学校有哪些
  • 重庆建站多少钱一年工业产品设计培训
  • 【IEEE出版 | 早鸟优惠本周截止】人工智能驱动图像处理与计算机视觉技术国际学术研讨会 (AIPCVT 2025)
  • 网站开发案例教程东营网站建设服务商
  • 基于微信小程序的垃圾分类管理系统【2026最新】
  • SSM高校教室申请管理系统yf80k(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。