MySQL——使用正则表达式查询

      使用正则表达式可以检索或替换符合某个模式的文本内容,根据指定的匹配模式匹配文本中符合要求的特殊字符串。

      在MySQL中,使用  REGEXP  关键字指定正则表达式的字符匹配模式。


正则表达式常用的字符匹配列表
选项 说明 例子 匹配值示例
^ 匹配文本的开始字符 ^b book,big,banana
$ 匹配文本结束字符 st$ test,resist
. 匹配任何单个字符 b.t bit,bat,but
* 匹配零个或多个在它前面的字符 f*n:匹配字符n前面的0个或多个f字符的字符串 fn,fan,faan
+ 匹配前面的字符1次或多次 ba+:匹配以 b 开头后面紧跟1个或多个a的字符串 ba,bay,bare
<字符串> 匹配包含指定的字符串的文本 fa:匹配包含“fa”的字符串 fan,afa.faad
[字符集合] 匹配字符集合中的任何一个字符 '[xz]':匹配  x  或者  z dizzy,zebra
[^] 匹配不在括号中的任何字符

'[^abc]':匹配任何不包含a、b、c的字符串

desk,fox
字符串{n,} 匹配前面的字符串至少n次 b{2}:匹配有2个或更多的b字符的字符串 bbb,bbbb
字符串{n,m} 匹配前面的字符串至少n次,至多m次。如果n为0,次参数为可选参数 b{2,4}:匹配至少有2个,最多有4个b字符的字符串

bb,bbb,bbbb


1.  查询以特定字符或字符串开头的记录

    字符^可以匹配以特定字符或者字符串开头的文本。

【例】在  fruits  表中,查询  f_name  字段以字母  b  开头的记录。SQL  语句如下:

mysql>  SELECT  *  FROM  fruits
    -> WHERE  f_name  REGEXP  '^b';
+------+------+------------+---------+
| f_id | s_id | f_name     | f_price |
+------+------+------------+---------+
| b1   |  101 | blackberry |   10.20 |
| b2   |  104 | berry      |    7.60 |
| t1   |  102 | blanana    |   10.30 |
+------+------+------------+---------+
    

2.  查询以特定字符或字符串结尾的记录

      字符 $ 可以匹配以特定字符或者字符串结尾的文本。

    

    【例】在  fruits  表中,查询  f_name  字段以字母  y  结尾的记录。SQL  语句如下:

mysql>  SELECT  *  FROM  fruits
    -> WHERE  f_name  REGEXP  'y$';
+------+------+------------+---------+
| f_id | s_id | f_name     | f_price |
+------+------+------------+---------+
| b1   |  101 | blackberry |   10.20 |
| b2   |  104 | berry      |    7.60 |
| c0   |  101 | cherry     |    3.20 |
| m2   |  105 | xbabay     |    2.60 |
+------+------+------------+---------+


3.  代替字符串中的任意一个字符

    字符‘.’可以匹配任意一个字符。


    【例】在  fruits  表中,查询  f_name  字段以包含字母  a  与  g  且两个字母之间只有一个字母的记录。SQL  语句如下

mysql>  SELECT  *  FROM  fruits
    -> WHERE  f_name  REGEXP  'a.g';
+------+------+--------+---------+
| f_id | s_id | f_name | f_price |
+------+------+--------+---------+
| bs1  |  102 | orange |   11.20 |
| m1   |  106 | mango  |   15.60 |
+------+------+--------+---------+


4.  匹配多个字符

    星号(*) 可以任意次匹配前面的字符,包括  0  次。加号(+)至少匹配前面的字符一次。

    【例】在  fruits  表中,查询  f_name  字段以包含字母  b  开头,且  b  后面出现字母  a  的记录。SQL  语句如下:

mysql> SELECT *  FROM  fruits
    -> WHERE  f_name  REGEXP  '^ba*';
+------+------+------------+---------+
| f_id | s_id | f_name     | f_price |
+------+------+------------+---------+
| b1   |  101 | blackberry |   10.20 |
| b2   |  104 | berry      |    7.60 |
| t1   |  102 | banana     |   10.30 |
+------+------+------------+---------+

【例】在  fruits  表中,查询  f_name  字段以包含字母  b  开头,且  b  后面至少出现一次字母  a  的记录。SQL  语句如下:

mysql> SELECT *  FROM  fruits
    -> WHERE  f_name  REGEXP  '^ba+';
+------+------+--------+---------+
| f_id | s_id | f_name | f_price |
+------+------+--------+---------+
| t1   |  102 | banana |   10.30 |
+------+------+--------+---------+


5.  匹配指定字符串

    正则表达式可以匹配指定字符串,只要这个字符串在查询文本中即可,如要匹配多个字符串,多个字符串之间 使用分隔符“|”隔开。

    【例】在  fruits  表中,查询  f_name  字段值中包含字符串  on 的记录。SQL  语句如下:

mysql> SELECT *  FROM  fruits
    -> WHERE  f_name  REGEXP  'on';
+------+------+---------+---------+
| f_id | s_id | f_name  | f_price |
+------+------+---------+---------+
| bs2  |  105 | melon   |    8.20 |
| l2   |  104 | lemon   |    6.40 |
| o2   |  103 | coconut |    9.20 |
+------+------+---------+---------+

【例】在  fruits  表中,查询  f_name  字段值中包含字符串  on  或者  ap 的记录。SQL  语句如下:

mysql> SELECT *  FROM  fruits
    -> WHERE  f_name  REGEXP  'on|ap';
+------+------+---------+---------+
| f_id | s_id | f_name  | f_price |
+------+------+---------+---------+
| a1   |  101 | apple   |    5.20 |
| a2   |  103 | apricot |    2.20 |
| bs2  |  105 | melon   |    8.20 |
| l2   |  104 | lemon   |    6.40 |
| o2   |  103 | coconut |    9.20 |
| t2   |  102 | grape   |    5.30 |
+------+------+---------+---------+



++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

【注】区分  LIKE  运算符

  LIKE 运算符用来匹配字符串,语法格式为“expr LIKE 匹配条件”。如果 expr 满足匹配条件,则返回值为 1(TRUE); 如果不匹配,则返回值为 0(FALSE)。 若 expr 或匹配条件中任何一个为 NULL,则结果为NULL。
    LIKE 运算符在进行匹配运算时,可以使用下面两种通配符。
    (1) %:  匹配任意数目的字符,甚至包括零字符。
    (2)  _:  只能匹配一个字符。

【例】使用运算符 LIKE 进行字符串匹配运算,SQL语句如下:

[java]  view plain  copy
  1. mysql> select  'stud'  LIKE  'stud','stud'  LIKE  'stu_',  'stud'  LIKE  '%d',  'stud'  LIKE  't___','s'  LIKE  NULL;  
  2. +----------------------+----------------------+--------------------+----------------------+-----------------+  
  3. 'stud'  LIKE  'stud' | 'stud'  LIKE  'stu_' | 'stud'  LIKE  '%d' | 'stud'  LIKE  't___' | 's'  LIKE  NULL |  
  4. +----------------------+----------------------+--------------------+----------------------+-----------------+  
  5. |                    1 |                    1 |                  1 |                    0 |            NULL |  
  6. +----------------------+----------------------+--------------------+----------------------+-----------------+  

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++



    LIKE 运算符也可以匹配指定的字符串,但与  REGEXP 不同,LIKE 匹配的字符串如果在文本中间出现,则找不到它,相应的行也不会返回,而  REGEXP  可以在文本内进行匹配,如果被匹配的字符串在文本中出现,REGEXP  将会找到它,相应的行也会被返回。

 【例】在  fruits  表中,使用  LIKE  运算符查询  f_name  字段值为 on 的记录。SQL  语句如下:

mysql> SELECT *  FROM  fruits
    -> WHERE  f_name  LIKE  'on';
Empty set (0.00 sec)

6.  匹配指定字符中的任意一个

    方括号([])可以指定一个字符集合,只要匹配其中的任何一个字符,即为所查找的文本。

【例】在  fruits  表中,查询  f_name  字段值中包含字母  o 或者 t 的记录。SQL  语句如下:

mysql> SELECT *  FROM  fruits
    -> WHERE  f_name  REGEXP  '[ot]';
+------+------+---------+---------+
| f_id | s_id | f_name  | f_price |
+------+------+---------+---------+
| a2   |  103 | apricot |    2.20 |
| bs1  |  102 | orange  |   11.20 |
| bs2  |  105 | melon   |    8.20 |
| l2   |  104 | lemon   |    6.40 |
| m1   |  106 | mango   |   15.60 |
| m3   |  105 | xxtt    |   11.60 |
| o2   |  103 | coconut |    9.20 |
+------+------+---------+---------+


7.  匹配指定字符以外的字节

    [^字符集合]可以匹配不在指定集合中的任何字符。

    【例】在  fruits  表中,查询  f_id  字段值中包含字母  a~e  和数字  1~2 以外的字符的记录。SQL  语句如下:

mysql> SELECT *  FROM  fruits
    -> WHERE  f_id  REGEXP  '[^a-e1-2]';
+------+------+---------+---------+
| f_id | s_id | f_name  | f_price |
+------+------+---------+---------+
| b5   |  107 | xxxx    |    3.60 |
| bs1  |  102 | orange  |   11.20 |
| bs2  |  105 | melon   |    8.20 |
| c0   |  101 | cherry  |    3.20 |
| l2   |  104 | lemon   |    6.40 |
| m1   |  106 | mango   |   15.60 |
| m2   |  105 | xbabay  |    2.60 |
| m3   |  105 | xxtt    |   11.60 |
| o2   |  103 | coconut |    9.20 |
| t1   |  102 | banana  |   10.30 |
| t2   |  102 | grape   |    5.30 |
| t4   |  107 | xbababa |    3.60 |
+------+------+---------+---------+


8.  指定字符串连续出现的次数

  “字符串{n,}“  表示匹配前面的字符串至少n次;“字符串{n,m}”表示匹配前面的字符串至少n次,至多m次。

    【例】在  fruits  表中,查询  f_name  字段值至少出现两次字母‘x’ 的记录。SQL  语句如下:

mysql> SELECT *  FROM  fruits
    -> WHERE  f_name  REGEXP  'x{2,}';
+------+------+--------+---------+
| f_id | s_id | f_name | f_price |
+------+------+--------+---------+
| b5   |  107 | xxxx   |    3.60 |
| m3   |  105 | xxtt   |   11.60 |
+------+------+--------+---------+
【例】在  fruits  表中,查询  f_name  字段值至少出现一次、最多出现3次  ba  字符串的记录。SQL  语句如下:
mysql> SELECT *  FROM  fruits
    -> WHERE  f_name  REGEXP  'ba{1,3}';
+------+------+---------+---------+
| f_id | s_id | f_name  | f_price |
+------+------+---------+---------+
| m2   |  105 | xbabay  |    2.60 |
| t1   |  102 | banana  |   10.30 |
| t4   |  107 | xbababa |    3.60 |
+------+------+---------+---------+


猜你喜欢

转载自blog.csdn.net/qq_41573234/article/details/80293565