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

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

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


正则表达式常用的字符匹配列表
选项说明例子匹配值示例
^匹配文本的开始字符^bbook,big,banana
$匹配文本结束字符st$test,resist
.匹配任何单个字符b.tbit,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  或者  zdizzy,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 |
+------+------+---------+---------+


【注】参考于清华大学出版社《MySQL数据库应用案例课堂》2016年1月第1版

MySQL中,使用正则表达式进行完全匹配需要注意几点。首先,正则表达式中的特殊字符需要用反斜线进行转义。例如,如果要匹配一个包含特殊字符的字符串,需要在该字符前面加上两个反斜线。例如,要匹配字符串"1 2"中的空格,可以使用正则表达式"1\\ 2"。其次,圆括号在正则表达式中被视为元字符,如果要使用其字面值,需要进行转义。例如,要匹配一个左括号或右括号,可以使用正则表达式"\\("或"\\)"。最后,MySQL正则表达式函数是REGEXP_LIKE。通过使用该函数,可以在查询中进行正则表达式的完全匹配。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MySQL数据库——MySQL REGEXP:正则表达式](https://blog.csdn.net/Itmastergo/article/details/130399940)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [MySQL 正则表达式函数大全](https://blog.csdn.net/horses/article/details/116795888)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值