find_in_set
大约 3 分钟
find_in_set
1、语法
FIND_IN_SET(str,strlist)
- 第一个参数str是要查找的字符串。
- 第二个参数strlist是要搜索的逗号分隔的字符串列表。
find_in_set:在集合中查找, 那么我们是怎么在集合中查找的呢?
看这个函数的参数 FIND_IN_SET(str,strlist) 有两个, 一个是str, 一个是strlist
从单词的英文意义上来说, strlist是个那个集合,那么既然是集合,为什么会是个串呢, 所以它应该是有格式要求的。
大概意义就是从strList中找str串, 如果找到了, 就返回找到的那个strlist具体的那个坐标位置,没找到的话返回0, 具体的话看下面的SQL查询。
用法1(用在查询语句中,不常用):
# 返回字符串在字符串组合中的位置(位置从1开始),如果字符串在字符串集合中不存在,那么将返回0
select FIND_IN_SET('2', '1,2'); 返回2,也就是位置是2
select FIND_IN_SET('6', '1'); 返回0,由于strlist中不存在str,所以返回0
用法1(用在where语句中,常用):
select * from t_dept where find_in_set(#{deptId}, path)
注意:如果#{deptId}对应'1',path是'1,2,3',那么该条数据就会返回
2、SQL使用
# 创建表
CREATE TABLE IF NOT EXISTS tb_test1(
`id` INT(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL COMMENT '名字',
`type` varchar(255) NOT NULL COMMENT '类型: 1表示金卡;2表示银卡;3表示铜卡',
PRIMARY KEY (`id`)
)ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = 'FIND_IN_SET使用';
# 新增数据
INSERT INTO tb_test1(name,type) VALUES('edg','1,2,3');
INSERT INTO tb_test1(name,type) VALUES('rng','2,3');
INSERT INTO tb_test1(name,type) VALUES('ig','1,3');
# 查询
SELECT * FROM tb_test1 WHERE FIND_IN_SET('1',type); # 返回type中包含1的记录
查询结果

3、MyBatis中使用
CREATE TABLE IF NOT EXISTS dept(
`id` INT(11) NOT NULL auto_increment,
`name` varchar(255) NOT NULL COMMENT '部门名字',
`user_ids` text DEFAULT NULL COMMENT '部门人员',
PRIMARY KEY (`id`)
)ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '部门表';
<resultMap id="ResultMap" type="com.test.entity.dept" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="user_ids" property="userIds" jdbcType="VARCHAR" />
<association property="Users" resultMap="Usesr_map" /> // 在实体类中有List<User> Users
</resultMap>
<sql id="User_Column_List" >
user.id user_id, user.name user_name
</sql>
<resultMap id="Usesr_map" type="com.test.entity.User">
<id column="user_id" property="id" jdbcType="INTEGER" />
<result column="user_name" property="name" jdbcType="VARCHAR" />
</resultMap>
<!-- 只返回user_ids中包含的id的user记录 -->
<select id="selectOne" resultMap="ResultMap" parameterType="INTEGER" >
SELECT
e.id id,e.name name,e.user_ids user_ids,
<include refid="User_Column_List"/>
FROM dept e
LEFT JOIN User user ON FIND_IN_SET(user.id,e.user_ids)
WHERE e.id = #{e.id}
</select>
4、对比 in、like的区别
- find_in_set(str,strlist)函数是用变量,strlist内容是逗号分隔的字符串
in
后面是要常量,表示一个个罗列,in(‘11’,‘12’,‘13’)like
是模糊匹配,find_in_set是精确匹配
聚合函数
5、通常与GROUP BY
子句一起使用以将值分组到子集中。
Name | 描述 |
---|---|
AVG() | 返回参数的平均值 |
BIT_AND() | 返回按位与 |
BIT_OR() | 返回按位或 |
BIT_XOR() | 返回按位异或 |
COUNT() | 返回返回行数的计数 |
COUNT(DISTINCT) | 返回多个不同值的计数 |
GROUP_CONCAT() | 返回一个连接的字符串 |
JSON_ARRAYAGG() | 将结果集作为单个 JSON 数组返回 |
JSON_OBJECTAGG() | 将结果集作为单个 JSON 对象返回 |
MAX() | 返回最大值 |
MIN() | 返回最小值 |
STD() | 返回总体标准差 |
STDDEV() | 返回总体标准差 |
STDDEV_POP() | 返回总体标准差 |
STDDEV_SAMP() | 返回样本标准差 |
SUM() | 返回总和 |
VAR_POP() | 返回总体标准方差 |
VAR_SAMP() | 返回样本方差 |
VARIANCE() | 返回总体标准方差 |
除非另有说明,聚合函数忽略 NULL
值。
如果在不包含子句的语句中使用聚合函数 GROUP BY
,则相当于对所有行进行分组。有关详细信息,请参阅 第 12.20.3 节,“MySQL 对 GROUP BY 的处理”。