模糊查询即模糊检索,是指搜索系统自动按照用户输入关键词的同义词进行模糊检索,从而得出较多的检索结果。与之相反的是“精准搜索”。模糊检索也可以说是同义词检索,这里的同义词是用户通过“检索管理”中的“同义词典”来配置的。
用户在检索页面中输入同义词中任何一个词检索时,只要选中“模糊检索”复选框,则该关键词的所有同义词信息也都被检索出来。
举例:例如配置了“电脑”与“computer”为同义词后,检索“电脑”,则包含“computer”的网页也会出现在检索结果中。
一、模糊查询概述
1.1、什么是模糊查询
模糊查询是针对字符串操作的,类似正则表达式,没有正则表达式强大。
1.2、通配符
代码语言:javascript复制%:表示任意0个或多个字符。
_: 表示任意单个字符。
[ ]:表示括号内所列字符中的一个(类似正则表达式)。
[^ ] :表示不在括号所列之内的单个字符。
1.3、回顾%和_
1.3.1、%应用
可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示。
代码语言:javascript复制格式:
select */字段列表 from 数据库表名 where 字段名 like %字符串%;
案例:
查询出学生信息表中姓名里有‘三’的学生信息
代码语言:javascript复制mysql> select * from students where sname like '%三%';
------ -------- ------ ------ --------- ------ ------------ -----------------
| sid | sname | sex | age | english | math | entertime | remark |
------ -------- ------ ------ --------- ------ ------------ -----------------
| 1 | 张三 | 男 | 19 | 98.5 | 88.0 | 2017-09-01 | 他来自四川 |
| 5 | 李三 | 男 | 19 | 60.0 | 88.0 | 2017-09-01 | 他来自湖北 |
------ -------- ------ ------ --------- ------ ------------ -----------------
2 行于数据集 (0.02 秒)
1.3.2、_应用
匹配单个任意字符,它常用来限制表达式的字符长度语句。
代码语言:javascript复制格式:
select */字段列表 from 数据库表名 where 字段名 like _字符串_;
案例:
查询学生信息表中姓名里含有‘红’字,二个字的学生信息
代码语言:javascript复制mysql> select * from students where sname like '_红' or sname like '红_';
------ -------- ------ ------ --------- ------ ------------ -----------------
| sid | sname | sex | age | english | math | entertime | remark |
------ -------- ------ ------ --------- ------ ------------ -----------------
| 3 | 张红 | 女 | 19 | 86.0 | 80.0 | 2017-09-01 | 他来自北京 |
| 7 | 刘红 | 女 | 18 | 90.0 | 98.0 | 2017-09-01 | 他来自甘肃 |
------ -------- ------ ------ --------- ------ ------------ -----------------
2 行于数据集 (0.01 秒)
二、模糊查询应用
2.1、[ ]应用
指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。
代码语言:javascript复制格式:
select */字段列表 from 数据库表名 where 字段名 regexp [字符串]字符串;
案例:
查询学生信息表中姓名里有张和李的人的信息
代码语言:javascript复制mysql> select * from students where sname regexp '[张李]';
------ ----------- ------ ------ --------- ------ ------------ -----------------
| sid | sname | sex | age | english | math | entertime | remark |
------ ----------- ------ ------ --------- ------ ------------ -----------------
| 1 | 张三 | 男 | 19 | 98.5 | 88.0 | 2017-09-01 | 他来自四川 |
| 2 | 李四 | 男 | 20 | 80.0 | 88.0 | 2017-09-01 | 他来自重庆 |
| 3 | 张红 | 女 | 19 | 86.0 | 80.0 | 2017-09-01 | 他来自北京 |
| 4 | 张八 | 男 | 18 | 80.0 | 85.0 | 2017-09-01 | 他来自天津 |
| 5 | 三李 | 男 | 19 | 60.0 | 88.0 | 2017-09-01 | 他来自湖北 |
| 9 | 李老六 | 男 | 19 | NULL | NULL | NULL | NULL |
------ ----------- ------ ------ --------- ------ ------------ -----------------
6 行于数据集 (0.02 秒)
查询学生信息表中姓名为张红和李红的人的信息
代码语言:javascript复制#[张李]红 张红 李红
mysql> select * from students where sname regexp '[张李]红';
------ -------- ------ ------ --------- ------ ------------ -----------------
| sid | sname | sex | age | english | math | entertime | remark |
------ -------- ------ ------ --------- ------ ------------ -----------------
| 3 | 张红 | 女 | 19 | 86.0 | 80.0 | 2017-09-01 | 他来自北京 |
------ -------- ------ ------ --------- ------ ------------ -----------------
1 行于数据集 (0.01 秒)
查询学生信息表中年龄包含789这几个数字的人的信息
代码语言:javascript复制mysql> select * from students where age regexp '[789]';
------ ----------- ------ ------ --------- ------ ------------ -----------------
| sid | sname | sex | age | english | math | entertime | remark |
------ ----------- ------ ------ --------- ------ ------------ -----------------
| 1 | 张三 | 男 | 19 | 98.5 | 88.0 | 2017-09-01 | 他来自四川 |
| 3 | 张红 | 女 | 19 | 86.0 | 80.0 | 2017-09-01 | 他来自北京 |
| 4 | 张八 | 男 | 18 | 80.0 | 85.0 | 2017-09-01 | 他来自天津 |
| 5 | 三李 | 男 | 19 | 60.0 | 88.0 | 2017-09-01 | 他来自湖北 |
| 7 | 刘红 | 女 | 18 | 90.0 | 98.0 | 2017-09-01 | 他来自甘肃 |
| 9 | 李老六 | 男 | 19 | NULL | NULL | NULL | NULL |
------ ----------- ------ ------ --------- ------ ------------ -----------------
6 行于数据集 (0.01 秒)
注意:
如 [ ] 内有一系列字符(01234、abcde之类的)则可略写为“0-4”、“a-e”
2.2、[^]应用
其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
代码语言:javascript复制格式:
select */字段列表 from 数据库表名 where 字段名 regexp [^字符串]字符串;
案例:
查询学生信息表中姓名不是张红、李红,而是其他红的人的信息。
代码语言:javascript复制mysql> select * from students where sname regexp '[^张李]红';
------ -------- ------ ------ --------- ------ ------------ -----------------
| sid | sname | sex | age | english | math | entertime | remark |
------ -------- ------ ------ --------- ------ ------------ -----------------
| 7 | 刘红 | 女 | 18 | 90.0 | 98.0 | 2017-09-01 | 他来自甘肃 |
------ -------- ------ ------ --------- ------ ------------ -----------------
1 行于数据集 (0.01 秒)
查询学生信息表中年龄不包含7891这几个数字的人的信息
代码语言:javascript复制mysql> select * from students where age regexp '[^7891]';
------ -------- ------ ------ --------- ------ ------------ -----------------
| sid | sname | sex | age | english | math | entertime | remark |
------ -------- ------ ------ --------- ------ ------------ -----------------
| 2 | 李四 | 男 | 20 | 80.0 | 88.0 | 2017-09-01 | 他来自重庆 |
| 6 | 王六 | 女 | 20 | 50.0 | 70.0 | 2017-09-01 | 他来自湖南 |
------ -------- ------ ------ --------- ------ ------------ -----------------
2 行于数据集 (0.01 秒)
查询学生信息表中姓张和姓李的人的信息
代码语言:javascript复制mysql> select * from students where sname regexp '^[张李]';
------ ----------- ------ ------ --------- ------ ------------ -----------------
| sid | sname | sex | age | english | math | entertime | remark |
------ ----------- ------ ------ --------- ------ ------------ -----------------
| 1 | 张三 | 男 | 19 | 98.5 | 88.0 | 2017-09-01 | 他来自四川 |
| 2 | 李四 | 男 | 20 | 80.0 | 88.0 | 2017-09-01 | 他来自重庆 |
| 3 | 张红 | 女 | 19 | 86.0 | 80.0 | 2017-09-01 | 他来自北京 |
| 4 | 张八 | 男 | 18 | 80.0 | 85.0 | 2017-09-01 | 他来自天津 |
| 9 | 李老六 | 男 | 19 | NULL | NULL | NULL | NULL |
------ ----------- ------ ------ --------- ------ ------------ -----------------
5 行于数据集 (0.01 秒)
注意:
代码语言:javascript复制 ^[]表示的是:字符串开始的第一个字符