0%

查询中使用通配符和正则表达式

在Mysql中单引号、双引号都可以。
①理解模糊查询
②当用户输入以下通配符等时,要对其转义为普通字符,不能查出模糊查询的内容。

一、模糊查询语句:SELECT 字段 FROM 表 WHERE 某字段 Like 搜索模式

通配符:用来匹配值的一部分的特殊字符
like:操作符
搜索模式:由字面值、通配符或两者组合构成的搜索条件

支持的通配符:
1582360593(1)

使用通配符注意事项:

  1. 搜索模式中字面值默认不区分大小写
    若要区分大小写,两种方法:
      ①like binary ‘%三%’
      ②创建表时,由原来的name varchar(10) 改为name varchar(10) binary
  2. 尾空格会干扰通配符匹配
      若字段值为三space,则where name like ‘%三’不会匹配。
      解决方案:查询语句改成where name like ‘%三%’
  3. ‘%’:会匹配任意个字符,除了null ;’_’会匹配一个字符,除了null
  4. 条件模式必须以单引号,与字段类型无关。
      若字面值包含单引号,则要转义:
        SELECT * from user where name like ‘Cb'‘; 查询Cb’

使用通配符的技巧

  1. 不要过度使用通配符。如果其他操作能达到同样目的,就使用其他操作符
  2. 在确实需要使用时,除非绝对必要,否则不要将他们用在搜索模式的开始处,这种情况是最慢的
  3. 仔细检查通配符的位置

若查询内容包含通配符
则要转义字符\:SELECT * from user where name like ‘%_%’; 查询包含_的name
       SELECT * from user where name like ‘%%‘; 查询以%结尾的name
       SELECT * from user where name like ‘%\‘; 查询以\结尾的name

二、正则表达式查询语句:SELECT 字段 FROM 表 WHERE 某字段 REGEXP 搜索模式

用下面例子体会正则查询与like查询的区别
  SELECT * from user where name like ‘a’;
  SELECT * from user where name regexp ‘a’;
like查询匹配的是整个字段 这个例子中就是name=a
regexp查询是在字段内进行匹配,若内部有符合条件的文本,则regexp将会找到它,并返回整个字段(因为select的是字段)

常见的正则表达式(mysql并不支持所有的正则表达式,只支持小部分)

. :任意一个字符

| :or匹配几个字符之一 ‘1|2|3’

[ ]:匹配几个字符之一 [123]是[1|2|3]的缩写,也可以写成1|2|3 否定[^123]
但要注意SELECT * from user where name regexp ‘a|b|c mn’;这个查询是a、b、c mn。
若要查询a mn、b mn、c mn 写成: SELECT * from user where name regexp ‘[a|b|c] mn’;

[ ]:匹配范围[1-3]、[a-o]

查询字符类:
1582366553(1)

匹配多个实例
前面的正则表达式都是匹配单词出现(不能和通配符%、_混淆)。但是需要匹配的数目会存在重复,但是现实中存在这样的需求:前3位均为数字,若按之前写法,则为[0-9][0-9][0-9]。若像身份证号这样的数据,则更长。通过运用下列的元字符来完成。
1582366907(1)
例子:
1582367865(1)

定位符
目前为止的所有例子都是匹配一个串中任意位置的文本。但有时我们需要开头是什么样子,而不是任何位置都匹配的情况。为了匹配特定位置的文本,需要用到如下定位符。

1582368013(1)
‘^[0-9.]’或[[:digit:].]:表示匹配0-9开头的字段值

使用正则表达式的注意点

  1. ^的双重用途:用在[]内表示否定该集合;否则表示串的开始处。
  2. 使regexp起类似like的作用:like匹配整个串而regexp匹配子串。利用定位符,以^开头,$结尾,可以达到同样效果。

查询中包含上面的特殊字符,则要转义
比如查询为Cb.,则语句写成SELECT * from user where name REGEXP ‘Cb.‘;