在本教程中,您将学习如何基于部分匹配来检索数据。
到目前为止,您已经看到了标识确切字符串的条件,例如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 | +--------+------------------+------------+--------+---------+
注意:如果希望始终以区分大小写的方式对待列,请使用区分大小写或二进制排序规则对其进行声明,以避免任何性能问题。
提示:当您不知道要搜索的字符串的确切形式时,部分匹配非常有用。您还可以使用部分匹配来检索表的某一列中包含相似字符串的多行。