Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> 電腦軟體教學 >> 電腦軟體介紹

SQL LIKE 查詢完全指南:萬用字元、字元集合、範圍匹配與實戰陷阱

編輯:電腦軟體介紹

LIKE 是 SQL 模糊查詢的核心,掌握萬用字元、字元集合、範圍匹配與轉義規則,能寫出精準且高效的查詢。本文系統整理 %、_、[]、[^] 四大核心模式,對比 */? 非標準寫法,並提供 5 大實戰範例與效能優化建議。

四大標準萬用字元模式(ANSI SQL 相容)

符號名稱匹配規則範例匹配結果範例
%百分號任意長度(含 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/JetT-SQL 支援但非標準

關鍵陷阱:* vs % 實測對比

-- 錯誤寫法(Access 習慣)
SELECT * FROM table1 WHERE name LIKE '*明*'  -- 結果:返回全表所有行!

-- 正確寫法(ANSI SQL)
SELECT * FROM table1 WHERE name LIKE '%明%'  -- 結果:僅返回含「明」的行

原因:T-SQL 中 * 是字面字元「星號」,不具萬用字元語義。永遠使用 % 替代 *,_ 替代 ?。

5 大實戰查詢範例

  1. 包含特定字:SELECT * FROM users WHERE name LIKE '%明%'
  2. 特定開頭:SELECT * FROM users WHERE name LIKE '李%'
  3. 含數字:SELECT * FROM users WHERE name LIKE '%[0-9]%'
  4. 含小寫字母:SELECT * FROM users WHERE name LIKE '%[a-z]%'
  5. 不含數字:SELECT * FROM users WHERE name LIKE '%[^0-9]%' (注意:此寫法僅匹配「至少一個非數字字元」,若需「完全無數字」請用 NOT LIKE '%[0-9]%')

效能優化鐵律

  1. 避免前置萬用字元:LIKE '%關鍵字' 無法使用索引 → 全表掃描。若頻繁查詢,考慮全文檢索或反向索引技巧。
  2. 善用計算欄位/持久化欄位:如常查 email LIKE '%@gmail.com',可加持久化欄位 domain AS RIGHT(email, CHARINDEX('@', REVERSE(email))-1) PERSISTED 建索引。
  3. 大小寫敏感度:取決於 Collation(如 Chinese_PRC_CI_AS 不敏感,_CS_ 敏感)。需區分大小寫請指定 COLLATE Latin1_General_CS_AS。
  4. 轉義特殊字元:查詢實際含 %、_、[ 的字串,需定義轉義字元:WHERE code LIKE '%/%%' ESCAPE '/'(查詢含 % 的代碼)。
  5. LIKE 不使用索引的情況:前置 %、函數包裝欄位、隱含轉換、OR 連接多個 LIKE。

跨資料庫平台差異速查

平台萬用字元單一字元字元集合排除集合轉義語法
SQL Server (T-SQL)%_[][^]ESCAPE '\'
MySQL%_不支援不支援ESCAPE '\'
PostgreSQL%_不支援(用 SIMILAR TO/正則)不支援ESCAPE '\'
Oracle%_不支援(用正則)不支援ESCAPE '\'
Access/Jet*?[][!]不支援

結論:跨平台專案請堅持 ANSI SQL 標準(%/_),複雜模式改用各平台原生正則函數(REGEXP/~/REGEXP_LIKE)。

Copyright © Windows教程網 All Rights Reserved