sql find_in_set 和 like的区别

本文通过具体示例比较了MySQL中find_in_set函数与like操作符在数据查询上的差异,并探讨了这两种方法在不同场景下的可能性能表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mysql> select id, backup_time from backup_policy limit 2; 
+----+-------------+
| id | backup_time |
+----+-------------+
| 21 | Wen,Sun     |
| 24 |             |
+----+-------------+
2 rows in set (0.00 sec)
mysql> select count(*) from backup_policy where find_in_set('Wen', backup_time);
+----------+
| count(*) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from backup_policy where backup_time like '%Wen%';       
+----------+
| count(*) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)

find_in_set函数是查询某个字段(以英文逗号隔开的字符串)中是否包含某个值。
like是比较常用的模糊查询,是把字段整体看成是查询对象。
find_in_set 是精确匹配,字段值以英文 ‘,’ 分隔,而like 是广泛的模糊查询,字段中无需使用分隔符。
两者表示的意义、用法、逻辑是不同的,作用是否相同要看你要查询的结果了。

我想用explain来测试下两者的区别,但是,是失败的

mysql> EXPLAIN select count(*) from backup_policy where find_in_set('Wen', backup_time);
+----+-------------+---------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table         | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+---------------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | backup_policy | ALL  | NULL          | NULL | NULL    | NULL | 3169 | Using where |
+----+-------------+---------------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

mysql> explain select count(*) from backup_policy where backup_time like '%Wen%';
+----+-------------+---------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table         | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+---------------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | backup_policy | ALL  | NULL          | NULL | NULL    | NULL | 3169 | Using where |
+----+-------------+---------------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)

两者的结果是一样的。。。。。。

至于两个sql语句的性能谁高谁低,我感觉这个跟数据库的表结构、索引、数据量等因素有关,我还没有大量数据去测试,这个作业留给大家吧!

FIND_IN_SETLIKE都是MySQL中常用的字符串匹配函数,但它们的匹配方式不同。 FIND_IN_SET函数用于在一个逗号分隔的字符串列表中查找一个字符串,并返回它在列表中的位置。它的语法如下: ``` FIND_IN_SET(str, strlist) ``` 其中,str是要查找的字符串,strlist是逗号分隔的字符串列表。如果找到了,返回值是该字符串在列表中的位置(从1开始),否则返回0。 举个例子,假设有一个表t,其中有一个字段name,它的值是逗号分隔的字符串列表,如下所示: ``` id name 1 apple,banana,orange 2 banana,pear 3 orange,grape,apple ``` 如果我们要查找name字段中包含"apple"的记录,可以使用FIND_IN_SET函数,如下所示: ``` SELECT * FROM t WHERE FIND_IN_SET('apple', name) > 0; ``` 这条SQL语句的意思是,在表t中查找name字段中包含"apple"的记录。由于"apple"在第1个位置,所以返回的结果是id为13的两条记录。 而LIKE函数则是用于模糊匹配的,它可以在字符串中查找指定的模式。它的语法如下: ``` SELECT * FROM table WHERE column LIKE pattern; ``` 其中,table是要查询的表名,column是要查询的字段名,pattern是要匹配的模式。pattern中可以使用通配符%,表示任意字符,可以出现0次或多次;也可以使用下划线_,表示任意单个字符。 举个例子,假设有一个表t,其中有一个字段name,它的值是字符串,如下所示: ``` id name 1 apple 2 banana 3 orange ``` 如果我们要查找name字段中以"a"开头的记录,可以使用LIKE函数,如下所示: ``` SELECT * FROM t WHERE name LIKE 'a%'; ``` 这条SQL语句的意思是,在表t中查找name字段中以"a"开头的记录。由于"apple""orange"都以"a"开头,所以返回的结果是id为13的两条记录。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值