MySQL 通配符教程:LIKE、NOT LIKE、ESCAPE、( % )、( _ )

什么是 MySQL 通配符?

MySQL 通配符是用于帮助根据复杂条件搜索数据的字符。通配符与 LIKE 比较运算符或 NOT LIKE 比较运算符一起使用。

为什么要使用通配符?

如果您熟悉使用 SQL,您可能会认为可以使用 SELECT 和 WHERE 子句搜索任何复杂数据。那么为什么要使用通配符呢?

在回答这个问题之前,让我们看一个例子。假设 Myflix 视频库的营销部门在德克萨斯州进行了营销推广,并希望获得有关注册会员数量的一些反馈。

您可以使用以下 SELECT 语句和 WHERE 子句来获取所需信息。

SELECT * FROM members WHERE postal_address = 'Austin , TX' OR  postal_address = Dallas , TX OR postal_address = Iola,TX OR postal_adress = Houston ,TX';

如您从上面的查询中看到的,“WHERE 子句”变得很复杂。但是,使用通配符可以简化查询,因为我们可以使用下面显示的脚本这样的简单方法。

SELECT * FROM  members  WHERE postal_address  like '% TX';

简而言之,通配符允许我们在数据驱动的应用程序中构建强大的搜索引擎。

通配符类型

% 百分号

% 百分号字符用于指定零个 (0) 或多个字符的模式。它具有以下基本语法。

SELECT statements... WHERE fieldname LIKE 'xxx%';

HERE

  • SELECT statement…” 是标准的 SQL SELECT 命令。
  • “WHERE”是用于应用过滤器的关键字。
  • “LIKE”是与通配符一起使用的比较运算符。
  • ‘xxx’ 是任何指定的起始模式,例如单个字符或多个字符,而 “%” 匹配从零 (0) 开始的任意数量的字符。

为了完全理解上述陈述,让我们看一个实际的例子。

假设我们想要获取标题中包含“code”一词的所有电影,我们将使用百分号通配符在“code”一词的两侧执行模式匹配。以下是可用于实现所需结果的 SQL 语句。

SELECT * FROM movies WHERE title LIKE '%code%';

在 myflixdb 上对 MySQL workbench 执行上述脚本,可以得到如下结果。

movie_id title director year_released category_id
4 Code Name Black Edgar Jimz 2010 NULL
7 Davinci Code NULL NULL 6

请注意,即使搜索关键字“code”出现在标题的开头或结尾,它仍然会显示在我们的结果集中。这是因为我们的代码在开头包含任意数量的字符,然后匹配模式“code”,后面跟着任意数量的字符。

现在让我们修改上面的脚本,只在搜索条件开头包含百分号通配符。

SELECT * FROM movies WHERE title LIKE '%code';

在 MySQL workbench 上对 myflixdb 执行上述脚本,可以得到如下结果。

movie_id title director year_released category_id
7 Davinci Code NULL NULL 6

请注意,数据库中只返回了一条记录。这是因为我们的代码匹配了电影标题开头的任意数量的字符,并且只获取以“code”模式结尾的记录。

现在让我们将百分号通配符移动到要匹配的指定模式的末尾。修改后的脚本如下所示。

SELECT * FROM movies WHERE title LIKE 'code%';
在 MySQL workbench 上对 myflixdb 执行上述脚本,可以得到如下结果。
movie_id title director year_released category_id
4 Code Name Black Edgar Jimz 2010 NULL

请注意,数据库中只返回了一条记录。这是因为我们的代码匹配了所有以“code”模式开头,后面跟着任意数量字符的标题。

_ 下划线通配符

下划线通配符用于匹配一个确切的字符。假设我们要搜索所有在 200x 年份发行的电影,其中 x 是一个可以取任何值的确切字符。我们将使用下划线通配符来实现这一点。下面的脚本选择所有在“200x”年份发行的电影。

SELECT * FROM movies WHERE year_released LIKE '200_';

在 MySQL workbench 上对 myflixdb 执行上述脚本,可以得到如下结果。

movie_id title director year_released category_id
2 Forgetting Sarah Marshal Nicholas Stoller 2008 2
9 Honey mooners Jhon Shultz 2005 8

请注意,只有在发行年份中包含 200 后面跟任何字符的电影才会在我们的结果集中返回。这是因为下划线通配符匹配了模式 200 后面跟任何单个字符。

NOT Like

NOT 逻辑运算符可以与通配符一起使用,以返回与指定模式不匹配的行。

假设我们想要获取未在 200x 年份发行的电影。我们将使用 NOT 逻辑运算符和下划线通配符来获取结果。以下是执行此操作的脚本。

SELECT * FROM movies WHERE year_released NOT LIKE '200_';

movie_id title director year_released category_id
1 Pirates of the Caribean 4 Rob Marshall 2011 1
4 Code Name Black Edgar Jimz 2010 NULL
8 Underworld-Awakeninh Michahel Eal 2012 6

请注意,只有发行年份中不以 200 开头的电影才会在我们的结果集中返回。这是因为我们在通配符模式搜索中使用了 NOT 逻辑运算符。

Escape 关键字

ESCAPE 关键字用于转义模式匹配字符,例如 (%) 百分号和下划线 (_),如果它们是数据的一部分。

假设我们要检查字符串“67%”,我们可以使用:

LIKE '67#%%' ESCAPE '#';

如果我们想搜索电影“67% Guilty”,我们可以使用下面的脚本来完成。

SELECT * FROM movies WHERE title LIKE '67#%%' ESCAPE '#';

请注意,LIKE 子句中有两个“%%”。第一个红色“%”被视为要搜索的字符串的一部分。另一个用于匹配后面的任意数量的字符。

使用类似的方法,相同的查询也将起作用

SELECT * FROM movies WHERE title LIKE '67=%%' ESCAPE '=';

摘要

  • LIKE 和通配符是强大的工具,可帮助搜索匹配复杂模式的数据。
  • 有许多通配符,包括百分号、下划线和字符列表(MySQL 不支持)等。
  • 百分号通配符用于匹配从零 (0) 开始的任意数量的字符及更多。
  • 下划线通配符用于精确匹配一个字符。