SQL LIKE 运算符

在本教程中,你将学习如何基于部分匹配来检索数据。

模式匹配

到目前为止,你已经看到了识别精确字符串的条件,例如 WHERE name='Lois Lane' 。但在 SQL 中,你也可以使用 LIKE 运算符执行部分或模式匹配。

LIKE 运算符允许你为一个或多个字符指定通配符提供模式匹配的度量。你可以使用以下两个通配符:

  • 百分号(%) - 匹配任意数量的字符,甚至零个字符。
  • 下划线(_) - 恰好匹配一个字符

以下是一些示例,说明如何将 LIKE 操作符与通配符一起使用。

声明 含义 返回的值
WHERE name LIKE ‘Da%’ 查找以 Da 开头的名称 David, Davidson
WHERE name LIKE ‘%th’ 查找以 th 结尾的名字 Elizabeth, Smith
WHERE name LIKE ‘%on%’ 查找包含 on 的 名称 Davidson, Toni
WHERE name LIKE ‘Sa_’ 查找以 Sm 开头的名称,后跟最多一个字符 Sam
WHERE name LIKE ‘_oy’ 查找以 oy 结尾的名称,前面至多有一个字符 Joy, Roy
WHERE name LIKE ‘an 查找包含 a 的 名称 并以最多一个字符开头和结尾 Dana, Hans
WHERE name LIKE ‘%ar_’ 查找包含 ar 的 名称,以任意数量的字符开头,最多以一个字符结尾 Richard, Karl
WHERE name LIKE ‘_ar%’ 查找包含 ar 的 名称,最多以一个字符开头,并以任意数量的字符结尾 Karl, Mariya
让我们通过搜索一些记录将我们上面讨论过的语句用于实际用途。

考虑我们在数据库中有一个 employees 表,其中包含以下记录:

+--------+------------------+------------+--------+---------+
| emp_id | emp_name         | hire_date  | salary | dept_id |
+--------+------------------+------------+--------+---------+
|      1 | Ethan Hunt       | 2001-05-01 |   5000 |       4 |
|      2 | Tony Montana     | 2002-07-15 |   6500 |       1 |
|      3 | Sarah Connor     | 2005-10-18 |   8000 |       5 |
|      4 | Rick Deckard     | 2007-01-03 |   7200 |       3 |
|      5 | Martin Blank     | 2008-06-24 |   5600 |    NULL |
|      6 | simons bistro    | 2009-04-01 |   6000 |       1 |
+--------+------------------+------------+--------+---------+

现在,假设你要查找名称以 S 字母开头的所有员工。

SELECT * FROM employees 
WHERE emp_name LIKE 'S%';

执行查询后,你将获得如下输出:

+--------+------------------+------------+--------+---------+
| emp_id | emp_name         | hire_date  | salary | dept_id |
+--------+------------------+------------+--------+---------+
|      3 | Sarah Connor     | 2005-10-18 |   8000 |       5 |
|      6 | simons bistro    | 2009-04-01 |   6000 |       1 |
+--------+------------------+------------+--------+---------+

在 MySQL 非二进制串(CHARVARCHARTEXT)比较默认是不区分大小写,而二进制字符串(BINARYVARBINARYBLOB)比较是大小写敏感的。

这意味着如果你搜索 WHERE name LIKE 'S%' ,你得到所有以 S 或 s 开头的列值(你可以看到我们有 Sarahsimons)。但是,如果你想使此搜索区分大小写,则可以使用 BINARY 运算符,如下所示:

-- Syntax for MySQL Database 
SELECT * FROM employees 
WHERE BINARY emp_name LIKE 'S%';

现在,此语句将仅返回名称以大写字母 S 开头的员工:

+--------+------------------+------------+--------+---------+
| emp_id | emp_name         | hire_date  | salary | dept_id |
+--------+------------------+------------+--------+---------+
|      3 | Sarah Connor     | 2005-10-18 |   8000 |       5 |
+--------+------------------+------------+--------+---------+

注意: 如果希望始终以区分大小写的方式处理列,请使用区分大小写或二进制排序规则来声明它,以避免出现任何性能问题。

提示: 当你不知道要搜索的字符串的确切形式时,部分匹配很有用。你还可以使用部分匹配来检索表中列之一中包含类似字符串的多个行。