模糊查询最简单的方法
在MySQL中我们可以使用LIKE或者NOT LIKE操作符进行比较。在MySQL中模式默认是不区分大小写的。
查询示例,student表
+--------+---------+-------+-----------------+---------+
| studid | name | marks | address | phone |
+--------+---------+-------+-----------------+---------+
mysql> select * from student where name like 'm%';
列出在表student中所有以字母M开头的学生名字。
mysql> select * from student where name like '%e';
列出所有以字母e结尾的学生名字。
代码如下 | 复制代码 |
mysql> select * from student where name like '%a%'; |
列出在任何地方包含任何特定字母的学生名字。以下的查询示例将列出包含"a"字母的学生名字。
代码如下 | 复制代码 |
mysql> select * from student where name like '_____'; |
假如我们要查找的名字包括5个字母,我们就可以使用特殊的字母"_"(下划线)。将列好在表student中包括5个字母学生的名字。
正则匹配查询:
由MySQL提供的模式匹配的其他类型是使用扩展正则表达式。当你对这类模式进行匹配测试时,使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词)。
扩展正则表达式的一些字符是:
“.” 匹配任何单个的字符。
一个字符类“[...]”匹配在方括号内的任何字符。例如,“[abc]”匹配“a”、“b”或“c”。为了命名字符的一个范围,使用一个“-”。“[a-z]”匹配任何小写字母,而“[0-9]”匹配任何数字。
“ * ”匹配零个或多个在它前面的东西。例如,“x*”匹配任何数量的“x”字符,“[0-9]*”匹配的任何数量的数字,而“.*”匹配任何数量的任何东西。
正则表达式是区分大小写的,但是如果你希望,你能使用一个字符类匹配两种写法。例如,“[aA]”匹配小写或大写的“a”而“[a-zA-Z]”匹配两种写法的任何字母。
如果它出现在被测试值的任何地方,模式就匹配(只要他们匹配整个值,SQL模式匹配)。
为了定位一个模式以便它必须匹配被测试值的开始或结尾,在模式开始处使用“^”或在模式的结尾用“$”。
为了说明扩展正则表达式如何工作,上面所示的LIKE查询在下面使用REGEXP重写:
为了找出以“b”开头的名字,使用“^”匹配名字的开始并且“[bB]”匹配小写或大写的“b”:
代码如下 | 复制代码 |
mysql> SELECT * FROM pet WHERE name REGEXP “^[bB]“; +——–+——–+———+——+————+————+ | name | owner | species | sex | birth | death | +——–+——–+———+——+————+————+ | Buffy | Harold | dog | f | 1989-05-13 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | +——–+——–+———+——+————+————+ |
为了找出以“fy”结尾的名字,使用“$”匹配名字的结尾:
代码如下 | 复制代码 |
mysql> SELECT * FROM pet WHERE name REGEXP “fy$”; +——–+——–+———+——+————+——-+ | name | owner | species | sex | birth | death | +——–+——–+———+——+————+——-+ | Fluffy | Harold | cat | f | 1993-02-04 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +——–+——–+———+——+————+——-+ |
为了找出包含一个“w”的名字,使用“[wW]”匹配小写或大写的“w”:
代码如下 | 复制代码 |
mysql> SELECT * FROM pet WHERE name REGEXP “[wW]“; +———-+——-+———+——+————+————+ | name | owner | species | sex | birth | death | +———-+——-+———+——+————+————+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Bowser | Diane | dog | m | 1989-08-31 | 1995-07-29 | | Whistler | Gwen | bird | NULL | 1997-12-09 | NULL | +———-+——-+———+——+————+————+ |
既然如果一个正规表达式出现在值的任何地方,其模式匹配了,就不必再先前的查询中在模式的两方面放置一个通配符以使得它匹配整个值,就像如果你使用了一个SQL模式那样。
为了找出包含正好5个字符的名字,使用“^”和“$”匹配名字的开始和结尾,和5个“.”实例在两者之间:
代码如下 | 复制代码 |
mysql> SELECT * FROM pet WHERE name REGEXP “^…..$”; +——-+——–+———+——+————+——-+ | name | owner | species | sex | birth | death | +——-+——–+———+——+————+——-+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +——-+——–+———+——+————+——-+ |
你也可以使用“{n}”“重复n次”操作符重写先前的查询:
代码如下 | 复制代码 |
mysql> SELECT * FROM pet WHERE name REGEXP “^.{5}$”; +——-+——–+———+——+————+——-+ | name | owner | species | sex | birth | death | +——-+——–+———+——+————+——-+ | Claws | Gwen | cat | m | 1994-03-17 | NULL | | Buffy | Harold | dog | f | 1989-05-13 | NULL | +——-+——–+———+——+————+——-+ |
如果你使用中文我们可以利用mysql分词插件来实现模糊查询了
一、来源
Mysql全文检索的解析器缺省是按空格切分的,不能直接支持全文检索中文。从5.1版本开始,Mysql全文检索的解析器以插件的方式提供。猎兔提供符合Mysql插件格式的中文分词模块。
二、环境与安装
首先下载Mysql5.1版本。然后在gb2312或gbk的环境下启动Mysql服务。
代码如下 | 复制代码 |
# cd /usr/local/mysql/bin # ./mysqld-max --user=mysql --default-character-set=gbk |
把seg.so拷贝到插件指定的路径,缺省是 /usr/local/mysql/lib/mysql
代码如下 | 复制代码 |
# cp ./seg.so /usr/local/mysql/lib/mysql/seg.so |
把词典拷贝到Mysql的Data路径下的Dic子目录,缺省是 /usr/local/mysql/data/Dic/
进入Mysql:
代码如下 | 复制代码 |
# mysql --default-character-set=gbk 安装插件: mysql>INSTALL PLUGIN cn_parser SONAME 'seg.so'; |
三、使用中文分词插件
创建表:
代码如下 | 复制代码 |
mysql>CREATE TABLE t (c VARCHAR(255), FULLTEXT (c) WITH PARSER cn_parser) default charset gbk; mysql>INSERT INTO t VALUES ('测试中文'); mysql>INSERT INTO t VALUES ('老师说明天开会'); mysql> INSERT INTO t VALUES ('购买手机'); 查询: |
mysql> SELECT MATCH(c) AGAINST('说明'),c FROM t;
代码如下 | 复制代码 |
+-----------------------------------+-----------------------+ | MATCH(c) AGAINST('说明') | c | +-----------------------------------+-----------------------+ | 0 | 测试中文 | | 0 | 老师说明天开会 | | 0 | 购买手机 | +-----------------------------------+-----------------------+ 3 rows in set (0.00 sec)
mysql> SELECT MATCH(c) AGAINST('说'), c FROM t; +--------------------------------+-----------------------+ | MATCH(c) AGAINST('说') | c | +--------------------------------+-----------------------+ | 0 | 测试中文 | | 0.58370667695999 | 老师说明天开会 | | 0 | 购买手机 | +--------------------------------+-----------------------+ 3 rows in set (0.00 sec) |