zoukankan      html  css  js  c++  java
  • MySQL SQL模式匹配

    MySQL提供标准的SQL模式匹配,SQL模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零字符)。。

    关于SQL模式匹配:http://dev.mysql.com/doc/refman/5.1/zh/tutorial.html#pattern-matching

    1.MySQL仅仅支持多数正则表达式实现的一个很小的子集。

    2.SQL模式匹配允许你使用“_”匹配任何单个字符,而“%”匹配任意数目字符(包括零字符)。;而REGEXP使用扩展正则表达式匹配列值的子串,如果被匹配的文本在列值中出现,REGEXP将会找到它,相应的行将被返回。

    注意使用SQL模式时,不能使用=或!=;而应使用LIKE或NOT LIKE比较操作符。

    看下面的例子:

    mysql> select * from tb;

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

    | id | Name       | Age |

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

    |  1 | changename |  20 |

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

    1 row in set (0.02 sec)

    要想找出正好包含5个字符的名字,使用“_”模式字符:

    mysql> select * from tb where name like '_____';

    Empty set (0.61 sec)

    包含10个字符时,找出了匹配结果。

    mysql> select * from tb where name like '__________';

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

    | id | Name       | Age |

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

    |  1 | changename |  20 |

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

    1 row in set (0.00 sec)

    mysql> select name from tb where name regexp 'cha';

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

    | name       |

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

    | changename |

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

    1 row in set (0.06 sec)

    mysql> select name from tb where name regexp 'chad';

    Empty set (0.00 sec)

    扩展正则表达式的一些字符是:

    ·         ‘.’匹配任何单个的字符。

    ·         字符类“[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”、“b”或“c”。为了命名字符的范围,使用一个“-”。“[a-z]”匹配任何字母,而“[0-9]”匹配任何数字。

    ·         “ * ”匹配零个或多个在它前面的字符。例如,“x*”匹配任何数量的“x”字符,“[0-9]*”匹配任何数量的数字,而“.*”匹配任何数量的任何字符。

        •  如果REGEXP模式与被测试值的任何地方匹配,模式就匹配(这不同于LIKE模式匹配,只有与整个值匹配,模式才匹配)。

        •  为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”。

    3.默认MySQL中的正则表达式匹配不区分大小写,可使用BINARY关键字区分大小写,如

    mysql> select name from tb where name regexp binary'cha';

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

    | name       |

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

    | changename |

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

    1 row in set (0.08 sec)

    mysql> select name from tb  where name regexp binary'Cha';

    Empty set (0.00 sec)

    4、进行OR匹配:为搜索两个串之一,使用|,如下所示:

    mysql> select name from tb where name regexp 'c|a';

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

    | name       |

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

    | changename |

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

    1 row in set (0.02 sec)

    5、匹配几个字符之一:

    匹配任何单一字符。如下所示:

    mysql> select name from tb where name regexp '[ca]';

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

    | name       |

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

    | changename |

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

    1 row in set (0.02 sec)

    正如所见,[]是另一种形式的OR语句。'[ca]'与’c|a’是等价的。

    匹配除给定字符外的字符:

     mysql> select name from tb where name regexp '^[ca]';

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

    | name       |

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

    | changename |

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

    1 row in set (0.00 sec)

    6、可使用-来定义一个范围。如[1-9],[a-b]。

    mysql> select name from tb where name regexp '[a-c]';

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

    | name       |

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

    | changename |

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

    1 row in set (0.00 sec)

    mysql> select name from tb where name regexp '[w-z]';

    Empty set (0.00 sec)

    7、为了匹配特殊字符,必须用\为前导,例如\-,\.等。这种处理即转义(escaping)。

    多数正则表达式实现使用单个反斜杠转义特殊字符,但MYSQL要求两个(MYSQL自己解释一个,正则表达式库解释另一个)。

    \也用来引用元字符(具有特殊含义的字符),如下表:

    8、为了更方便工作,可以使用预定义的字符集,称为字符类(character class)。

    mysql> select name from tb where name regexp '[[:alpha:]]';

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

    | name       |

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

    | changename |

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

    1 row in set (0.00 sec)

     

    9、使用正则表达式重复元字符匹配多个实例:

    mysql> select name from tb where name regexp 'c{1}';

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

    | name       |

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

    | changename |

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

    1 row in set (0.00 sec)

    mysql> select name from tb where name regexp 'c{2}';

    Empty set (0.00 sec)

    10、定位符(为了匹配特定位置的文本):

     mysql> select name from tb where name regexp 'e$';

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

    | name       |

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

    | changename |

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

    1 row in set (0.00 sec)

    mysql> select name from tb where name regexp 'a$';

    Empty set (0.00 sec)



     

    11、使REGEXP起类似LIKE的作用,它们的区别在于LIKE匹配整个串而REGEXP匹配子串。利用定位符,通过用^开始每个表达式,用$结束每个表达式。

    12、简单的正则表达式测试:可以在不使用数据库表的情况下用SELECT来测试正则表达式。REGEXP检查总是返回0或1(匹配)。

    [sql] 

    mysql> select 'hello' REGEXP'[0-9]';  

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

    | 'hello' REGEXP '[0-9]' |  

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

    |                      0 |  

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

    1 row in set (0.00 sec)  

    本文基于 <使用正则表达式搜索>整理形成。

    官方文档:Mysql正则表达式:http://dev.mysql.com/doc/refman/5.1/zh/regexp.html

  • 相关阅读:
    Linux内核设计第三周学习总结 跟踪分析Linux内核的启动过程
    Linux内核设计第二周学习总结 完成一个简单的时间片轮转多道程序内核代码
    Linux内核设计第一周学习总结 计算机如何工作
    信息安全系统设计基础期末总结
    信息安全系统设计基础第十四周学习总结
    信息安全系统设计基础第十三周学习总结
    20135310陈巧然 20135305姚歌 实验四:外设驱动程序设计
    linux内核设计与实现一书阅读整理 之第一二章整合
    20135239 益西拉姆 linux内核分析 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
    20135239 益西拉姆 linux内核分析 跟踪分析Linux内核的启动过程
  • 原文地址:https://www.cnblogs.com/jevo/p/3272850.html
Copyright © 2011-2022 走看看