MySQL匹配,LIKE or REGEXP?

 

😀 在MySQL中,我们可以使用LIKE和REGEXP函数来进行模式匹配操作。LIKE函数使用通配符进行模式匹配,而REGEXP函数使用正则表达式进行模式匹配。这两个函数都是常用的工具,但它们在匹配方式、匹配规则和性能方面存在一些区别。

一、引言

模式匹配是一种在数据库中根据特定模式进行数据筛选和查找的技术。它允许我们根据我们所需的数据模式来提取相关的数据,从而满足我们的查询需求。模式匹配在数据分析、报表生成和数据挖掘等领域中起着至关重要的作用。 在MySQL中,我们可以使用LIKE和REGEXP函数来进行模式匹配操作。LIKE函数使用通配符进行模式匹配,而REGEXP函数使用正则表达式进行模式匹配。这两个函数都是常用的工具,但它们在匹配方式、匹配规则和性能方面存在一些区别。

二、LIKE函数

2.1 简介

  • %通配符
    匹配任意次数的字符,包括0个. % 代表搜索模式中给定位置的0个、1个或多个字符。

  • 注意NULL 虽然似乎%通配符可以匹配任何东西,但有一个例 外,即NULL。即使是WHERE prod_name LIKE ‘%’也不能匹配 用值NULL作为产品名的行。 示例:匹配Jet开头的字符 -
    SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 'Jet%';
    
  • _通配符
    匹配任意单个字符 示例:匹配Jet开头,长度为4的字符
    SELECT prod_id, prod_name FROM products WHERE prod_name LIKE 'Jet_';
    

2.2 使用技巧

  1. 不要过度使用通配符。如果其他操作符能达到相同的目的,应该 使用其他操作符。
  2. 在确实需要使用通配符时,除非绝对有必要,否则不要把它们用在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。【这里要特别记住哦】
  3. 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。

三、REGEXP函数

介绍
注意1:

  • MySQL只支持正则表达式的部分内容

    3.1 MySQL正则表达式

    基本字符匹配

REGEXP
使用方式

REGEXP 'your-pattern'

例如:

SELECT prod_name FROM products WHERE prod_name REGEXP '1000';
+--------------+
| prod_name    |
+--------------+
| JetPack 1000 |
+--------------+
1 row in set (0.00 sec)

逻辑:如果该列存在字符匹配,则被检索出来 注意2:

LIKE 与 REGEXP的区别

LIKE匹配整个列。如果被匹配的文本在列值中出现,LIKE将不会找到它,相应的行也不被返回(除非使用 通配符)。而REGEXP在列值内进行匹配,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。这是一个非常重要的差别。使用^和$定位符(anchor)即可完全匹配 进行OR匹配为搜索两个或多个串之一(或者为这个串,或者为另一个串),使用|

SELECT prod_name FROM products WHERE prod_name REGEXP '1000|2000';
+--------------+
| prod_name    |
+--------------+
| JetPack 1000 |
| JetPack 2000 |
+--------------+
2 rows in set (0.00 sec)
使用 从功能上类似于在SELECT语句中使用OR语句,多个OR条件可并 入单个正则表达式。

匹配几个字符之一

匹配任何单一字符。可通过指定一组用[和]括起来的字符来完成

SELECT prod_name FROM products WHERE prod_name REGEXP '[123] Ton';

+-------------+
| prod_name   |
+-------------+
| 1 ton anvil |
| 2 ton anvil |
+-------------+

匹配范围

[0-9] = [0123456789]
[a-z]
[A-Z]

匹配特殊字符(转义)

为了匹配特殊字符,必须用\为前导。\-表示查找-,\.表示查找.

SELECT prod_name FROM products WHERE prod_name REGEXP '\\.';
+--------------+
| prod_name    |
+--------------+
| .5 ton anvil |
+--------------+

\也用来引用元字符(具有特殊含义的字符)

\\f 换页
\\n 换行
\\r 回车
\\t 制表符
\\v 纵向制表符

  • 注意1: 匹配\ 为了匹配反斜杠()字符本身,需要使用\\。
    这里需要三个反斜杠

    匹配字符类

    | 类 | 说明 | |———|——————————————————| | [:alnum:] | 任意数字和字母。相当于[a-zA-Z0-9] | | [:alpha:] | 任意字符。相当于[a-zA-z] | | [:blank:] | 空格和制表。相当于[\t] | | [:cntrl:] | ASCII控制字符(ASCII 0 到 31 和 127) | | [:digit:] | 任意数字。相当于[0-9] | | [:graph:] | 与[:print:]相同,但是不包含空格 | | [:lower:] | 任意的小写字母。相当于[a-z] | | [:print:] | 任意可打印字符 | | [:punct:] | 既不在[:alnum:]又不在[:cntrl:]中的任意字符 | | [:space:] | 包括空格在内的任意空白字符。 | | [:upper:] | 任意大写字母。相当于[A-Z] | | [:xdigit:] | 任意十六进制的数字。相当于[a-fA-F0-9] |

    匹配元字符

元字符 作用
* 重复0次或者多次
+ 重复一次或者多次。相当于{1,}
? 重复0次或者1次
{n} 重复n次
{n,} 重复至少n次
{n,m} 重复n-m次
SELECT prod_name FROM products WHERE prod_name REGEXP '\\([0-9] sticks?\\)';

+----------------+
| prod_name      |
+----------------+
| TNT (1 stick)  |
| TNT (5 sticks) |
+----------------+

匹配定位符

除了之前的重复元字符,正则还有一种特殊的定位元字符

元字符 作用
^ 文本开始
$ 文本结尾
[[:<:]] 词的开始
[[:>:]] 词的结尾
  • ^的双重用途
  • ^有两种用法。在集合中(用[和]定义),用它 来否定该集合,否则,用来指串的开始处。 Plain text
    1. 注意: 简单的正则表达式测试 可以在不使用数据库表的情况下用 SELECT来测试正则表达式。REGEXP检查总是返回0(没有匹配) 或1(匹配)。可以用带文字串的REGEXP来测试表达式,并试 验它们。相应的语法如下:
SELECT 'hello' REGEXP '[0-9]'

这个例子显然将返回0(因为文本hello中没有数字)。

3.2 优缺点

  1. REGEXP的强大和灵活性
    REGEXP函数提供了更强大和灵活的匹配能力,可以满足复杂和灵活的模式匹配需求。正则表达式的功能和语法规则丰富,可以使用字符类、重复次数、边界匹配等特性来定义复杂的模式。
  2. 适用于复杂和灵活的模式匹配需求
    由于REGEXP函数使用正则表达式进行模式匹配,它适用于处理更复杂和灵活的模式匹配需求。例如,我们可以使用正则表达式来匹配特定的模式,如日期格式、邮箱格式等。
  3. 性能方面的考虑
    由于正则表达式的匹配规则更复杂,REGEXP函数在处理大量数据时可能会比LIKE函数更耗费计算资源和时间。在性能方面需要进行考虑,特别是在处理大型数据库或复杂查询时。

    四、比较和选择

    4.1 LIKE 和 REGEXP 的区别和共同点

    LIKE 和 REGEXP 函数都是用于模式匹配的工具,但它们在匹配方式、匹配规则和性能方面存在一些区别。LIKE函数使用通配符进行模式匹配,适用于简单的模式匹配需求;而REGEXP函数使用正则表达式进行模式匹配,适用于复杂和灵活的模式匹配需求。

    4.2 根据需求选择合适的函数

    在选择使用 LIKE 还是 REGEXP 函数时,我们需要根据具体的匹配需求和性能要求来决定。如果我们只需要进行简单的模式匹配,如以某个字符开头或结尾,或者匹配固定长度的字符串,那么 LIKE 函数是一个简单且有效的选择。它的语法简单易懂,使用通配符%和_可以满足大多数基本的模式匹配需求。 然而,如果我们需要处理更复杂和灵活的模式匹配需求,如匹配特定的模式规则、使用字符类进行匹配、或者进行重复次数的匹配等,那么 REGEXP 函数是更合适的选择。正则表达式提供了更多的灵活性和功能,可以满足更复杂的模式匹配需求。 此外,我们还需要考虑性能和效率的因素。由于正则表达式的匹配规则更复杂,REGEXP 函数在处理大量数据时可能会耗费更多的计算资源和时间。因此,在性能要求较高的情况下,我们需要权衡使用LIKE 还是REGEXP 函数。 综上所述,根据具体的匹配需求和性能要求,我们可以选择合适的模式匹配函数。LIKE 函数适用于简单的模式匹配需求,而REGEXP 函数适用于复杂和灵活的模式匹配需求。通过灵活运用这两个函数,我们可以更高效地筛选和查找数据库中的数据。

    五、结论

    5.1 LIKE 和 REGEXP 的特点和用法

    LIKE 和REGEXP 函数都是在MySQL中常用的模式匹配工具。LIKE 函数使用通配符进行模式匹配,适用于简单的模式匹配需求,而 REGEXP 函数使用正则表达式进行模式匹配,适用于复杂和灵活的模式匹配需求。根据具体的匹配需求和性能要求,我们可以选择合适的函数来进行模式匹配操作。

    5.2 强调根据需求选择合适的模式匹配函数

    在进行模式匹配时,我们需要根据具体的需求来选择合适的函数。如果我们只需要进行简单的模式匹配,LIKE函数是一个简单且有效的选择。而如果我们需要处理更复杂和灵活的模式匹配需求,REGEXP函数提供了更强大和灵活的匹配能力。

    5.3 性能和效率的考虑

    在选择模式匹配函数时,我们还需要考虑性能和效率的因素。由于正则表达式的匹配规则更复杂,REGEXP函数在处理大量数据时可能会耗费更多的计算资源和时间。因此,在性能要求较高的情况下,我们需要权衡使用 LIKE 还是 REGEXP 函数。 综上所述,模式匹配在数据库中是一项重要的任务,而 LIKE 和 REGEXP 函数是常用的模式匹配工具。根据具体的匹配需求和性能要求,我们可以选择合适的函数来进行模式匹配操作。通过灵活运用这两个函数,我们可以更高效地筛选和查找数据库中的数据。

原文地址

本文遵守 Attribution-NonCommercial 4.0 International 许可协议。 Attribution-NonCommercial 4.0 International