时间:2022-10-02来源:www.pcxitongcheng.com作者:电脑系统城
通常在实际应用中,会涉及到模糊查询的需求,查询在 MySQL 中使用 SQL SELECT 命令来读取数据,有条件的查询可以在 SELECT 语句中使用 WHERE 子句来获取记录
有时候我们需要获取某字段含有 “xxxxx” 字符的所有记录,这时就是模糊查询,下面介绍一下在MySQL中实现模糊查询的两种方式
MySQL 查询数据使用SQL SELECT语句
MySQL数据库中查询数据通用的 SELECT 语法:
1 2 3 4 |
SELECT column_name, column_name FROM table_name [ WHERE Clause] [LIMIT N][ OFFSET M] |
说明:
根据上述的语法,模糊查询的限制位置在 where 语句后,即like 在 where 中使用
1 2 3 |
SELECT field1, field2,....,fieldN FROM table_name WHERE field1 LIKE condition; |
说明:
前提准备:创建表与插入数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
-- ---------------------------- -- 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); |
初始数据:
1 | select * from product; |
结果:
需求一:查询指定前缀的记录
查询 产品名称 为 oppo(即前缀为oppo) 的产品信息
1 | select * from product where product_name like "OPPO%" ; |
结果:
需求二:查询指定后缀的记录
查询产品系列为pro系列的产品,即 产品名称 后缀为 pro 的产品信息
1 | select * from product where product_name like "%pro" ; |
结果:
需求二:查询包含指定内容的记录
查询 产品名称 包含 3 的产品
1 | select * from product where product_name like "%3%" ; |
结果:
除了上述方法,MySQL 也支持正则表达式的匹配,通过使用 REGEXP 操作符来进行正则表达式匹配
1 2 3 4 5 6 7 8 9 |
// 不区分大小写的查询 SELECT field1, field2,....,fieldN FROM table_name WHERE field1 regexp condition; // 区分大小写的查询 SELECT field1, field2,....,fieldN FROM table_name WHERE field1 regexp binary condition; |
在 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) 的产品信息 不区分大小写
1 | select * from product where product_name regexp "^oppo" ; |
查询 产品名称 为 oppo(即前缀为oppo) 的产品信息 区分大小写
1 | select * from product where product_name regexp binary "^oppo" ; |
结果:
需求二:查询指定后缀的记录
查询产品系列为pro系列的产品,即 产品名称 后缀为 pro 的产品信息
1 | select * from product where product_name regexp "pro$" ; |
结果:
需求二:查询包含指定内容的记录
查询 产品名称 包含 3 的产品
1 | select * from product where product_name regexp "3+" ; |
结果:
上述介绍了两种模糊匹配的实现方式,like 子句 与 正则表达式
很多场景下会使用 like 来对字符串进行匹配,从而实现模糊查询,但是这些场景往往非常简单,而正则表达式是一个非常强大的文本检索过滤工具,适用在很复杂的场景
2023-10-30
windows上的mysql服务突然消失提示10061 Unkonwn error问题及解决方案2023-10-30
MySQL非常重要的日志bin log详解2023-10-30
详解MySQL事务日志redo log一、单表查询 1、排序 2、聚合函数 3、分组 4、limit 二、SQL约束 1、主键约束 2、非空约束 3、唯一约束 4、外键约束 5、默认值 三、多表查询 1、内连接 1)隐式内连接: 2)显式内连接: 2、外连接 1)左外连接 2)右外连接 四...
2023-10-30
Mysql删除表重复数据 表里存在唯一主键 没有主键时删除重复数据 Mysql删除表中重复数据并保留一条 准备一张表 用的是mysql8 大家自行更改 创建表并添加四条相同的数据...
2023-10-30