mysql中模糊匹配查询与正则匹配

模糊查询最简单的方法

在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)

时间: 2024-11-08 19:20:10

mysql中模糊匹配查询与正则匹配的相关文章

mysql中模糊查询的四种用法介绍_Mysql

下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] WHERE u_name LIKE '%三%' 将会把u_name为"张三","张猫三"."三脚猫","唐三藏"等等有"三"的记录全找出来. 另外,如果需要找出u_name中既有"三"又有

mysql中模糊查询的四种用法介绍

下面介绍mysql中模糊查询的四种用法: 1,%:表示任意0个或多个字符.可匹配任意类型和长度的字符,有些情况下若是中文,请使用两个百分号(%%)表示. 比如 SELECT * FROM [user] WHERE u_name LIKE '%三%' 将会把u_name为"张三","张猫三"."三脚猫","唐三藏"等等有"三"的记录全找出来. 另外,如果需要找出u_name中既有"三"又有

mysql中关于分页查询的输出问题!

问题描述 mysql中关于分页查询的输出问题! String sql = ""select * from emp order by empno limit ??"";prepareStatement stmt = con.prepareStatement(sql); stmt.setInt(1 begin); stmt.setInt(2 end); ResultSet rs = stmt.executeQuery(); while (rs.next()) { Sys

MySQL中IN子查询会导致无法使用索引

原文:MySQL中IN子查询会导致无法使用索引   今天看到一个博客园的一篇关于MySQL的IN子查询优化的案例,一开始感觉有点半信半疑(如果是换做在SQL Server中,这种情况是绝对不可能的,后面会做一个简单的测试.)随后动手按照他说的做了一个表来测试验证,发现MySQL的IN子查询做的不好,确实会导致无法使用索引的情况(IN子查询无法使用所以,场景是MySQL,截止的版本是5.7.18) MySQL的测试环境 测试表如下 create table test_table2 ( id int

MySQL中对表连接查询的简单优化教程_Mysql

在MySQL中,A LEFT JOIN B join_condition执行过程如下: · 根据表A和A依赖的所有表设置表B. · 根据LEFT JOIN条件中使用的所有表(除了B)设置表A. · LEFT JOIN条件用于确定如何从表B搜索行.(换句话说,不使用WHERE子句中的任何条件). · 可以对所有标准联接进行优化,只是只有从它所依赖的所有表读取的表例外.如果出现循环依赖关系,MySQL提示出现一个错误. · 进行所有标准WHERE优化. · 如果A中有一行匹配WHERE子句,但B中没

几种MySQL中的联接查询操作方法总结_Mysql

前言 现在系统的各种业务是如此的复杂,数据都存在数据库中的各种表中,这个主键啊,那个外键啊,而表与表之间就依靠着这些主键和外键联系在一起.而我们进行业务操作时,就需要在多个表之间,使用sql语句建立起关系,然后再进行各种sql操作.那么在使用sql写出各种操作时,如何使用sql语句,将多个表关联在一起,进行业务操作呢?而这篇文章,就对这个知识点进行总结. 联接查询是一种常见的数据库操作,即在两张表(多张表)中进行匹配的操作.MySQL数据库支持如下的联接查询:     CROSS JOIN(交叉

MySQL中mysqldumpslow分析查询慢sql语句

对于大多数的程序员来说,最容易发现并解决的问题就是MySQL的慢查询或者没有利用索引的查询,所以这里主要给大家介绍如何利用官方的mysqldumpslow工具方便的查看这些信息.如何打开MySQL的慢查询, MySQL的慢查询记录 SHOW STATUS 直接在命令行下登陆MySQL运行SHOW STATUS;查询语句,详细如下图 同样的语句还有SHOW VARIABLES;,SHOW STATUS是查看MySQL运行情况,和上面那种通过pma查看到的信息基本类似. SHOW VARIABLES

详解MySQL中的分组查询与连接查询语句_Mysql

分组查询 group bygroup by 属性名 [having 条件表达式][ with rollup] "属性名 "指按照该字段值进行分组:"having 条件表达式 "用来限制分组后的显示,满足条件的结果将被显示:with rollup 将会在所有记录的最后加上一条记录,该记录是上面所有记录的总和. 1)单独使用 group by 单独使用,查询结果只显示一个分组的一条记录. 实例: select * from employee group by sex;

MySQL中的基本查询语句学习笔记_Mysql

1.基本查询语句select 属性列表 from 表名和视图列表 [where 条件表达式1] [group by 属性名1 [having 条件表达式2]] [order by 属性名2 [asc|desc]]2.单表查询1)使用*查询所有字段 select * from 表名: 2) 查询指定字段 select id,name from product: 使用上面例子可以查询指定字段 3)查询指定记录 where 条件表达式 实例: select *from employee where i