MySQL中的find_in_set()函数操作技巧和like相当

原创
小哥 3年前 (2022-11-08) 阅读数 8 #大杂烩

1.首先,让我们了解一下find_in_set()函数

首先,很多小伙伴肯定会去看看。MySQL官方手册, 不过,一些新手朋友在查阅后可能并不理解。好吧,我也会查阅手册,帮助新手朋友先看看手册中的解释。: 例如下图:

官方文件中解释的语法是: FIND_IN_SET(str,strlist) ;

文档解释:

(如果字符串str在由N由子链组成的字符串列表。strlist 中, 那么返回值的范围是 1 到 N 之间)
这句话的意思是看它。str此字符不在或可以说包含此字符strlist在字符列表中, 如果存在或包含在strlist这个在字符列表中就返回一个位置的数字, 这个数字必须更大0 的数字,
请在此处解释strlist字符串列表是一些人制作的字符串列表。 逗号‘,’ 单独的单个字符串
注意: 如果str不在strlist 或strlist 是空字符串,返回值为 0 , 如果任何一个参数为空,则返回值为。 0 也可以说NULL

2.find_in_set()函数的实际基本操作。

案例1

好吧,如果你还没有理解上面的解释 让我们看看实际操作案例! 打开cmd进入MySQL命令行界面, 执行如下SQL语句

 SELECT FIND_IN_SET(b, a,b,c,d); 
 #--结果为2 , 因为b 在strlist产生2的位置 起始号码是1开始计算!

如下图: 这个例子应该很简单,可以看出这个函数的作用!

不难看出,只要位置信息存在于第二字符串列中,就返回位置信息。!

案例2

 select FIND_IN_SET(重庆,重庆);
 #-- 这里返回的是位置下标1
 ​
 select FIND_IN_SET(重庆,北京);
 #-- 这里是回报0  因为第一个字符串 重庆  第二个字符串中不存在
 ​
 select FIND_IN_SET(2, 1,2); 
 #-- 这里返回的是位置下标2
 ​
 select FIND_IN_SET(6, 1); 
 #-- 这里是回报0  因为第一个字符串 6  第二个字符串中不存在

所以注意 : 此时,第二个参数集有点特殊。 如果只有一个字符串, 如果上一个字符串 在返回较大值之前存在于后一个字符串集合中0的数 , 但如果它不存在,它将返回0

如下图:

通过案例2 你的朋友对吗find_in_set()你对这个功能了解多少?

注意 使用find_in_set当函数查询整个表时, 一次返回多个记录的情况。

比如说: id是表的主键字段,然后每条记录都是id等于1,2,3,4,5的时候, 有点相似in() 的操作了

案例:

 select * from per where find_in_set(id,2,3,4,5,6);

那么结果可能是相同的,如下图所示

事实上,上述SQL语句也等同于以下语句in

 select * from per where id in(2,3,4,5,6);

小提示: find_in_set() 它通常写在 where在关键字之后!

3.find_in_set()与in()应用场景之间的差异

我们刚才也看到了

 select * from per where find_in_set(id,2,3,4,5,6);
 与
 select * from per where id in(2,3,4,5,6);

上面两句SQL结果是一样的 ,但细心的小伙伴不知道有什么不同?

答案在于 一个有单引号,另一个没有单引号。这里,您正在检测的字段是数字类型。 还是字符串类型的字段!

对于find_in_set()而言

第二个参数,无论是字符串还是数字,都必须用单引号括起来。, 字符串列表用逗号分隔。,如果不是这样写的,是一个字符串列表 语法错误将被报告!

案例

 select * from per where find_in_set(id,2,3,4,5,6);

对于in而言

如果是检测到的字段,如果是数字类型,则不能使用单引号,因为这会使结果发生偏差。

案例

 select * from per where id in(2,3,4,5,6);  #--错误的
 ​
 select * from per where id in(2,3,4,5,6);  #--正确的

如下图:你只会看到一个结果。为什么? 这是因为MySQL将自动确定第一个字符串是否匹配,但后者将被切断。 无匹配项!

正确的结果如下

如果检测到字符 然后每个字符需要用单引号括起来 才可以, 如下所示SQL语句, in与find_in_set()的比较 结果是一样的,

但是,有必要注意我上面所说的内容,并注意区分数据类型细节的问题。OK 了!

 select * from per where paddr in(重庆,北京,上海); 
 #--比较
 select * from per where find_in_set(paddr,重庆,北京,上海);

首先,让我们创建一个新表。 并插入一些数据进行测试! SQL代码语句如下:

CREATE TABLE test1 (
  id int(8) NOT NULL auto_increment,
  name varchar(255) NOT NULL,
  list varchar(255) NOT NULL,
  PRIMARY KEY  (id)
);

INSERT INTO test1(name,list) VALUES (张三, 篮球,足球,羽毛球);
INSERT INTO test1(name,list) VALUES (李四, 射箭,跳远,足球);
INSERT INTO test1(name,list) VALUES (王武, 跳远,篮球);
INSERT INTO test1(name,list) VALUES (小王, 射箭);

在使用in()的时候

例如,如下所示SQL语句

SELECT id,name,list from test1 WHERE 篮球 IN(list);

许多人认为可以提出这样的质疑。,但结果确实回来了Empty 为什么呢?

原因:

因为只有当list字段的内容完全相等 当篮球是这个值时(和)。IN上一个字符串可以完全匹配),则查询有效。!
否则,即使篮球真的存在,也不会有结果。list中 不会有结果,这也反映了 in()数据的准确性没有得到很好的控制。!
也就是说 篮球 在张三、王武对应。list两个字段都存在, 但这就是为什么它无法查询。, 除了篮球 还有其他角色!

所以只有当list字段的内容完全相等 in() 当上一个字符串 为了精确匹配,查询是有效的。!

如下代码

SELECT * from test1 WHERE 射箭 IN(list);

如下图:

在使用find_in_set()的时候

再比如说 我们想询问list该字段仅包含篮球的数据行。

SELECT id,name,list from test1 WHERE 篮球 IN(篮球,足球,羽毛球);
#-- 这里的结果是所有这些都已被查询。 而不是我们想要对应的数据 我们通常无法查询我们想要的结果。! 为什么? 

因为这句话的意思是 查询 篮球 这个字符 在不在 这个in()在包含的字符常量中, 如果成立, 如果是,则显示所有数据, select以下是 这三个字段, 上述条件成立 因此,这三个字段的所有数据也会显示出来。! 这应该不难理解!

所以从需求语法的角度来看,这句话SQL这是一个不能正确给出结果的语句。! 那么这个查询显然是不合理的!

但我们的需求 但事实并非如此,我们想查询list字段中 只包含 篮球,的数据行!

所以如果你想要以上SQL可以正常工作,需要使用find_in_set()函数

代码如下

SELECT id,name,list from test1 WHERE FIND_IN_SET(篮球,list);

小结

检查字段的固定内容时, 比如: 字段 in(篮球, 足球, 羽毛球), 检查是否包含in独立存在于 就用in

检查字段的内容是否包含指定的关键内容之一时 ,就要用find_in_set()函数

SELECT id,name,list from test1 WHERE list in(篮球,足球); #-- 返回list球场内容只是篮球 或 足球数据

SELECT id,name,list from test1 WHERE find_in_set(篮球,list); #-- 返回list字段内容包含篮球数据

4.find_in_set()和like应用场景之间的差异

在mysql在中,有时当我们进行数据库查询时,我们需要获取一个记录,该记录包含字段中的值,但它也没有被使用。like可以解决、使用like我们可能会找到我们不想要的记录。,这时候mysql的FIND_IN_SET这个功能很有用。

需求案例1

让我们看看下面的应用程序场景示例: 权限

代码情况如下

#-- 创建表并插入语句
CREATE TABLE users(
    id int(6) NOT NULL AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    limits VARCHAR(50) NOT NULL, -- 权限字段
    PRIMARY KEY (id)
);

INSERT INTO users(name, limits) VALUES(张三,1,2,12); 
INSERT INTO users(name, limits) VALUES(李四,11,22,32);
INSERT INTO users(name, limits) VALUES(王武,1,2,32);

其中limits指示用户拥有的权限(用逗号分隔)!

需求

现在要查询的权限号。2那么SQL查询结果如下:

SELECT * FROM users WHERE limits LIKE %2%;

如果用like如果使用关键字,查询结果如下:

这将导致第二个数据结果没有权限2用户还发现这是一个完全出乎意料的结果。!

所以现在我们使用find_in_set()解决此问题的函数 SQL语句如下:

#-- 查询用户具有权限号:2 的用户
SELECT * FROM users WHERE FIND_IN_SET(2,limits);

这样,我们就能达到预期的效果,问题也就迎刃而解了!

需求案例2

人们有时身兼数职。有必要找出谁担任某个职位,例如position字段中,不同的作业用数字表示,多个作业用逗号分隔。事实上,与上述情况相同,

如下表: User信息表

需求

找出1职位负责人:

如果是模糊查询 如下:

select * from 表名称 where position like %1%

显然,我上面所说的也是一个事实,尽管没有包括在内1它被过滤掉了,如果你仔细看,你会发现的。position为: 10 它也已被发现,但这不符合业务要求。 如下:

因此,这个需求的解决方案与上面的完全相同。:采用MySQL本机函数find_in_set(str,array)To查询可以是

select * from user where find_in_set(1,position);

结果如下:

小提示 FIND_IN_SET(str,strlist)函数,其中strlist字符串列表参数只能识别英文逗号, 所以小朋友们都在用它。PHP 或者JAVA插入数据时,请确保使用逗号将字符串分成字段!

小结:

  1. find_in_set(str1,strlist)返回字符串函数。strlist中str1位置索引, strlist必须以","分割开。

  1. like是字符串中没有分隔符的广义模糊匹配,
  2. find_in_set完全匹配,字段值为英语“,”分隔,find_in_set查询结果更好like查询更准确。!
版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除