like '张%' 是最常用且兼容性最好的模糊查询写法,适用于主流数据库;它能走b-tree前缀索引,但 '%张' 或 '%张%' 会导致全表扫描。

用 LIKE 配合 % 通配符是最直接、兼容性最好的方式,不需要正则或函数也能搞定。
WHERE name LIKE '张%' 是最常用写法
这是标准 SQL 写法,适用于 MySQL、PostgreSQL、SQL Server、Oracle 等主流数据库。注意两点:
-
LIKE区分大小写与否取决于数据库和字段 collation(比如 MySQL 默认utf8mb4_general_ci不区分大小写,而utf8mb4_bin区分) -
%必须放在开头字符之后,不能写成'%张'(那是“结尾为张”)或'%张%'(那是“包含张”) - 如果要查以数字开头的,比如电话号以
1开头:WHERE phone LIKE '1%',前提是该字段是字符串类型;若为数值型(如INT),需先转字符串(见下一条)
数值字段要先转成字符串再匹配
像 id 或 price 这类数值类型字段,不能直接用 LIKE。必须显式转换:
- MySQL:
WHERE CAST(id AS CHAR) LIKE '10%' - PostgreSQL:
WHERE id::TEXT LIKE '10%' - SQL Server:
WHERE CAST(id AS VARCHAR) LIKE '10%' - Oracle:
WHERE TO_CHAR(id) LIKE '10%'
不转类型会报错或隐式转换失败——比如 SQL Server 中 WHERE id LIKE '10%' 可能返回空结果,因为 LIKE 对数值类型行为不可靠。
需要更灵活模式?考虑 REGEXP / ~(但慎用)
当不只是“开头”,还要满足“开头是字母且第二位是数字”这类逻辑时,LIKE 就不够用了:
- MySQL:
WHERE name REGEXP '^[A-Za-z][0-9]' - PostgreSQL:
WHERE name ~ '^[A-Za-z][0-9]' - SQLite(需启用扩展):
WHERE name REGEXP '^[A-Z]'
注意:正则性能通常比 LIKE 差,尤其没索引支持时;而且不是所有数据库都原生支持(如标准 SQL 不含 REGEXP),跨库迁移容易出问题。
索引是否生效?关键看写法和字段类型
LIKE '张%' 能走前缀索引(B-tree),但 LIKE '%张' 或 LIKE '%张%' 基本无法利用索引,全表扫描风险高。
- 确保被查询字段有索引,且类型与查询一致(比如
VARCHAR字段别用TEXT类型的条件去比) - 避免在
LIKE左侧用函数,如WHERE UPPER(name) LIKE 'ZHANG%'—— 这会让索引失效 - 如果业务频繁查“以某字符开头”,建议建函数索引(PostgreSQL/Oracle)或生成列索引(MySQL 5.7+)
真正容易被忽略的是字段类型和索引的配合——写对了 LIKE,却因字段是 TEXT 或没索引,导致慢查询拖垮整个接口。










