Mysql实现模糊查询的两种方式(like子句 、正则表达式)

 更新时间:2022年09月30日 09:34:21   作者:pan_mlpan  
通配符是一种特殊语句,主要用来模糊查询,下面这篇文章主要给大家介绍了关于给Mysql实现模糊查询的两种方式,分别是like子句 、正则表达式,需要的朋友可以参考下

通常在实际应用中,会涉及到模糊查询的需求,查询在 MySQL 中使用 SQL SELECT 命令来读取数据,有条件的查询可以在 SELECT 语句中使用 WHERE 子句来获取记录

有时候我们需要获取某字段含有 “xxxxx” 字符的所有记录,这时就是模糊查询,下面介绍一下在MySQL中实现模糊查询的两种方式

前言

MySQL 查询数据使用SQL SELECT语句

语法

MySQL数据库中查询数据通用的 SELECT 语法:

SELECT column_name, column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]

说明:

  • SELECT 命令可以读取一条或者多条记录,一个字段信息或者多个字段信息,可使用星号(*)来代替其他字段返回表的所有字段数据
  • SELECT 命令 from 后可以使用一个 / 多个表,表之间使用逗号( , ) 分割
  • SELECT 命令 使用 WHERE 语句来包含任何条件
  • SELECT 命令 使用 LIMIT 属性来设定返回的记录数。
  • SELECT 命令 使用 OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。

like子句

根据上述的语法,模糊查询的限制位置在 where 语句后,即like 在 where 中使用

语法

SELECT field1, field2,....,fieldN 
FROM table_name
WHERE field1 LIKE condition;

说明:

  • LIKE子句 在 WHERE 子句中使用,若 condition 为明确的数据,则 LIKE子句 相当于 等号 =(精准查询)
  • 通常,condition 会包含 % ,即 LIKE 通常与 % 一同使用,进行搜索(模糊查询), xxx% 查找指定前缀的记录,%xxx 查找指定后缀的记录,%xxx% 查找包含指定内容的记录

示例

前提准备:创建表与插入数据

-- ----------------------------
-- Table structure for product
-- ----------------------------
DROP TABLE IF EXISTS `product`;
CREATE TABLE `product`  (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `product_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '产品名称',
  `price` decimal(10, 2) UNSIGNED NOT NULL COMMENT '产品价格',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of product
-- ----------------------------
INSERT INTO `product` VALUES (1, 'Apple iPhone 13 (A2634)', 6799.00);
INSERT INTO `product` VALUES (2, 'HUAWEI P50 Pro', 6488.00);
INSERT INTO `product` VALUES (3, 'MIX4', 4999.00);
INSERT INTO `product` VALUES (4, 'OPPO Find X3', 3999.00);
INSERT INTO `product` VALUES (5, 'OPPO Find X4', 3999.00);
INSERT INTO `product` VALUES (6, 'OPPO Find Pro', 6488.00);
INSERT INTO `product` VALUES (7, 'vivo X70 Pro+', 5999.00);

初始数据:

select * from product;

结果:

请添加图片描述

需求一:查询指定前缀的记录

查询 产品名称oppo(即前缀为oppo) 的产品信息

select * from product where product_name like "OPPO%";

结果:

请添加图片描述

需求二:查询指定后缀的记录

查询产品系列为pro系列的产品,即 产品名称 后缀为 pro 的产品信息

select * from product where product_name like "%pro";

结果:

请添加图片描述

需求二:查询包含指定内容的记录

查询 产品名称 包含 3 的产品

select * from product where product_name like "%3%";

结果:

请添加图片描述

正则表达式

除了上述方法,MySQL 也支持正则表达式的匹配,通过使用 REGEXP 操作符来进行正则表达式匹配

语法

// 不区分大小写的查询
SELECT field1, field2,....,fieldN 
FROM table_name
WHERE field1 regexp condition;

// 区分大小写的查询
SELECT field1, field2,....,fieldN 
FROM table_name
WHERE field1 regexp binary condition;

说明:

  • regexp 操作符也在 WHERE 子句中使用,若 condition 不能为明确的数据,需要为正则表达式
  • 默认 regexp 操作符 的查询不区分大小写,如若想区分大小写,可以在 regexp 操作符后 加上 binary 关键字即可

在 REGEXP 操作符中可以使用如下的正则模式:

模式描述
^匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置
$匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置
.匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用像 ‘[.\n]’ 的模式
[…]字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’
[^…]负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’
p1|p2|p3匹配 p1 或 p2 或 p3。例如,‘z|food’ 能匹配 “z” 或 “food”。‘(z|f)ood’ 则匹配 “zood” 或 “food”
*匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}
+匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}
{n}n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o
{n,m}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次

示例

需求一:查询指定前缀的记录

查询 产品名称oppo(即前缀为oppo) 的产品信息 不区分大小写

select * from product where product_name regexp  "^oppo";

查询 产品名称oppo(即前缀为oppo) 的产品信息 区分大小写

select * from product where product_name regexp binary "^oppo";

结果:

请添加图片描述

需求二:查询指定后缀的记录

查询产品系列为pro系列的产品,即 产品名称 后缀为 pro 的产品信息

select * from product where product_name regexp "pro$";

结果:

请添加图片描述

需求二:查询包含指定内容的记录

查询 产品名称 包含 3 的产品

select * from product where product_name regexp "3+";

结果:

请添加图片描述

总结

上述介绍了两种模糊匹配的实现方式,like 子句 与 正则表达式

很多场景下会使用 like 来对字符串进行匹配,从而实现模糊查询,但是这些场景往往非常简单,而正则表达式是一个非常强大的文本检索过滤工具,适用在很复杂的场景

到此这篇关于Mysql实现模糊查询(like子句 、正则表达式)的文章就介绍到这了,更多相关Mysql模糊查询方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于MySQL中explain工具的使用

    关于MySQL中explain工具的使用

    这篇文章主要介绍了关于MySQL中explain工具的使用,在select语句之前增加explain关键字,MySQL会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是执行这条SQL,需要的朋友可以参考下
    2023-05-05
  • JDBC连接MySQL5.7的方法

    JDBC连接MySQL5.7的方法

    这篇文章主要介绍了JDBC连接MySQL5.7的方法,需要的朋友可以参考下
    2018-05-05
  • 一文详解Mysql insert也会发生死锁吗

    一文详解Mysql insert也会发生死锁吗

    死锁的本质是资源竞争,批量插入如果顺序不一致很容易导致死锁,这篇文章主要给大家介绍了关于Mysql insert是否也会发生死锁的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-02-02
  • MySQL表锁、行锁、排它锁及共享锁的使用详解

    MySQL表锁、行锁、排它锁及共享锁的使用详解

    随着应用对事务完整性和并发性要求的不断提高,MySQL才开始开发基于事务的存储引擎,下面这篇文章主要给大家介绍了关于MySQL表锁、行锁、排它锁及共享锁使用的相关资料,需要的朋友可以参考下
    2022-04-04
  • centos7利用yum安装mysql 8.0.12

    centos7利用yum安装mysql 8.0.12

    这篇文章主要为大家详细介绍了centos7利用yum安装mysql 8.0.12,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • mysql实现自增序列的示例代码

    mysql实现自增序列的示例代码

    这篇文章主要介绍了mysql实现自增序列的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • MySQL文本文件导入及批处理模式应用说明

    MySQL文本文件导入及批处理模式应用说明

    MySQL文本文件导入及批处理模式应用说明,需要的朋友可以参考下。
    2011-09-09
  • SQL Server 数据库的备份详细介绍及注意事项

    SQL Server 数据库的备份详细介绍及注意事项

    这篇文章主要介绍了SQL Server 备份详细介绍及注意事项的相关资料,需要的朋友可以参考下
    2016-12-12
  • mysql实现merge into问题

    mysql实现merge into问题

    文章介绍了在数据库操作中,如何使用`REPLACE INTO`和`INSERT INTO ON DUPLICATE KEY UPDATE`语句进行数据更新和插入操作,如果不想创建唯一性索引,可以通过存储过程实现,文章通过实验和验证,展示了这两种方法的实际效果
    2024-12-12
  • MySQL存储数据乱码的问题解析

    MySQL存储数据乱码的问题解析

    这篇文章主要介绍了MySQL存储数据乱码的问题解析,作者从实际使用中的多个方面定位其原因然后解决,需要的朋友可以参考下
    2015-05-05

最新评论