mysql中LIKE和REGEXP

mysql中LIKE和REGEXP都可以用来字符匹配

正则表达式REGEXP是为复杂搜索指定模式的强大方式。

  • like用法

 

LIKE一般与通配符(%)和(_)两个使用

如例

SELECT prod_id,prod_name
FROM products
WHERE prod_name LIKE ' %on_';

其中%可以匹配任意长度任意字符,也可长度为0,即没有字符

其中_只能匹配长度为一的单一字符,若原代码中为'%on__' 即可以匹配长度为二的任意字符

若要匹配字符串中有%和_的字符串,则需要用到关键字escape:

使用escape,转义字符后面的%或_就不作为通配符了,注意前面没有转义字符的%和_仍然起通配符作用

如例

SELECT  s_name,s_address
FROM students
WHERE s_name LIKE '%TOM/_%' ESCAPE '/';   

其中字符‘/’为转义字符,可以将其后面的一个通配符失效,变成被匹配的字符。  

例中即匹配名字中含‘TOM_’ 的学生数据。

  • REGEXP用法

REGEXP语法位置与LIKE相同

如例

SELECT prod_name 
FROM products
WHERE prod_name REGEXP '1000';

此段代码即可匹配到prod_name中所有含有1000的行。

LIKE和REGEXP一个重大区别就是:LIKE匹配整个列,而REGEXP在列值内进行匹配。

如果匹配的文本在列值中出现,LIKE将不会检索出结果。

所以在上例中REGEXP可以匹配到列种含有1000的行,若用LIKE语句则要写成 LIKE ‘%1000%’


REGEXP中的.:

表示匹配任一单一字符

SELECT prod_name
FROM products
WHERE pro_price REGEXP '.000'
ORDER BY prod_name;

上例可以将商品价格为几千的商品名列出

regexp中的OR: |

可以搜索多个串之一

SELECT prod_name 
FROM products
WHERE prod_name REGEXP '1000|2000'
ORDER BY prod_name;

上例中即匹配字符1000或2000

REGEXP中的[] :

匹配[]符号中几个字符之一

SELECT prod_name 
FROM products
WHERE prod_weight REGEXP '[123]KG'
ORDER BY prod_name;

上例中即可匹字符1KG,2KG,3KG

可以用[1-5],[a-d]来表示范围

其中可以用^符号否定来表示匹配除这些字符以外的所有字符,如:[^123] 匹配除了字符1,2,3外的所有字符

[]还可以匹配字符类:

[:alnum:] 任意字母和数字(同[a-zA-Z0-9)

[:alpha:] 任意字母 (同[a-zA-Z])

[:blank:] 空格和制表(同[\t])

[:cntrl:] ASCII控制字符(ascll 0到37和127)

[:digit:] 任意数字 (同[0-9])

[:graph:] 与[:print:]相同,但不包括空格

[:lower:] 任意小写字母

[:print:] 任意可打印字符

[:punct:] 即不在[:alnum:]也不在[:cntrl:]的字符

[:space:] 包括空格在内的任意空白字符(同[\f\n\r\t\v])

[:upper:] 任意大写字母

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

 

REGEXP中的转义字符 \  :

\可以使下一个特殊字符失效,如(\.  \-  \  \[  \])

SELECT vned_name
FROM vendors
WHERE vend_name REGEXP '\.'
ORDER BY vend_name;

上例匹配字符.

\也可用来引用元字符:

\f  换页  \n  换行  \r回车  \t制表  \纵向制表

原文地址:https://www.cnblogs.com/Jacck/p/5580662.html