LIKE 是 MySQL 模糊比對的核心操作符。本文整理單一條件、多條件組合、CONCAT 動態模式、通配符規則與索引優化關鍵點。
| 符號 | 含義 | 範例匹配 |
|---|---|---|
% | 任意長度字元(含 0 字元) | '%三%' → 「張三」、「三腳貓」、「唐三藏」 |
_ | 單一任意字元 | '_三_' → 「唐三藏」(三字、中間是三) |
注意:中文字元在 utf8mb4 下佔 1 個字元,_ 可匹配單一中文字。
-- 包含 "abc"
SELECT * FROM `products` WHERE `name` LIKE '%abc%';
-- 以 "abc" 開頭
SELECT * FROM `products` WHERE `name` LIKE 'abc%';
-- 以 "abc" 結尾
SELECT * FROM `products` WHERE `name` LIKE '%abc';
-- 同時包含 "三" 和 "貓"
SELECT * FROM `user` WHERE `name` LIKE '%三%' AND `name` LIKE '%貓%';
-- 包含 "三" 或 "貓"
SELECT * FROM `user` WHERE `name` LIKE '%三%' OR `name` LIKE '%貓%';
-- 需求:name 包含 'Robert' 或 'Bob' 或 'Smith'
SELECT * FROM `customers`
WHERE 'Robert Bob Smith III, PhD.' LIKE CONCAT('%', `name`, '%');
-- 反向思維:用常字串匹配欄位值
-- 查詢實際包含 "%" 字元的資料
SELECT * FROM `t` WHERE `col` LIKE '%\%%' ESCAPE '\\';
-- 查詢實際包含 "_" 字元
SELECT * FROM `t` WHERE `col` LIKE '%\_%' ESCAPE '\\';
LIKE 'abc%'(前綴固定)可使用 B-Tree 索引LIKE '%abc%'(前導萬用字元)無法使用索引,全表掃描MATCH ... AGAINST)或外部搜尋引擎ALTER TABLE t ADD INDEX idx_name_prefix (name(10));-- 錯誤:CONCAT 後有空格會導致語法錯誤
SELECT * FROM t WHERE col LIKE CONCAT('%', 'abc' , '%'); -- 正確
SELECT * FROM t WHERE col LIKE CONCAT ('%', 'abc' , '%'); -- 錯誤(函數名與括號間有空格)
ESCAPE
理解 LIKE 的運作機制,能在功能需求與查詢效能間取得平衡。