以下是 模糊查询 的深度技术解析,涵盖核心语法、通配符策略、性能优化及实战陷阱:
🔍 一、核心运算符:LIKE
SELECT * FROM 表名
WHERE 列名 LIKE '模式字符串' ;
🎯 二、通配符详解
通配符 作用 示例 匹配案例 %
任意长度字符 (含0字符)'张%'
张三、张无忌、张 _
单个字符 '李_'
李四、李雷(不匹配"李") [ ]
字符集合内单字符 (仅SQL Server) '[王李]%'
王五、李四 [^ ]
排除字符集合 (仅SQL Server) '[^0-9]%'
中文、字母(排除数字开头)
📌 通用标准(MySQL/PgSQL/Oracle):
WHERE company LIKE '%公司'
WHERE name LIKE '_小%'
WHERE file_name LIKE '%\_%' ESCAPE '\'
⚠️ 三、关键注意事项
1. 大小写敏感性问题
数据库 默认行为 强制不敏感方案 MySQL 取决于校对规则 WHERE LOWER(name) LIKE '%abc%'
PostgreSQL 区分大小写 用 ILIKE
运算符 Oracle 区分大小写 WHERE UPPER(name) LIKE '%ABC%'
2. 通配符转义(通用方案)
SELECT * FROM products
WHERE notes LIKE '%20\%%' ESCAPE '\'; -- 定义' \'为转义符
WHERE file_name LIKE '%\_%' ESCAPE '\';
3. NULL 值处理
SELECT * FROM users
WHERE name LIKE '%张%' ;
⚡ 四、性能优化策略
1. 避免全模糊(%xxx%
)
WHERE content LIKE '%数据库%'
WHERE content LIKE '数据库%'
ALTER TABLE articles ADD FULLTEXT INDEX ( content) ;
SELECT * FROM articles
WHERE MATCH ( content) AGAINST( '数据库' IN BOOLEAN MODE ) ;
2. 慎用函数包裹列
WHERE LOWER( name) LIKE '%abc%'
ALTER TABLE users ADD COLUMN name_lower VARCHAR ( 50 ) ;
UPDATE users SET name_lower = LOWER( name) ;
CREATE INDEX idx_name_lower ON users( name_lower) ;
WHERE name_lower LIKE '%abc%' ;
3. 使用覆盖索引
SELECT name, id FROM users
WHERE name LIKE '张%' ;
🔧 五、进阶技巧
1. 正则表达式增强(REGEXP)
WHERE name REGEXP '^张[小大]'
WHERE REGEXP_LIKE( name, '^张[小大]' )
2. 通配符组合妙用
WHERE phone LIKE '13_%'
WHERE phone REGEXP '^13[0-9]{9}$'
WHERE email LIKE '%@%.%'
3. 动态模式生成
SET @search_term = '数据' ;
SELECT * FROM books
WHERE title LIKE CONCAT( '%' , @search_term , '%' ) ;
🧩 六、实战陷阱案例
陷阱1:中文字符截断错误
✅ 解决方案:使用 ` CHAR_LENGTH()` 辅助
WHERE name LIKE '李_' AND CHAR_LENGTH( name) = 2
陷阱2:通配符冲突
✅ 方案:预处理输入值
SET @input = REPLACE ( @raw_input , '%' , '\%' ) ;
WHERE content LIKE CONCAT( '%' , @input , '%' ) ESCAPE '\';
陷阱3:隐式空格问题
CREATE TABLE test ( col VARCHAR ( 10 ) ) ;
INSERT INTO test VALUES ( 'abc' ) , ( 'abc ' ) ; SELECT * FROM test WHERE col LIKE 'abc' ;
SELECT * FROM test WHERE col LIKE 'abc%' ;
📊 七、模糊查询类型性能对比
查询类型 示例 索引利用 适用场景 前缀匹配 LIKE '张%'
✅ 可利用B树索引 快速人名/编号检索 后缀匹配 LIKE '%公司'
❌ 全表扫描 低频分析 全模糊 LIKE '%数据%'
❌ 全表扫描 小表或全文索引替代方案 固定位置 LIKE '__小%'
❌ 全表扫描 严格格式数据(如身份证)
💡 终极建议
数据清洗 :入库前规范化(统一大小写/去除特殊字符)索引策略 :对高频前缀查询列建索引替代方案 :
小
大
模糊查询
数据量
LIKE
全文搜索引擎
Elasticsearch
PgSQL全文索引
安全防护 :过滤用户输入的通配符(防止恶意超长%
拖垮数据库)