这篇文章主要介绍了mysql中find_in_set()函数的使用以及in()用法详解,需要的朋可以参考下
MySQL手册中find_in_set函数的语法解释:

FIND_IN_SET(str,strlist)

str 要查询的字符串
strlist 字段名 参数以”,”分隔 如 (1,2,6,8,10,22)
查询字段(strlist)中包含(str)的结果,返回结果为null或记录

假如字符串str在由N个子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间。 一个字符串列表就是一个由一些被 ‘,’ 符号分开的子链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,则FIND_IN_SET() 函数被优化,使用比特计算。 如果str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。这个函数在第一个参数包含一个逗号(‘,')时将无法正常运行。

看不懂概念也没事,按下面类子:

例子1:

1
SELECT FIND_IN_SET(‘b’, ‘a,b,c,d’);
结果:2

因为b 在strlist集合中放在2的位置 从1开始

select FIND_IN_SET(‘1’, ‘1’); 返回 就是1 这时候的strlist集合有点特殊 只有一个字符串 其实就是要求前一个字符串 一定要在后一个字符串集合中才返回大于0的数

1
2
select FIND_IN_SET(‘2’, ‘1,2’); 返回2
select FIND_IN_SET(‘6’, ‘1’); 返回0 strlist中不存在str,所以返回0。
find_in_set()和in的区别:

弄个测试表来说明两者的区别

1
2
3
4
5
6
7
8
9
CREATE TABLE tb_test (
id int(8) NOT NULL auto_increment,
name varchar(255) NOT NULL,
list varchar(255) NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO tb_test VALUES (1, ‘name’, ‘daodao,xiaohu,xiaoqin’);
INSERT INTO tb_test VALUES (2, ‘name2’, ‘xiaohu,daodao,xiaoqin’);
INSERT INTO tb_test VALUES (3, ‘name3’, ‘xiaoqin,daodao,xiaohu’);
原来以为mysql可以进行这样的查询:

1
SELECT id,name,list from tb_test WHERE ‘daodao’ IN(list); – (一)

实际上这样是不行的, 这样只有当list字段的值等于’daodao’时(和IN前面的字符串完全匹配),查询才有效,否则都得不到结果,即使’daodao’真的在list中。

再来看看这个:

1
SELECT id,name,list from tb_test WHERE ‘daodao’ IN (‘libk’, ‘zyfon’, ‘daodao’); – (二)

这样是可以的。

这两条到底有什么区别呢?为什么第一条不能取得正确的结果,而第二条却能取得结果。原因其实是(一)中 (list) list是变量, 而(二)中 (‘libk’, ‘zyfon’, ‘daodao’)是常量。

所以如果要让(一)能正确工作,需要用

1
2
3
find_in_set():

SELECT id,name,list from tb_test WHERE FIND_IN_SET(‘daodao’,list); – (一)的改进版

总结:

所以如果list是常量,则可以直接用IN, 否则要用find_in_set()函数。

也就是这两个sql是查询的效果是相同的:

1
2
SELECT * from C_PURCHASINGMASTERDATA where FIND_IN_SET(EKGRP,‘C54,C02,C14,C60,C06,C61,C53,C51,C12,C08,C03,C07’)
SELECT * from C_PURCHASINGMASTERDATA where EKGRP in (‘C54’,‘C02’,‘C14’,‘C60’,‘C06’,‘C61’,‘C53’,‘C51’,‘C12’,‘C08’,‘C03’,‘C07’)
但是如果第二句sql里面的值是传入sql的一个变量字段,那么第二句sql就不好使了。要以实际情况决定用in还是用 find_in_set()函数 。

find_in_set()和like的区别:

主要的区别就是like是广泛的模糊查询,而 find_in_set() 是精确匹配,并且字段值之间用‘,'分开。

现在想查询拥有角色编号为2的用户,用like关键字查询:

1
SELECT userid,username,userrole 角色 FROM user WHERE userrole LIKE ‘%2%’;
结果:

用 find_in_set() 查询:

1
SELECT userid,username,userrole 角色 FROM user WHERE find_in_set(‘2’,userrole)
结果:

显然用 find_in_set() 查询得到的结果才是我们想要的结果。所以他俩的

主要的区别就是like是广泛的模糊查询;而 find_in_set() 是精确匹配,并且字段值之间用‘,'分开,Find_IN_SET查询的结果要小于like查询的结果。

mysql 中find_in_set()和in()用法比较

在mysql中in可以包括指定的数字,而find_in_set()用于特定的数据类型。

find_in_set 函数使用方法

个例子来说:

有个文章表里面有个type字段,它存储的是文章类型,有 1头条、2推荐、3热点、4图文…1,12,13 等等 。
现在有篇文章他既是 头条,又是热点,还是图文,
type中以 1,3,4 的格式存储。
那我们如何用sql查找所有type中有4图文标准的文章呢??
这就要我们的 find_in_set 出马的时候到了。
以下为引用的内容:

1
select * from article where FIND_IN_SET(‘4’,type)
MySQL手册中find_in_set函数的语法:

FIND_IN_SET(str,strlist)

假如字符串str 在由N 子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间。
一个字符串列表就是一个由一些被 ‘,’ 符号分开的子链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type SET列,则 FIND_IN_SET() 函数被优化,使用比特计算。
如果str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。这个函数在第一个参数包含一个逗号(‘,')时将无法正常运行。

1
mysql> SELECT FIND_IN_SET(‘b’, ‘a,b,c,d’);
-> 2 因为b 在strlist集合中放在2的位置 从1开始

select FIND_IN_SET(‘1’, ‘1’); 返回 就是1 这时候的strlist集合有点特殊 只有一个字符串 其实就是要求前一个字符串 一定要在后一个字符串集合中 才返回 大于0的数

1
2
select FIND_IN_SET(‘2’, ‘1,2’); 返回2
select FIND_IN_SET(‘6’, ‘1’); 返回0
注意:

1
select * from treenodes where FIND_IN_SET(id, ‘1,2,3,4,5’);
使用find_in_set函数一次返回多条记录
id 是一个表的字段,然后每条记录分别是id等于1,2,3,4,5的时候
有点类似in (集合)

1
select * from treenodes where id in (1,2,3,4,5);
弄个测试表来说明两者的区别

1
2
3
4
5
6
7
8
9
10
CREATE TABLE test (
id int(8) NOT NULL auto_increment,
name varchar(255) NOT NULL,
list varchar(255) NOT NULL,
PRIMARY KEY (id)
)

INSERT INTO test VALUES (1, ‘name’, ‘daodao,www.jb51.net,xiaoqin’);
INSERT INTO test VALUES (2, ‘name2’, ‘xiaohu,daodao,xiaoqin’);
INSERT INTO test VALUES (3, ‘name3’, ‘xiaoqin,daodao,www.jb51.net’);
原来以为MySQL可以进行这样的查询:

1
select id, list, name from table where ‘daodao’ IN (list);
(一)
实际上这样是不行的,这样只有当name是list中的第一个元素时,查询才有效,否则都得不到结果,即使’daodao’真的在list中。
再来看看这个:

1
select id, list, name from table where ‘daodao’ IN (‘libk’, ‘zyfon’, ‘daodao’);
(二)
这样是可以的。

这两条到底有什么区别呢?为什么第一条不能取得正确的结果,而第二条却能取得结果。
原因其实是(一)中 (list) list是变量, 而(二)中 (‘libk’, ‘zyfon’, ‘daodao’)是常量。
所以如果要让(一)能正确工作,需要用find_in_set():

1
select id, list, name from table where find_in_set(‘daodao’,list);
(一)的改进版。
总结:
所以如果list是常量,则可以直接用IN, 否则要用find_in_set()函数。

以上所述是小编给大家介绍的mysql中find_in_set()函数的使用详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

Find_in_set()函数的使用及in()用法详解相关推荐

  1. mysql中find_in_set()函数的使用及in()用法详解

    From: http://www.manongjc.com/article/2710.html MySQL手册中find_in_set函数的语法解释: FIND_IN_SET(str,strlist) ...

  2. mysql的find in set_mysql中find_in_set()函数的使用及in()用法详解

    MySQL手册中find_in_set函数的语法解释: FIND_IN_SET(str,strlist) str 要查询的字符串 strlist 字段名 参数以","分隔 如 (1 ...

  3. Python函数(函数定义、函数调用)用法详解

    函数 函数就是一段封装好的,可以重复使用的代码,它使得我们的程序更加模块化,不需要编写大量重复的代码. 函数可以提前保存起来,并给它起一个独一无二的名字,只要知道它的名字就能使用这段代码.函数还可以接 ...

  4. java 函数fun_c语言中fun用法详解_后端开发

    Java Dao层的作用_后端开发 Dao层叫数据访问层,属于一种比较底层,比较基础的操作,可以具体到对于某个表或某个实体的增删改查,其Dao层的作用是对数据库的访问进行封装,从而不涉及业务,实现解耦 ...

  5. html js require函数,Require.js的基本用法详解

    一:什么是require.js ①:require.js是一个js脚本加载器,它遵循AMD(Asynchronous Module Definition)规范,实现js脚本的异步加载,不阻塞页面的渲染 ...

  6. python装饰器原理-Python函数装饰器原理与用法详解

    本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...

  7. python function at 0x00000_Python函数装饰器原理与用法详解

    本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...

  8. python函数定义及调用-Python函数(函数定义、函数调用)用法详解

    Python 中函数的应用非常广泛,前面章节中我们已经接触过多个函数,比如 input() .print().range().len() 函数等等,这些都是 Python 的内置函数,可以直接使用. ...

  9. python中save 函数_Tensorflow之Saver的用法详解

    Saver的用法 1. Saver的背景介绍 我们经常在训练完一个模型之后希望保存训练的结果,这些结果指的是模型的参数,以便下次迭代的训练或者用作测试.Tensorflow针对这一需求提供了Saver ...

最新文章

  1. ABAP 调用第三方 API,遇到乱码该怎么办?
  2. dos输入java Hello,出现错误: 找不到或无法加载主类 Hello
  3. SpringBoot - 工作流Activiti开发
  4. 最小生成树计数(HYSBZ-1016)(加强版实现)
  5. java代码生成器_java代码生成器怎么用
  6. 【jQuery学习】—jQuery操作元素位置
  7. 魅族android面试题,【魅族小米IT面试题】面试问题:Android… - 看准网
  8. 为什么稀疏自编码器的正则项选用了相对熵(KL散度)的函数?
  9. 解决Jquery Kendo.xxx is not a function 的方法
  10. java实现微信公众号的模板消息推送
  11. 读周公度之《结构化学基础》
  12. 卸载 npm 软件包
  13. 在路上●我的年轻●勇往直前●匆匆十年
  14. 5G网络巨大耗电量和基站密度,注定5G服务价格昂贵
  15. 高定服装走向NFT,巴黎时装周的数字化将带来什么新趋势?
  16. 前端自学HTML笔记之二【超链接】
  17. Virtualbox安装CentOS8
  18. 单片机C51 - 串行通信原理及串口编程实验
  19. 计算机组成考研笔记(持续更新)
  20. python常用单词下载_Python常用英语词汇

热门文章

  1. maven setting,xml
  2. 国产软件漏洞分析系列2:泛微OA e-cology 8/9 安全补丁分析之file
  3. WordCount单词计数详解
  4. 和实物只隔一个屏幕!华硕灵焕3Pro VR体验
  5. JWord Alpha 发布
  6. The class file xxx contains a signature 'xxx;' ill-formed at position 6 问题的解决
  7. sass/lsee 转换css 网站 SASS 转 CSS 工具,在线 SASS/SCSS 编译工具 - 在线工具-wetools.com微工具
  8. 一感冒就得红眼病,而且很严重怎么办
  9. MySQL主从复制(Windows 10 + CentOS 7混合云) | MySQL8.0.29主从复制(附视频教程)
  10. 「转」中国数据库40年历史:隐秘的江湖与恩怨