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开头且最多后跟一个字符的名字

Sa
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)比较是大小写敏感的。

这意味着,如果使用搜索WHERE name LIKE 'S%',您将获得以S或s开头的所有列值(正如您看到的,我们同时拥有“ Sarah”和“ simons”)。但是,如果要使此搜索区分大小写,可以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 |
+--------+------------------+------------+--------+---------+

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

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