首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

SQL 模糊查詢完全指南:LIKE 謓詞、四大萬用字元、逸出處理與 Access/SQL Server 差異

     編輯:MySQL 資料庫相關知識

模糊查詢是資料庫搜尋的基石。本文系統整理 LIKE 謓詞語法、四大萬用字元(%、_、[]、[^])、特殊字元逸出、跨資料庫差異與實戰範例,涵蓋 SQL Server、MySQL、Access。

基本語法

SELECT column FROM table WHERE column LIKE pattern;

四大萬用字元詳解

符號名稱匹配規則範例匹配結果
%百分號任意 0 個或多個字元LIKE '%三%'張三、張貓三、三腳貓、唐三藏
_底線任意單一字元LIKE '_三_'唐三藏(三字、中間為三)
[]字元集合括號內任一字元(支援範圍 a-f、0-9)LIKE '[張李王]三'張三、李三、王三
[^]排除字元集合非括號內任一字元LIKE '[^張李王]三'趙三、孫三(非張/李/王)

進階組合範例

-- 1. 以 Mc 開頭
LIKE 'Mc%'

-- 2. 以 inger 結尾
LIKE '%inger'

-- 3. 任意位置包含 en
LIKE '%en%'

-- 4. 六字元、以 heryl 結尾
LIKE '_heryl'

-- 5. 正則風格:C/K 開頭、ars、e/o 結尾
LIKE '[CK]ars[eo]n'  -- Carsen, Karsen, Carson, Karson

-- 6. M-Z 開頭、inger 結尾
LIKE '[M-Z]inger'

-- 7. M 開頭、第二字元非 c
LIKE 'M[^c]%'

特殊字元逸出:查詢內容含萬用字元時

若搜尋關鍵字本身包含 %、_、[,需將其視為字面字元。標準 SQL 使用 ESCAPE 子句:

-- 搜尋含 "100%" 的字串
SELECT * FROM products WHERE description LIKE '%100\%%' ESCAPE '\';

-- 搜尋含 "_" 的字串
SELECT * FROM products WHERE code LIKE '%\_%' ESCAPE '\';

通用逸出函數(VBScript/ASP 範例)

Function SQLEncode(str)
    str = Replace(str, "[", "[[]")     ' 必須最先處理 [
    str = Replace(str, "_", "[_]")
    str = Replace(str, "%", "[%]")
    SQLEncode = str
End Function

MySQL/PostgreSQL 亦支援 ESCAPE;Access 不支援 ESCAPE,需用 [] 包裹:LIKE '%[%]%'。

Access vs SQL Server / MySQL 差異

項目Access (ACE/Jet)SQL Server / MySQL
萬用字元* (多字元)、? (單字元)%、_
字元集合不支援 []支援 []、[^]
逸出機制無 ESCAPE,用 [] 包裹支援 ESCAPE '\'
程式碼中寫法ADO/OLEDB 驅動程式會自動轉換 *→%、?→_直接用 %、_

重要: 在應用程式中(PHP、Java、C#、Python)統一使用 ANSI SQL 萬用字元(%、_),驅動程式會根據目標資料庫轉換;僅在 Access 原生查詢視窗測試時才用 */?。

實戰範例:郵遞區號多欄位模糊搜尋

SELECT * FROM zipcode
WHERE address LIKE '%' + @keyword + '%'
   OR city LIKE '%' + @keyword + '%'
   OR province LIKE '%' + @keyword + '%'
ORDER BY province, city, address;

預存程序動態模糊查詢

CREATE PROCEDURE SearchQuestions
    @Keyword NVARCHAR(100),
    @IsFinish BIT
AS
BEGIN
    SELECT * FROM Questions
    WHERE QTitle LIKE '%' + @Keyword + '%'  -- 參數化防注入
      AND IsFinish = @IsFinish;
END

效能提示

  • LIKE 'keyword%'(前綴匹配)可使用索引(SARGable)。
  • LIKE '%keyword' 或 LIKE '%keyword%' 導致全表掃描,大表效能差。
  • 全文搜尋需求:MySQL FULLTEXT INDEX、SQL Server FULLTEXT CATALOG、PostgreSQL tsvector、Elasticsearch/OpenSearch。
  • 避免在 WHERE 中對欄位使用函數(LOWER(col) LIKE ...),改用 COLLATE 不分大小寫校對。

MySQL 專屬:REGEXP 正則表達式

SELECT * FROM user WHERE name REGEXP '^[A-Z][a-z]+$'; -- 正則匹配
-- MySQL 8.0 支援 REGEXP_REPLACE、REGEXP_SUBSTR、REGEXP_INSTR

掌握 LIKE 萬用字元與逸出規則,能精準實作關鍵字搜尋,並避免跨資料庫移植時的語法陷阱。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved