MySQL语句 MySQL SHOW DATABASES 显示数据库MySQL SHOW SCHEMAS 显示数据库语句MySQL CREATE DATABASE 创建数据库语句MySQL CREATE SCHEMA 创建数据库语句MySQL SHOW CREATE DATABASE 显示创建数据库的语句MySQL SHOW CREATE SCHEMA 显示创建数据库的语句MySQL ALTER DATABASE 修改数据库语句MySQL ALTER SCHEMA 修改数据库语句MySQL DROP DATABASE删除数据库MySQL DROP SCHEMA 删除数据库MySQL USE 选择数据库语句MySQL CREATE TEMPORARY TABLE 创建临时表语句 MySQL CREATE TABLE 创建数据表语句MySQL DROP TEMPORARY TABLE 删除临时表语句MySQL DROP TABLE 删除数据表语句MySQL SELECT 查询语句MySQL INSERT INTO 增加数据语句MySQL UPDATE 更新语句MySQL ALTER TABLE 修改数据表语句MySQL SHOW TABLES 显示数据表语句MySQL DESCRIBE/DESC 查看数据表语句MySQL SHOW CREATE TABLE 显示创建表语句MySQL DELETE 删除表数据语句MySQL WHERE 条件语句MySQL TRUNCATE 清空表语句MySQL LIKE 模糊匹配语句MySQL NOT LIKE 模式匹配外语句MySQL DISTINCT 去重语句MySQL AS 别名语句MySQL INSERT IGNORE INTO 忽略重复数据插入语句MySQL GROUP BY 分组语句MySQL HAVING 包含语句MySQL LIMIT限制查询数量 语句MySQL ORDER BY 排序语句MySQL BETWEEN AND 筛选范围内数据语句MySQL NOT BETWEEN AND 筛选不在范围数据语句MySQL IS NULL 查询是否为NULL值语句MySQL IS NOT NULL 查询不为NULL值语句MySQL IN 查询某个范围内的数据语句MySQL NOT IN 查询某个不在范围内的数据语句MySQL SELECTI...INTO OUTFILE将查询结果输出到外部文件语句MySQL LOAD DATA大量数据快速导入数据库语句MySQL UNION 合并两个或多个SELECT语句MySQL数据类型 MySQL tinyint、smallint、mediumint、int、bigint整数数据类型(精确值)MySQL decimal、numeric、double、float、real小数数据类型(精确、近似值)MySQL date、time、year、timestamp、datetime日期时间数据类型MySQL char、varchar、text、enum、set字符串类型MySQL bit、binary、varbinary、tinyblob、blob、mediumblob、longblob二进制数据类型MySQL空间数据类型MySQL函数 MySQL COUNT 统计函数MySQL ANY_VALUE函数 禁止 ONLY_FULL_GROUP_BY 值拒绝MySQL CASE 多分支函数MySQL LENGTH 返回字节数函数MySQL CHARACTER_LENGTH 返回字符数函数MySQL CHAR_LENGTH 返回字符数函数MySQL SUBSTRING提取字符串函数MySQL CONCAT 合拼字符串函数MySQL INSERT替换字符串函数MySQL LOWER 字符串转为小写 函数MySQL UPPER 字符串转为大写 函数MySQL LEFT 提取左侧字符 函数MySQL RIGHT 提取右侧字符 函数MySQL TRIM 删除头尾空格或指定字符 函数MySQL REPLACE 替换字符串函数MySQL REVERSE 字符串反转函数MySQL ABS求绝对值函数MySQL FIND_IN_SET 查逗号分隔特定值函数 MySQL ASCII最左边字符的数字值函数MySQL BIN将整数值转二进制字符串函数MySQL BIT_LENGTH返二进制字符串长度函数MySQL CONCAT_WS用分隔符连接字符串函数MySQL INTERVAL 返N值在区间段索引位置 函数MySQL ELT 指定位置提取子字符串函数MySQL IFNULL 处理NULL值函数MySQL EXPORT_SET二进制位生成拼接字符串函数MySQL FIELD 包含特定值的位置函数MySQL FORMAT 返回带有格式的数字函数MySQL TO_BASE64 字符串转base-64编码函数MySQL FROM_BASE64 将base-64编码解码函数MySQL AES_ENCRYPT 使用密钥进行加密函数MySQL AES_DECRYPT使用密钥解密函数MySQL HEX字符串转十六进制函数MySQL UNHEX 十六进制字符串转二进制数据函数MySQL INSTR 返回子字符串第一次出现的索引函数MySQL REGEXP 正则表达式函数MySQL NOT REGEXP不匹配正则表达式函数MySQL LCASE用于转换字符串为小写函数MySQL LOAD_FILE 加载文件到数据库函数MySQL LOCATE 搜索字符串第一次出现的位置函数MySQL LPAD左侧添加指定长度字符函数MySQL LTRIM删除字符串左侧空格的函数MySQL MAKE_SET 创建集合函数

MySQL FIND_IN_SET 查逗号分隔特定值函数

MySQL的FIND_IN_SET函数是一个非常实用的函数,它可以在一个逗号分隔的字符串列表中查找一个特定的值。这个函数在处理类似CSV数据或者需要模糊匹配的场景下特别有用。本文将详细介绍FIND_IN_SET函数的语法、使用案例以及需要注意的事项。

语法

FIND_IN_SET函数的语法如下:

FIND_IN_SET(search_value, string_list)

其中,search_value是要查找的值,string_list是逗号分隔的字符串列表。

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

示例:

SELECT FIND_IN_SET('b', 'a,b,c,d');
// 结果:2
// 因为 b 在strlist集合中2的位置, a是位置1
 
select FIND_IN_SET('1', '1');
// 结果:1 
// 这时候的strlist集合有点特殊,只有一个字符串
 
select FIND_IN_SET('2', '1,2'); 
// 结果:2
 
select FIND_IN_SET('6', '1'); 
// 结果:0 strlist中不存在str,所以返回0。

find_in_set案例

让我们来看一个具体的案例。

获取案例新建表格和插入数据语句
CREATE TABLE `test` (
  `ID` int(11) NOT NULL,
  `LIST` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES ('1', 'AA,BB,CD');
INSERT INTO `test` VALUES ('2', 'AA,BB');
INSERT INTO `test` VALUES ('3', 'AA');


原始数据

mysql> SELECT * FROM test;
+----+----------+
| ID | LIST     |
+----+----------+
|  1 | AA,BB,CD |
|  2 | AA,BB    |
|  3 | AA       |
+----+----------+
3 rows in set (0.00 sec)

用test表,找list列中的字符分隔值有“BB”的。

mysql> SELECT * FROM test WHERE FIND_IN_SET('BB', list) ;
+----+----------+
| ID | LIST     |
+----+----------+
|  1 | AA,BB,CD |
|  2 | AA,BB    |
+----+----------+
2 rows in set (0.00 sec)


find_in_set() 和 in 的区别

mysql> SELECT * FROM test WHERE id IN (2,3);
+----+-------+
| ID | LIST  |
+----+-------+
|  2 | AA,BB |
|  3 | AA    |
+----+-------+
2 rows in set (0.05 sec)

-- IN查询字段条件,查询id是2或者3的数据

find_in_set与like的区别

mysql> select * from test where find_in_set('D',list);
Empty set (0.00 sec)

mysql> select * from test where list like '%D%';
+----+----------+
| ID | LIST     |
+----+----------+
|  1 | AA,BB,CD |
+----+----------+
1 row in set (0.00 sec)


这时,select * from test where find_in_set('D',list);这样是查不到的,返回值为null,因为follow_id中没有“D”这个值,它不同于like模糊查询,它是以“,”来分割。如果使用like查询,查询结果为id=1的一条记录。

应用场景

1、文章表type字段查询

文章表里面有个type字段,它存储的是文章类型,有 1头条、2推荐、3热点、4图文等等 。现在有篇文章他既是头条,又是热点,还是图文,type中以 1,3,4 的格式存储。那我们如何用sql查找所有type中有4的图文类型的文章呢?

select * from article where FIND_IN_SET('4',type)

 2、部门树查询,匹配当前节点及所有子节点

2.1 数据表字段说明

360截图20231028145457781.jpg

 2.2 匹配部门id或父id为100的数据

SELECT dept_id FROM sys_dept WHERE dept_id = 100 or FIND_IN_SET( 100 , ancestors )

360截图20231028145550270.jpg

注意事项

虽然FIND_IN_SET函数非常方便,但是在使用时需要注意以下几点: