MySQL 基础——使用通配符进行搜索过滤

来源:互联网 发布:触发器sqlserver 编辑:程序博客网 时间:2024/06/03 13:33

和上面的 in and or not between 等操作符相比,操作符都是针对已知的值或范围,而过滤符号范围更广。
通配符过滤
使用通配符,必须使用 like 操作符
作用:广泛匹配(in 精确匹配,where 范围匹配,like 广泛匹配)
格式:select 列 from  表名 where 列 like 匹配内容

%    任何字符,出现任意次数(包括0次),不能匹配 NULL
'ABC%'  所有 ABC 开头的字符串
'%ABC'  所有 ABC 结尾的字符串
'%LY%'  所有包含 LY 的字符串     

> select * from tb1 where name like '%da%';
匹配内容里面的数字,没有大小写之分,da 和 Da 和 DA 匹配出来的结果一致。
    
_    下划线,任意一个字符,不能匹配 NULL ,不能匹配 0 个字符
'A_Z'   所有A开头,Z结尾,中间只有一个字符的数据,如 AkZ A1Z,
'a__z'  所有 A 开头,z 结尾,中间有两个字符的数据


使用通配符建议
使用通配符搜索,所花费的时间和系统资源相比其他搜索方式更高。
  1. 不用过度使用,在其他方式能达到相同目的的时候,不要使用通配符。
  2. 除非确实需要,而且绝对必要,否则不要把通配符放在搜索单词的开头
  3. 注意通配符的位置以及和 NULL 以及 0 字符的关系。


如果单词后面有空格,可能会干扰 % 匹配,apple    单词后面有 4 个空格,%apple 匹配不到。                                                                                                             




MySQL 正则表达式的脱意字符是两个反斜线,MySQL 自己解释一个,正则表达式库解释一个,shell 语言里面是一个反斜线。

regexp 匹配字符串,like 匹配整行,例如有一行内容为 'ge bi lao wang', regexp 'ge' 会匹配出该行,而 like 'ge' 并不会匹配。
正则表达式进行搜索
正则表达式用来匹配文本的任意位置的特殊字符串。

REGEXP '内容'    REGEXP 必须放在正则匹配内容的前面

.    表示任意一个字符(实际测试,能匹配多个字符)
> select * from tb1 where name regexp 'wang.';

binary    不区分大小写匹配
> select * from tb1 where name regexp binary 'wangdaye';

管道符 |   进行 OR 匹配
> select * from tb1 where name regexp 'wangdaye|wangbin';
> select * from tb1 where name regexp binary 'wangdaye|WANGdaye';
    or 可以匹配多个条件,A|B|C

中括号 [ .. ]  匹配多个字符
[123]    单次匹配 1 2 3 
[a-z]    单次匹配 a 到 z 的任意一个字母
[0-9]    单次匹配 0 到 9 的任意一个数字
> select prod_name prod_price from prodlist where prod_name regexp '[123] ton';
匹配 1 ton ; 2 ton; 3 to

     脱意符号  \\    用来找特殊字符
\\f    换页
\\n    换行
\\r    回车
\\t    制表
\\v    纵向制表
\\\    匹配反斜杠
> select prod_name prod_price from prodlist where prod_name regexp '\\.';
匹配包含字符 . 的商品名字

预定义字符表,MySQL 内置的通配符内容
无需多记忆这些东西,了解即可
[:digit:]    任意数字,同[0-9]
[:alpha:]    任意字符,同 [a-zA-Z]
[:alnum:]    任意字母和数字,同 [a-zA-Z0-9]
[:blank:]    空格和制表,同 [\\t]
[:cntrl:]    ASCII 控制字符
[:lower:]    任意小写字母,同[a-z]
[:print:]    任意可打印字符,包括空格
[:graph:]    同 print,但是不包括空格
[:punct:]    既不在 alnum 也不再 cntrl 的任意字符
[:space:]    包括空格在内的任意空白字符,同[\\f\\n\\r\\t\\v]
[:upper:]    任意大写字母,同 [A-Z]
[:xdigti:]   任意十六进制数字,同 [a-fA-F0-9]

多重匹配
*      0个或多个匹配
+      1个或多个匹配,等于 {1,}
?      0个或1个匹配,等于 {0,1}
{n}    指定数目的匹配
{n,}   不少于指定数目的匹配
{n,m}  匹配数目的范围,m 不超过 255
> select prodname prodprice from prodlist where prodname regexp '\\([0-9] sticks?\\)';
\\(匹配\\)    脱意符号 \\ 用来脱意小括号
[0-9]    匹配任意0-9的数字一次

> select prodname prodprice from prodlist where prodname regexp '[0-9]{4}';
> select prodname prodprice from prodlist where prodname regexp '[0-9][0-9][0-9]0-9]';
匹配连续四个数字的行


定位符
^          文本开始
$          文本结束
[[:<:]]    词的开始
[[:>:]]    词的结尾
> select * from tb1 where name regexp binary '^[wWg]';
> select prodname from prodlist where prodname regexp '[0-9\\.]; 
匹配以 0 到 9 或者小数点 . 开头的数据

                                                                                                             


阅读全文
0 0
原创粉丝点击