在本教學中,您將了解如何使用MySQL LIKE
運算子根據模式查詢選擇資料。
LIKE
操作符通常用於基於模式查詢選擇資料。以正確的方式使用LIKE
運算子對於增加/減少查詢效能至關重要。
LIKE
操作符允許您根據指定的模式從表中查詢選擇資料。 因此,LIKE
運算子通常用在SELECT語句的WHERE子句中。
MySQL提供兩個萬用字元,用於與LIKE
運算子一起使用,它們分別是:百分比符號 - %
和下劃線 - _
。
%
)萬用字元允許匹配任何字串的零個或多個字元。_
)萬用字元允許匹配任何單個字元。下面讓我們來學習一些使用LIKE
操作符的例子。請參閱以下employees
表。
mysql> desc employees;
+----------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+-------+
| employeeNumber | int(11) | NO | PRI | NULL | |
| lastName | varchar(50) | NO | | NULL | |
| firstName | varchar(50) | NO | | NULL | |
| extension | varchar(10) | NO | | NULL | |
| email | varchar(100) | NO | | NULL | |
| officeCode | varchar(10) | NO | MUL | NULL | |
| reportsTo | int(11) | YES | MUL | NULL | |
| jobTitle | varchar(50) | NO | | NULL | |
+----------------+--------------+------+-----+---------+-------+
8 rows in set
1. MySQL LIKE使用百分比(%)萬用字元
假設要搜尋名字以字元a
開頭的員工資訊,可以在模式末尾使用百分比萬用字元(%
),如下所示:
SELECT
employeeNumber, lastName, firstName
FROM
employees
WHERE
firstName LIKE 'a%';
執行上面查詢,得到以下結果 -
mysql> SELECT
employeeNumber, lastName, firstName
FROM
employees
WHERE
firstName LIKE 'a%';
+----------------+----------+-----------+
| employeeNumber | lastName | firstName |
+----------------+----------+-----------+
| 1143 | Bow | Anthony |
| 1611 | Fixter | Andy |
+----------------+----------+-----------+
2 rows in set
MySQL將掃描整個employees
表以找到每個其名字以字元a
開頭,後跟任意數量的字元的員工資訊。
要搜尋員工以on
字元結尾的姓氏,例如,Patterson
,Thompson
,可以使用模式開頭的%
萬用字元,如下查詢:
SELECT
employeeNumber, lastName, firstName
FROM
employees
WHERE
lastName LIKE '%on';
執行上面查詢,得到以下結果 -
mysql> SELECT
employeeNumber, lastName, firstName
FROM
employees
WHERE
lastName LIKE '%on';
+----------------+-----------+-----------+
| employeeNumber | lastName | firstName |
+----------------+-----------+-----------+
| 1056 | Patterson | Mary |
| 1088 | Patterson | William |
| 1166 | Thompson | Leslie |
| 1216 | Patterson | Steve |
+----------------+-----------+-----------+
4 rows in set
如果知道要搜尋包含指定字串,則可以在模式的開頭和結尾使用百分比(%
)萬用字元。
例如,要查詢 lastname
欄位值中包含on
字串的所有員工,可使用帶有%on%
條件,如下所示 -
SELECT
employeeNumber, lastName, firstName
FROM
employees
WHERE
lastname LIKE '%on%';
執行上面查詢,得到以下結果 -
mysql> SELECT
employeeNumber, lastName, firstName
FROM
employees
WHERE
lastname LIKE '%on%';
+----------------+-----------+-----------+
| employeeNumber | lastName | firstName |
+----------------+-----------+-----------+
| 1056 | Patterson | Mary |
| 1088 | Patterson | William |
| 1102 | Bondur | Gerard |
| 1166 | Thompson | Leslie |
| 1216 | Patterson | Steve |
| 1337 | Bondur | Loui |
| 1504 | Jones | Barry |
+----------------+-----------+-----------+
7 rows in set
2. MySQL LIKE帶下劃線(_)萬用字元
要查詢名字以T
開頭的員工,以m
結尾,並且包含例如Tom
,Tim
之間的任何單個字元,可以使用下劃線萬用字元來構建模式,如下所示:
SELECT
employeeNumber, lastName, firstName
FROM
employees
WHERE
firstname LIKE 'T_m';
執行上面查詢,得到以下結果 -
mysql> SELECT
employeeNumber, lastName, firstName
FROM
employees
WHERE
firstname LIKE 'T_m';
+----------------+----------+-----------+
| employeeNumber | lastName | firstName |
+----------------+----------+-----------+
| 1619 | King | Tom |
+----------------+----------+-----------+
1 row in set
3. 具有NOT運算子的MySQL LIKE運算子
MySQL允許將NOT
運算子與LIKE
運算子組合,以找到不匹配特定模式的字串。
假設要搜尋姓氏(lastname
)不以字元B
開頭的員工,則可以使用NOT LIKE
作為以下查詢:
SELECT
employeeNumber, lastName, firstName
FROM
employees
WHERE
lastName NOT LIKE 'B%';
執行上面查詢語句,得到以下結果 -
mysql> SELECT
employeeNumber, lastName, firstName
FROM
employees
WHERE
lastName NOT LIKE 'B%';
+----------------+-----------+-----------+
| employeeNumber | lastName | firstName |
+----------------+-----------+-----------+
| 1002 | Murphy | Diane |
| 1056 | Patterson | Mary |
| 1076 | Firrelli | Jeff |
| 1088 | Patterson | William |
| 1165 | Jennings | Leslie |
| 1166 | Thompson | Leslie |
| 1188 | Firrelli | Julie |
| 1216 | Patterson | Steve |
| 1286 | Tseng | Foon Yue |
| 1323 | Vanauf | George |
| 1370 | Hernandez | Gerard |
| 1401 | Castillo | Pamela |
| 1504 | Jones | Barry |
| 1611 | Fixter | Andy |
| 1612 | Marsh | Peter |
| 1619 | King | Tom |
| 1621 | Nishi | Mami |
| 1625 | Kato | Yoshimi |
| 1702 | Gerard | Martin |
+----------------+-----------+-----------+
19 rows in set
請注意,使用
LIKE
運算子,該模式不區分大小寫,因此,b%
和B%
模式產生相同的結果。
有時想要匹配的模式包含萬用字元,例如10%
,_20
等這樣的字串時。在這種情況下,您可以使用ESCAPE
子句指定跳脫字元,以便MySQL將萬用字元解釋為文字字元。如果未明確指定跳脫字元,則反斜槓字元\
是預設跳脫字元。
如下語句,將查詢productCode
欄位中包含_20
字串的值。
SELECT
productCode, productName
FROM
products
WHERE
productCode LIKE '%\_20%';
執行上面語句,得到以下結果 -
mysql> SELECT
productCode, productName
FROM
products
WHERE
productCode LIKE '%\_20%';
+-------------+-------------------------------------------+
| productCode | productName |
+-------------+-------------------------------------------+
| S10_2016 | 1996 Moto Guzzi 1100i |
| S24_2000 | 1960 BSA Gold Star DBD34 |
| S24_2011 | 18th century schooner |
| S24_2022 | 1938 Cadillac V-16 Presidential Limousine |
| S700_2047 | HMS Bounty |
+-------------+-------------------------------------------+
5 rows in set
或者,也可以使用ESCAPE
子句指定一個不同的跳脫字元,例如$
:
SELECT
productCode, productName
FROM
products
WHERE
productCode LIKE '%$_20%' ESCAPE '$';
以上語句查詢結果與上一個語句得到的結果相同。
模式%$_20%
匹配任何包含_20
字串的字串。
LIKE
操作符強制MySQL掃描整個表以找到匹配的行記錄,因此,它不允許資料庫引擎使用索引進行快速搜尋。因此,當要從具有大量行的表查詢資料時,使用LIKE
運算子來查詢資料的效能會大幅降低。
在本教學中,您已經學習了如何使用LIKE
運算子根據模式查詢資料,這比使用比較運算子更靈活。