MySql 匹配集合中的数据

在进行表查询的时候,有时需要在列表(集合)中进行匹配查询,这个时候一般可以用三种方法实现,分别是:

LIKE, IN,FIND_IN_SET()。

LIKE 用法

LIKE 运算符用于 WHERE 表达式中,以搜索匹配字段中的指定内容,语法如下:

  • WHERE field LIKE pattern

  • WHERE field NOT LIKE pattern

在LIKE全面加上 NOT 运算符时,表示与 LIKE 相反的意思,即选择 column 不包含 pattern 的数据记录

LIKE 通常与通配符%一起使用,% 表示通配 pattern 中出现的内容,而不加通配符 % 的 LIKE 语法,表示精确匹配,其实际效果等同于 = 等于运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
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, 'names1', 'daodao,xiaohu,xiaoqin');
INSERT INTO `test` VALUES (2, 'names2', 'xiaohu,daodao,xiaoqin');
INSERT INTO `test` VALUES (3, 'names3', 'xiaoqin,daodao,xiaohu');

-- LIKE 用法
SELECT * FROM test WHERE list LIKE '%daodao%'

IN 用法

IN 常用于 WHERE 表达式中,其作用是查询某个常量范围内的数据。用法如下:

  • WHERE field IN (value1,value2,value3,…)

  • WHERE field NOT IN (value1,value2,value3,…)

IN 后面的括号内为常量集合,且各个关键词之间用英文的逗号隔开。

FIND_IN_SET() 用法

FIND_IN_SET 常用于 WHERE 表达式中,其作用是查询某个范围(常量或者字段)内的数据。用法如下:

  • WHERE FIND_IN_SET(str,strlist)
  • WHERE NOT FIND_IN_SET(str,strlist)

str 既可以是字段,也可以是常量

strlist 既可以是常量集合,也可以是字段,每个关键字之间用英文逗号隔开

1
2
3
4
5
6
7
8
-- 在字段集合中查找
SELECT * FROM test WHERE FIND_IN_SET('daodao',list)

-- 在常量集合中查找
SELECT * FROM test WHERE FIND_IN_SET('daodao','daodao,xiaohu,qiaoqin')

-- 查找值是字段
SELECT * FROM test WHERE FIND_IN_SET(name,'names1,mameother')

最佳实践

  1. 如果待查询的条件是常量那就使用 IN,是变量则使用 FIND_IN_SET。IN 可以使用索引。

  2. 如果使用 IN 和 FIND_IN_SET 都能满足条件,则最好使用 IN,理由同上,特别是查询字段为主键时或有索引时。