mysql命令单词_MySQL常用命令(四)-REGEXP

REGEXP

正则表达式的作用是匹配文本,将一个模式与一个文本串进行比较,MySQL用WHERE子句对正则表达式提供初步的支持,允许指定正则表达式,过滤SELECT检索出来的数据,但是其实MySQL支持的只是正则表达式的一小部分;

.匹配任意一个字符

mysql> SELECT name,age,salary FROM person ;

+------+-----+----------+

| name | age | salary |

+------+-----+----------+

| Jack | 23 | 8000.00 |

| Mary | 21 | 8000.00 |

| Ken | 25 | 10000.00 |

+------+-----+----------+

3 rows in set (0.00 sec)

mysql> SELECT name,age,salary FROM person WHERE salary LIKE '_000.00';#必须要带上.00否则无法匹配出来;

+------+-----+---------+

| name | age | salary |

+------+-----+---------+

| Jack | 23 | 8000.00 |

| Mary | 21 | 8000.00 |

+------+-----+---------+

2 rows in set (0.00 sec)

mysql> SELECT name,age,salary FROM person WHERE salary LIKE '_000';#必须要带上.00否则无法匹配出来;出

Empty set (0.00 sec)

mysql> SELECT name,age,salary FROM person WHERE salary LIKE '8000';#无结果

Empty set (0.00 sec)

mysql> SELECT name,age,salary FROM person WHERE salary REGEXP '.000';

+------+-----+----------+

| name | age | salary |

+------+-----+----------+

| Jack | 23 | 8000.00 |

| Mary | 21 | 8000.00 |

| Ken | 25 | 10000.00 |

+------+-----+----------+

3 rows in set (0.00 sec)

REGEXP与LIKE的比较

通过实验的结果我发现LIKE是严格遵守整个列值进行匹配,而REGEXP只需要列值的部分包含表达式即可;通俗点讲就是,LIKE后面跟的字符位数和列值完全一致,但是REGEXP后跟的字符位数只需要小于或等于即可匹配;

匹配区分大小写-BINARY

默认情况下LIKE和REGEXP匹配是不区分大小写的,如果要区分大小写需要使用关键字BINARY;

mysql> SELECT name,age,salary FROM person WHERE name REGEXP 'jack';

+------+-----+---------+

| name | age | salary |

+------+-----+---------+

| Jack | 23 | 8000.00 |

| jack | 22 | 5600.00 |

+------+-----+---------+

2 rows in set (0.00 sec)

mysql> SELECT name,age,salary FROM person WHERE name REGEXP BINARY 'jack';

+------+-----+---------+

| name | age | salary |

+------+-----+---------+

| jack | 22 | 5600.00 |

+------+-----+---------+

1 row in set (0.09 sec)

mysql> SELECT name,age,salary FROM person WHERE name LIKE BINARY 'jack';

+------+-----+---------+

| name | age | salary |

+------+-----+---------+

| jack | 22 | 5600.00 |

+------+-----+---------+

1 row in set (0.00 sec)

mysql> SELECT name,age,salary FROM person WHERE name LIKE 'jack';

+------+-----+---------+

| name | age | salary |

+------+-----+---------+

| Jack | 23 | 8000.00 |

| jack | 22 | 5600.00 |

+------+-----+---------+

2 rows in set (0.00 sec)

OR匹配

mysql> SELECT name,age,salary FROM person ;

+------+-----+----------+

| name | age | salary |

+------+-----+----------+

| Jack | 23 | 8000.00 |

| Mary | 21 | 8000.00 |

| Ken | 25 | 10000.00 |

| jack | 22 | 5600.00 |

+------+-----+----------+

4 rows in set (0.00 sec)

mysql> SELECT name,age,salary FROM person WHERE salary REGEXP '800|5600';

+------+-----+---------+

| name | age | salary |

+------+-----+---------+

| Jack | 23 | 8000.00 |

| Mary | 21 | 8000.00 |

| jack | 22 | 5600.00 |

+------+-----+---------+

3 rows in set (0.00 sec)

匹配特定的字符[]

mysql> SELECT name,age,salary FROM person WHERE salary REGEXP '[8|56]00';

+------+-----+---------+

| name | age | salary |

+------+-----+---------+

| Jack | 23 | 8000.00 |

| Mary | 21 | 8000.00 |

| jack | 22 | 5600.00 |

+------+-----+---------+

3 rows in set (0.00 sec)

mysql> SELECT name,age,salary FROM person WHERE salary REGEXP '[856]00';

+------+-----+---------+

| name | age | salary |

+------+-----+---------+

| Jack | 23 | 8000.00 |

| Mary | 21 | 8000.00 |

| jack | 22 | 5600.00 |

+------+-----+---------+

3 rows in set (0.00 sec)

mysql> SELECT name,age,salary FROM person WHERE salary REGEXP '[^856]00';

+------+-----+----------+

| name | age | salary |

+------+-----+----------+

| Jack | 23 | 8000.00 |

| Mary | 21 | 8000.00 |

| Ken | 25 | 10000.00 |

| jack | 22 | 5600.00 |

+------+-----+----------+

4 rows in set (0.00 sec)

mysql> SELECT name,age,salary FROM person WHERE salary REGEXP '[^856]000.00';# 否定,这个地方5600.00被排除很奇怪;

+------+-----+----------+

| name | age | salary |

+------+-----+----------+

| Ken | 25 | 10000.00 |

+------+-----+----------+

1 row in set (0.00 sec)

范围匹配

[1-9]和[123456789]等价,字母也可以[a-z],也可以是非完整的比如[1-3][6-9];

mysql> SELECT name,age,salary FROM person ;

+------+-----+----------+

| name | age | salary |

+------+-----+----------+

| Jack | 23 | 8000.00 |

| Mary | 21 | 8000.00 |

| Ken | 25 | 10000.00 |

| jack | 22 | 5600.00 |

+------+-----+----------+

4 rows in set (0.00 sec)

mysql> SELECT name,age,salary FROM person WHERE salary REGEXP '[1-9]000'

-> ;

+------+-----+----------+

| name | age | salary |

+------+-----+----------+

| Jack | 23 | 8000.00 |

| Mary | 21 | 8000.00 |

| Ken | 25 | 10000.00 |

+------+-----+----------+

3 rows in set (0.00 sec)

匹配特殊的字符

正则表达式中出现过的特殊字符比如.[]|-等等,出现在所取值中,应该使用\进行转义显示;

mysql> SELECT name,age,salary FROM person ;

+-------+-----+----------+

| name | age | salary |

+-------+-----+----------+

| jack. | 23 | 8000.00 |

| Mary | 21 | 8000.00 |

| Ken | 25 | 10000.00 |

| jack. | 22 | 5600.00 |

+-------+-----+----------+

4 rows in set (0.00 sec)

mysql> SELECT name,age,salary FROM person WHERE name REGEXP '.';

+-------+-----+----------+

| name | age | salary |

+-------+-----+----------+

| jack. | 23 | 8000.00 |

| Mary | 21 | 8000.00 |

| Ken | 25 | 10000.00 |

| jack. | 22 | 5600.00 |

+-------+-----+----------+

4 rows in set (0.00 sec)

mysql> SELECT name,age,salary FROM person WHERE name REGEXP '\\.';

+-------+-----+---------+

| name | age | salary |

+-------+-----+---------+

| jack. | 23 | 8000.00 |

| jack. | 22 | 5600.00 |

+-------+-----+---------+

2 rows in set (0.00 sec)

字符类

有一些已经定义好的mysql内部,可以直接使用的类;

表9-2 字符类

类 说 明

[: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:] 包括空格在内的任意空白字符(同[\f\n\r\t\v])

[:upper:] 任意大写字母(同[A-Z])

[:xdigit:] 任意十六进制数字(同[a-fA-F0-9])

控制匹配的字符数

表9-3 重复元字符

控制匹配的字符出现次数

元 字 符 说 明

* 0个或多个匹配

+ 1个或多个匹配(等于{1,})

? 0个或1个匹配(等于{0,1})

{n} 指定数目的匹配

{n,} 不少于指定数目的匹配

{n,m} 匹配数目的范围(m不超过255)

定位符

前面使用的REGEXP都是匹配列的任意位置,如果只想匹配特殊位置,需要使用定位符;

定位元字符

元 字 符 说 明

^ 文本的开始

$ 文本的结尾

[[:<:>

[[:>:]] 词的结尾

mysql> SELECT name,age,salary FROM person ;

+-------+-----+----------+

| name | age | salary |

+-------+-----+----------+

| jack. | 23 | 8000.00 |

| Mary | 21 | 8000.00 |

| Ken | 25 | 10000.00 |

| jack. | 22 | 5600.00 |

+-------+-----+----------+

4 rows in set (0.00 sec)

mysql> SELECT name,age,salary FROM person WHERE name REGEXP '^8000$';#无结果;

Empty set (0.00 sec)

mysql> SELECT name,age,salary FROM person WHERE name LIKE '8000';#效果同上

Empty set (0.00 sec)

简单的正则测试

前提是不选择库和表的时候,否则会报错;

如果结果为真则返回1,否则返回0;

mysql> select 'hello' REGEXP '[a-z]';

+------------------------+

| 'hello' REGEXP '[a-z]' |

+------------------------+

| 1 |

+------------------------+

1 row in set (0.00 sec)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值