MySQL LIKE運算子

2019-10-16 22:57:33

在本教學中,您將了解如何使用MySQL LIKE運算子根據模式查詢選擇資料。

LIKE操作符通常用於基於模式查詢選擇資料。以正確的方式使用LIKE運算子對於增加/減少查詢效能至關重要。

LIKE操作符允許您根據指定的模式從表中查詢選擇資料。 因此,LIKE運算子通常用在SELECT語句WHERE子句中。

MySQL提供兩個萬用字元,用於與LIKE運算子一起使用,它們分別是:百分比符號 - %和下劃線 - _

  • 百分比(%)萬用字元允許匹配任何字串的零個或多個字元。
  • 下劃線(_)萬用字元允許匹配任何單個字元。

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字元結尾的姓氏,例如,PattersonThompson,可以使用模式開頭的萬用字元,如下查詢:

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結尾,並且包含例如TomTim之間的任何單個字元,可以使用下劃線萬用字元來構建模式,如下所示:

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%模式產生相同的結果。

MySQL LIKE與ESCAPE子句

有時想要匹配的模式包含萬用字元,例如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運算子根據模式查詢資料,這比使用比較運算子更靈活。