LIKE 是 SQL 模糊查詢的核心,掌握萬用字元、字元集合、範圍匹配與轉義規則,能寫出精準且高效的查詢。本文系統整理 %、_、[]、[^] 四大核心模式,對比 */? 非標準寫法,並提供 5 大實戰範例與效能優化建議。
| 符號 | 名稱 | 匹配規則 | 範例 | 匹配結果範例 |
|---|---|---|---|---|
% | 百分號 | 任意長度(含 0)字串 | LIKE 'Mc%' | McBadden, McDonald, Mc |
LIKE '%inger' | Ringer, Stringer, Ginger | |||
LIKE '%en%' | Bennet, Green, McBadden | |||
_ | 底線 | 單一任意字元 | LIKE '_heryl' | Cheryl, Sheryl(固定 6 字元) |
[] | 字元集合 | 括號內任一字元 | LIKE '[CK]ars[eo]n' | Carsen, Karsen, Carson, Karson |
LIKE '[M-Z]inger' | Ringer, Singer, Tinger...(M-Z 開頭) | |||
[^] | 排除集合 | 非括號內字元 | LIKE 'M[^c]%' | MacFeather, Miller(第二字元非 c) |
| 符號 | 對應標準 | 來源 | 風險 |
|---|---|---|---|
* | % | DOS/Access/Jet SQL | 在 T-SQL 中 '*明*' 會匹配所有列,非預期行為 |
? | _ | DOS/Access | 同左 |
# | [0-9] | Access/VBA | 僅匹配單一數字 |
[!] | [^] | Access/Jet | T-SQL 支援但非標準 |
* vs % 實測對比-- 錯誤寫法(Access 習慣)
SELECT * FROM table1 WHERE name LIKE '*明*' -- 結果:返回全表所有行!
-- 正確寫法(ANSI SQL)
SELECT * FROM table1 WHERE name LIKE '%明%' -- 結果:僅返回含「明」的行
原因:T-SQL 中 * 是字面字元「星號」,不具萬用字元語義。永遠使用 % 替代 *,_ 替代 ?。
SELECT * FROM users WHERE name LIKE '%明%'SELECT * FROM users WHERE name LIKE '李%'SELECT * FROM users WHERE name LIKE '%[0-9]%'SELECT * FROM users WHERE name LIKE '%[a-z]%'SELECT * FROM users WHERE name LIKE '%[^0-9]%' (注意:此寫法僅匹配「至少一個非數字字元」,若需「完全無數字」請用 NOT LIKE '%[0-9]%')LIKE '%關鍵字' 無法使用索引 → 全表掃描。若頻繁查詢,考慮全文檢索或反向索引技巧。email LIKE '%@gmail.com',可加持久化欄位 domain AS RIGHT(email, CHARINDEX('@', REVERSE(email))-1) PERSISTED 建索引。Chinese_PRC_CI_AS 不敏感,_CS_ 敏感)。需區分大小寫請指定 COLLATE Latin1_General_CS_AS。%、_、[ 的字串,需定義轉義字元:WHERE code LIKE '%/%%' ESCAPE '/'(查詢含 % 的代碼)。LIKE 不使用索引的情況:前置 %、函數包裝欄位、隱含轉換、OR 連接多個 LIKE。| 平台 | 萬用字元 | 單一字元 | 字元集合 | 排除集合 | 轉義語法 |
|---|---|---|---|---|---|
| SQL Server (T-SQL) | % | _ | [] | [^] | ESCAPE '\' |
| MySQL | % | _ | 不支援 | 不支援 | ESCAPE '\' |
| PostgreSQL | % | _ | 不支援(用 SIMILAR TO/正則) | 不支援 | ESCAPE '\' |
| Oracle | % | _ | 不支援(用正則) | 不支援 | ESCAPE '\' |
| Access/Jet | * | ? | [] | [!] | 不支援 |
結論:跨平台專案請堅持 ANSI SQL 標準(%/_),複雜模式改用各平台原生正則函數(REGEXP/~/REGEXP_LIKE)。