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制表 \纵向制表