SQL Like運算子


在本教學中,您將學習如何使用SQL LIKE運算子來測試表示式是否與模式匹配。

1. SQL LIKE運算子簡介

有時,測試表示式是否與特定模式匹配很有用,例如,查詢名字以YiiSu開頭的所有員工。 在這些情況下,需要使用LIKE運算子。

LIKE運算子測試表示式是否與特定模式匹配。 請參閱以下語法:

expression LIKE pattern

如果表示式與模式匹配,則LIKE運算子返回true。 否則它返回false

LIKE運算子通常用於SELECTUPDATEDELETE語句的WHERE子句中。

要構造模式,請使用兩個SQL萬用字元:

  • %百分號匹配零個,一個或多個字元。
  • _下劃線符號匹配單個字元。

下表說明了一些模式及其含義:

模式 含義
LIKE 'Yii%' 匹配以Yii開始的字串
LIKE '%su' 匹配以su結尾的字串
LIKE '%ch% 匹配包含ch的字串
LIKE 'Luc_' Luc開始,後面只有一個字元,例如:LucyLucc
LIKE '_cy' cy結尾,前面只有一個字元,例如:Lcyucy
LIKE '%yiibai_' 包含yiibai,以任意數量的字元開頭,最多以一個字元結尾。
LIKE '_yiibai%' 包含yiibai,最多以一個字元開頭,以任意數量的字元結尾。

如果要匹配萬用字元%_,則必須使用反斜槓字元\來對其進行跳脫。 如果要使用其它的跳脫字元而不是反斜槓,可以在LIKE表示式中使用ESCAPE子句,如下所示:

expression LIKE pattern ESCAPE escape_character

2. SQL LIKE運算子範例

我們將使用範例資料庫中的employees表進行演示。

mysql> desc employees;
+---------------+--------------+------+-----+---------+----------------+
| Field         | Type         | Null | Key | Default | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| employee_id   | int(11)      | NO   | PRI | NULL    | auto_increment |
| first_name    | varchar(20)  | YES  |     | NULL    |                |
| last_name     | varchar(25)  | NO   |     | NULL    |                |
| email         | varchar(100) | NO   |     | NULL    |                |
| phone_number  | varchar(20)  | YES  |     | NULL    |                |
| hire_date     | date         | NO   |     | NULL    |                |
| job_id        | int(11)      | NO   | MUL | NULL    |                |
| salary        | decimal(8,2) | NO   |     | NULL    |                |
| manager_id    | int(11)      | YES  | MUL | NULL    |                |
| department_id | int(11)      | YES  | MUL | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+
10 rows in set

要查詢名字以Sh開頭的所有員工,請使用Sh%模式,如以下語句所示:

SELECT
    employee_id,
    first_name,
    last_name
FROM
    employees
WHERE
    first_name LIKE 'Sh%';

執行上面查詢語句,得到以下結果 -

+-------------+------------+-----------+
| employee_id | first_name | last_name |
+-------------+------------+-----------+
|         116 | Shelli     | Zhang     |
|         123 | Shanta     | Liu       |
|         205 | Shelley    | Wu        |
+-------------+------------+-----------+
3 rows in set

執行上面查詢語句,得到以下結果 -

SELECT
    employee_id,
    first_name,
    last_name
FROM
    employees
WHERE
    first_name LIKE '%na';

執行上面查詢語句,得到以下結果 -

以下語句查詢姓氏包含字元:en的所有員工:

SELECT
    employee_id,
    first_name,
    last_name
FROM
    employees
WHERE
    last_name LIKE '%en%';

執行上面查詢語句,得到以下結果 -

以下語句檢索名字以Jo開頭且後跟最多2個字元的員工:

SELECT
    employee_id,
    first_name,
    last_name
FROM
    employees
WHERE
    first_name LIKE 'Jo__';

執行上面查詢語句,得到以下結果 -

+-------------+------------+-----------+
| employee_id | first_name | last_name |
+-------------+------------+-----------+
|         110 | John       | Chen      |
|         145 | John       | Liu       |
+-------------+------------+-----------+
2 rows in set

以下語句選擇名字以任意數位開頭且後跟最多一個字元的員工。

SELECT
    employee_id,
    first_name,
    last_name
FROM
    employees
WHERE
    first_name LIKE '%are_';

執行上面查詢語句,得到以下結果 -

+-------------+------------+-----------+
| employee_id | first_name | last_name |
+-------------+------------+-----------+
|         119 | Karen      | Zhang     |
|         146 | Karen      | Liu       |
+-------------+------------+-----------+
2 rows in set

3. SQL NOT LIKE運算子

要否定LIKE運算子的結果,可以使用NOT運算子,如下所示:

expression NOT LIKE pattern ESCAPE escape_character

例如,要查詢名字以M開頭但不以Ma開頭的所有員工,請使用以下語句:

SELECT
    employee_id, first_name, last_name
FROM
    employees
WHERE
    first_name LIKE 'M%'
AND first_name NOT LIKE 'Ma%'
ORDER BY
    first_name;

執行上面查詢語句,得到以下結果 -

+-------------+------------+-----------+
| employee_id | first_name | last_name |
+-------------+------------+-----------+
|         201 | Michael    | Zhou      |
|         113 | Min        | Su        |
|         122 | Min        | Liu       |
+-------------+------------+-----------+
3 rows in set

在本教學中,您學習了如何使用SQL LIKE運算子選擇與特定模式匹配的值。