當精確比對(=)無法滿足「包含某關鍵字」、「以特定前綴開頭」、「符合特定格式」等需求時,LIKE 子句 是最直觀、最常用的模糊匹配工具。它支援兩大通配符,結合 WHERE 即可實現靈活的字串篩選。
| 通配符 | 含義 | 相當於正則 | 範例 |
|---|---|---|---|
% | 匹配任意長度字串(含 0 字符) | .* | '%jay%' 匹配含 "jay" 的所有字串 |
_ | 匹配單一任意字符 | . | '_ay' 匹配 "jay"、"bay"、"day" 等三字元字串 |
注意: 若模式中不含任何通配符,LIKE 行為等同於 =。
SELECT column_list FROM table_name WHERE column_name LIKE pattern [AND|OR column_name2 LIKE pattern2 ...];
SELECT、DELETE、UPDATE 的 WHERE 子句。AND、OR 組合多條件。mysql> SELECT * FROM runoob_tbl WHERE runoob_author LIKE '%jay'; +-------------+----------------+-----------------+-----------------+ | runoob_id | runoob_title | runoob_author | submission_date | +-------------+----------------+-----------------+-----------------+ | 3 | JAVA Tutorial | Sanjay | 2007-05-21 | +-------------+----------------+-----------------+-----------------+
LIKE 'John%' — 以 "John" 開頭LIKE '%SQL%' — 含 "SQL" 關鍵字LIKE '_a%' — 第二個字符為 'a'LIKE '___' — 精確三字符長度LIKE '%\%%' — 含字面字符 "%"(需轉義)若需匹配字面 %、_、\,可自定義轉義字符:
mysql> SELECT * FROM t WHERE col LIKE '%\%%' ESCAPE '\'; -- 找出含 "%" 字符的行
<?php
$keyword = $_GET['q'] ?? '';
$keyword = mysqli_real_escape_string($conn, $keyword);
$pattern = "%{$keyword}%"; // 前後模糊匹配
$sql = "SELECT runoob_id, runoob_title, runoob_author, submission_date
FROM runoob_tbl
WHERE runoob_author LIKE ?";
$stmt = mysqli_prepare($conn, $sql);
mysqli_stmt_bind_param($stmt, 's', $pattern);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
while ($row = mysqli_fetch_assoc($result)) {
echo "ID: {$row['runoob_id']} <br>";
echo "Title: {$row['runoob_title']} <br>";
echo "Author: {$row['runoob_author']} <br><hr>";
}
?>
LIKE '%keyword%' 無法使用索引,大表極慢。LIKE 'keyword%' 可利用 B-Tree 索引範圍掃描。FULLTEXT INDEX + MATCH() AGAINST() 或 Elasticsearch。INDEX (col(10)) 加速前綴匹配。utf8mb4_general_ci:不區分大小寫,LIKE 'ABC' 也匹配 "abc"。COLLATE utf8mb4_bin 或 BINARY 關鍵字:WHERE col LIKE 'ABC' COLLATE utf8mb4_bin善用 LIKE 解決輕量級模糊查詢,遇到高頻、大數據量搜尋需求時果斷升級全文檢索引擎,是架構演進的必經之路。