正则表达式——MySQL搜索过滤

正则表达式介绍

在数据库的数据过滤过程中只用WHERE子句和LIKE操作符都是对于已知值进行的

不管是匹配一个还是多个值,测试大于还是小于已知值,或者检查某个范围的值,都是使用已知的值

当然MySQL语句也提供了通配符百分号(%)和下划线(_)来匹配多个和单个字符

在检索名中包含某些文本或字符的字段时确实很有用,但是这种功能也是有代价的

因为通配符和搜索的处理一般要比有些搜索所花时间要长,而且会使WHERE子句本身过于复杂

这也就是正则表达式变得有用的地方,所有程序设计语言、文本编辑器、操作系统等都支持正则表达式

正则表达式是用来匹配文本的特殊串,用正则表达式语言来建立,所以这也是你必须所学习的特殊语法和指令

全文阅读和自己练习尝试需要大概十五分钟左右,熟练运用SQL语句中还得需要你自己不断地积累和使用,希望不会浪费读者宝贵的时间

通配符小技巧

虽然通配符搜索处理要比其他搜索时间所花时间要长,但是在数据量不大的时候还是建议使用的

这里在讲正则表达式之前还是先给出一些使用通配符要记住的技巧:

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

学习使用正则表达式

我们从一个简单的例子开始,下面检索列Name带文本aba的部分行

这里我们先提一个问题,正则表达式和通配符匹配区分大小写吗?仔细观察下面检索的对象,你就知道答案了

这我们看到关键字REGEXP声明后面的东西作为正则表达式处理,就得到了所有Name列包含aba文本的数据,而且你也发现它们是不区分大小写的

这时候你可能就要问,为什么要那么费力使用正则表达式?在刚才的例子中,没有体现出带来的好处,还可能降低性能,也确实没有以下通配符的方法简单
SELECT *
FROM city
WHERE Name LIKE '%aba%'
ORDER BY Name
LIMIT 10;
接下来,请考虑接下来的这些例子

这里使用了正则表达式.East。.是正则表达式中的一个特殊字符,表示匹配任意一个字符

|是正则表达式的OR操作,它表示匹配其中之一,多个OR条件可以并入单个正则表达式。

从这里开始终于开始有属于正则表达式自己独有的匹配方式了

这里大家应该就有些看不懂这有些复杂的正则表达式了,所以接下来介绍所有正则表达式的其他语法
  • 中括号
    • 中括号中添加可以匹配的字符,但是本身只能匹配一个其中一个字符,比如说[123]就是匹配1、2或3
    • 还可以匹配范围,为了简化[123456789]这种过于冗长的集合,可使用-来定义一个范围,比如说[1-9]和刚才的集合是一样的
  • 标识符
    • ^ :有两个作用,一个是在集合中表示否定该集合,一个是作为定位符表示指文本的开始处
      • [^123] :匹配除了1、2或3这些字符外的其他东西
      • ^a :文本的开头是a字符
    • $ :和^相反,这是文本结尾的标识符
  • 匹配特殊字符
    • 为了匹配特殊字符,必须用\为前导,这种处理就是所谓的转义,这样也存在了很多空白元字符
      • \f:换页
      • \n:换行
      • \r:回车
      • \t:制表
      • \v:纵向制表
    • 多数正则表达式都是用单反斜杠转义,而MySQL要求两个是因为自己解释一个,正则表达库解释另一个
  • 匹配字符类
    • 为了方便工作,可以使用预定义的字符集,成为字符类
      • [:alnum:]:任意字母或者数字
      • [:alpha:]:任意字符
      • [:blank:]:空格和制表
      • [:cntrl:]:ASCII控制字符
      • [:digit:]:任意数字
      • [:graph:]:与[:print:]相同,但是不包括空格
      • [:lower:]:任意小写字母
      • [:print:]:任意可打印字符
      • [:punct:]:不在[:alnum:],但又在[:cntrl:]的任意字符
      • [:space:]:包括空格在内的任意空白字符
      • [:upper:]:任意大写字母
      • [:xdigit:]:任意十六进制数字
  • 匹配多个实例
    • 目前为止所有的正则表达式都试图匹配单次出现,但是有时需要对匹配的数目进行更强的控制
      • *:0个或多个匹配
      • +:一个或多个匹配
      • ?:0个或1个匹配
      • {n}:指定数目的匹配
      • {n,}:不少于指定数目的匹配
      • {n,m}:匹配数目的范围

总结

以上基本就是常用到的MySQL正则表达式语法了,如果说你还没有合适的表来做练习,这里还有一个简单的测试方法
SELECT 'hello' REGEXP '[0-9]'
REGEXP检查总是返回0(没有匹配)或者1(匹配),所以显然这个语句的答案是返回0

总结下来你会发现,REGEXP和LIKE的不同在于,LIKE匹配整个串,而REGEXP匹配子串

正则表达式涉及的范围是很广的,本人在自学Linux的Bash编程时也是常常用到它,所以这是你必须掌握的技能

文章如果存在问题或者有其他可以添加的语法,希望大佬斧正和评论,希望我和大家一起进步一起优秀
posted @ 2021-02-25 14:40  21岁还不是架构师  阅读(317)  评论(0编辑  收藏  举报