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_' |
查找以 Sa 开头且后跟最多一个字符的名称 | Sam |
WHERE name LIKE '_oy' |
查找以 oy 结尾且前面最多有一个字符的名称 | Joy, Roy |
WHERE name LIKE '_an_' |
查找包含 an 并以最多一个字符开头和结尾的名称 | 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 中,非二进制字符串 (CHAR
, VARCHAR
, TEXT
) 比较默认是不区分大小写的,而二进制字符串 (BINARY
, VARBINARY
, BLOB
) 比较是区分大小写的。
这意味着如果您使用 code>WHERE name LIKE 'S%' 进行搜索,您将获得所有以 S 或 s 开头的列值(如您所见,我们同时获得了"Sarah"和"simons")。 但是,如果要使此搜索区分大小写,可以使用 BINARY
运算符,如下所示:
-- MySQL 数据库的语法
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 | +--------+------------------+------------+--------+---------+
注意:如果您希望始终以区分大小写的方式处理列,请使用区分大小写或二进制排序规则声明它以避免任何性能问题。
提示:当您不知道要搜索的字符串的确切形式时,部分匹配很有用。 您还可以使用部分匹配来检索在表的某一列中包含相似字符串的多行。
Advertisements