MySQL的find_in_set()函数

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 今天发现开发写的SQL中包含了find_in_set(),从来没见过,貌似挺有用的,了解一下

语法解释

FIND_IN_SET(str,strlist)

str是要查询的字符串或者字段;
strlist可以是字段和字符列表,多个字符串之间必须以逗号分隔,例如:'1,2,e,t'。

这个函数的作用就是查询strlist中是否包含str,返回结果为null或记录。假如字符串str在由N个子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间;如果str不在strlist 或strlist 为空字符串,则返回值为 0。例如:

mysql> select find_in_set('s','2,3,s,f,NULL');
+---------------------------------+
| find_in_set('s','2,3,s,f,NULL') |
+---------------------------------+
|                               3 |
+---------------------------------+
1 row in set (0.00 sec)

mysql> select find_in_set('vv','2,3,s,f,NULL');
+----------------------------------+
| find_in_set('vv','2,3,s,f,NULL') |
+----------------------------------+
|                                0 |
+----------------------------------+
1 row in set (0.00 sec)

mysql> select find_in_set('vv',null);
+------------------------+
| find_in_set('vv',null) |
+------------------------+
|                   NULL |
+------------------------+

find_in_set()和in的区别

比如有这样的需求,想要取出findin表的list字段中含有vnhg字符串的数据行:

mysql> select * from findin;
+----+------+----------------+
| id | name | list           |
+----+------+----------------+
|  1 | vnhg | bnmj,ewer,vnhg |
|  2 | mnn  | vbnj,dkf,vnhg  |
+----+------+----------------+
mysql> select * from findin where 'vnhg' in(list);
Empty set (0.00 sec)

上面的SQL是无法实现这个需求,实际上只有当list字段的值等于'vnhg'时(和in前面的字符串完全匹配),查询才能返回结果。
使用下面的查询就可以实现需求:

mysql> select * from findin where find_in_set('vnhg',list);
+----+------+----------------+
| id | name | list           |
+----+------+----------------+
|  1 | vnhg | bnmj,ewer,vnhg |
|  2 | mnn  | vbnj,dkf,vnhg  |
+----+------+----------------+

find_in_set()和like的区别

主要的区别就是like是广泛的模糊查询;而 find_in_set() 是精确匹配,并且字段值之间用‘,'分开。
以实际的例子来体会:

mysql> select * from findin where find_in_set('vnh',list);
Empty set (0.00 sec)
mysql> select * from findin where list like '%vnh%';
+----+------+----------------+
| id | name | list           |
+----+------+----------------+
|  1 | vnhg | bnmj,ewer,vnhg |
|  2 | mnn  | vbnj,dkf,vnhg  |
+----+------+----------------+
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
26天前
|
存储 SQL 关系型数据库
MySQL基础:函数
本文介绍了MySQL中几种常用的内建函数,包括字符串函数、数值函数、日期函数和流程函数。字符串函数如`CONCAT()`用于拼接字符串,`TRIM()`用于去除字符串两端的空格,`MOD()`求余数,`RAND()`生成随机数,`ROUND()`四舍五入。日期函数如`CURDATE()`返回当前日期,`NOW()`返回当前日期和时间,`DATE_ADD()`添加时间间隔,`DATEDIFF()`计算日期差。流程函数如`IF()`和`CASE WHEN THEN ELSE END`用于条件判断。聚合函数如`COUNT()`统计行数,`SUM()`求和,`AVG()`求平均值
24 8
MySQL基础:函数
|
11天前
|
JSON 关系型数据库 MySQL
MySQL 8.0常用函数汇总与应用实例
这些函数只是MySQL 8.0提供的众多强大功能的一部分。通过结合使用这些函数,你可以有效地处理各种数据,优化数据库查询,并提高应用程序的性能和效率。
18 3
|
1天前
|
存储 关系型数据库 MySQL
MySQL中利用FIND_IN_SET进行包含查询的技巧
`FIND_IN_SET`提供了一种简便的方法来执行包含查询,尤其是当数据以逗号分隔的字符串形式存储时。虽然这个方法的性能可能不如使用专门的关系表,但在某些场景下,它提供了快速简便的解决方案。开发者应该根据具体的应用场景和性能要求,权衡其使用。
6 0
|
2月前
|
SQL 关系型数据库 MySQL
在 MySQL 中使用 `RIGHT` 函数
【8月更文挑战第8天】
236 7
在 MySQL 中使用 `RIGHT` 函数
|
2月前
|
SQL 关系型数据库 MySQL
在 MySQL 中使用 `REPLACE` 函数
【8月更文挑战第8天】
636 7
在 MySQL 中使用 `REPLACE` 函数
|
2月前
|
存储 SQL 关系型数据库
在 MySQL 中使用 `RTRIM` 函数
【8月更文挑战第8天】
142 8
在 MySQL 中使用 `RTRIM` 函数
|
2月前
|
缓存 关系型数据库 MySQL
在 MySQL 中使用 SPACE 函数
【8月更文挑战第5天】
102 3
在 MySQL 中使用 SPACE 函数
|
1月前
|
存储 关系型数据库 MySQL
MySQL MATCH 函数如何使用 WITH QUERY EXPANSION?
【9月更文挑战第2天】MySQL MATCH 函数如何使用 WITH QUERY EXPANSION?
30 0
|
3月前
|
存储 JSON 关系型数据库
mysql中find_in_set()函数用法详解及增强函数
总结而言,`FIND_IN_SET()`是MySQL中处理由逗号分隔的字符串列表的一种便捷方法,尤其适用于列表相对较短且不经常更改的场景。然而,对于更为复杂的需要高性能和可扩展性的数据库设计,它可能不是最优选择,应考虑使用更加正规化的数据库结构。
228 2
mysql中find_in_set()函数用法详解及增强函数
|
2月前
|
存储 关系型数据库 MySQL
下一篇
无影云桌面