Mysql必知必会(3):模糊查询(LIKE)

shark010

shark010

发表于 2017-01-10 16:39:03
内容来源: 网络

本文介绍什么是通配符,如何利用通配符进行数据库数据过滤查询。

本文使用的数据表在本文最后附录

简介

之前几篇文章的所有例子查询的条件都是确定的值,比如大于20,或者用户ID为1.但是,有些时候我们需要查询一些不太确定的值。比如用户在输入框输入关键字查询相关文章,这个时候就需要模糊查询。也就是使用通配符进行过滤。

通配符:用来匹配值得一部分的特殊字符。

搜索模式:由字面值、通配符或者两者组合构成的搜索条件。

在Mysql中使用通配符搜索,必须使用关键字LIKE,跟在LIKE后面的值会进行统配匹配而不是精选匹配。

LIKE不属于操作符,而属于谓词,这里只是做个概念输出,其实我也不知道啥意思,以后遇到专业的不要不认识就OK

百分号(%)通配符

在开发中我们最常见到的通配符就是百分号通配符。百分号代表的含义是包含一切字符出现一切的次数。

SELECT * FROM my_user WHERE `name` LIKE '小%';

上面的SQL中我们使用了LIKE '小%',这里的%在字的后面,所以他会匹配以字开头的所有名字。

如果我们把百分号放在前面

SELECT * FROM my_user WHERE `name` LIKE '%颖';

该语句表示查询所有以结尾的名字。

通配符还可以使用多个

SELECT * FROM my_user WHERE `name` LIKE '%空%';

这样我们就可以查询包含字的所有名字,无论在开头还是结尾还是中间。

还有一种情况,比较少见,但是也可以查询,就是通配符在字符中间,那么就表示已X开头Y结尾的字符。

SELECT * FROM my_user WHERE `name` LIKE '星%颖';

所以,上面的SQL意思为,查询已开头的,并且以结尾的名字。

提醒

  1. Mysql默认的配置中,模糊查询不区分大小写。但是修改设置,区分大小写,则小写字母不能匹配大写,反之亦然。

  2. 如果在一个字符最后有一个空格,比如小颖 后面有个空格,那么%颖无法匹配小颖。解决办法就是在最后加个%,变成%颖%

  3. %可以匹配很多东西,但是不可以匹配NULL,即使使用LIKE '%'也不能匹配NULL

  4. LIKE后面匹配的内容需要使用单引号括起来,比如LIKE '%小%'

下划线(_)通配符

下划线通配符(_)与(%)通配符有点儿相似,但是也不同。%可以匹配任意多个字符,而(_)只能匹配一个字符。

SELECT * FROM my_user WHERE `name` LIKE '_颖';

该例子与上面一个很相似,但是上面的例子匹配到了小颖星空幻颖两个用户。这是由于(_)只能匹配一个字符,所以星空幻颖的颖字前面有3个字符,所以无法被匹配。而小颖正好符合。

其他情况也是一样,当(_)放在后面,表示只能匹配后面一个字符。

经验:

  1. %通配符可以匹配任意多个,包括0个字符。而(_)只能匹配一个,一个也不能多,一个也不能少。

  2. 由于通配符查询时间会比其他搜索时间长,所以不要过度使用。尽量优选其他解决方案。

  3. 通配符放在开始处,搜索速度最慢,能不放在最前面就不要放在最前面。

  4. 通配符摆放位置一定要注意,否则会返回不想要的结果。

通配符在开发中还是非常常用的。如果只是做简单的搜索,是个不错的选择。如果数据量太大,则需要考虑其他解决方案。后面的文章中我们会提及各种大量数据搜索情况。

附录

创建my_user表的语句:

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for my_user
-- ----------------------------
DROP TABLE IF EXISTS `my_user`;
CREATE TABLE `my_user` (
  `user_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  `age` tinyint(2) NOT NULL DEFAULT '0',
  `password` varchar(40) NOT NULL,
  `code` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of my_user
-- ----------------------------
INSERT INTO `my_user` VALUES ('1', '小红', '20', '7c4a8d09ca3762af61e59520943dc26494f8941b', '2arfs5dr6m');
INSERT INTO `my_user` VALUES ('2', '小明', '19', '7c4a8d09ca3762af61e59520943dc26494f8941b', 'd59tg6dr5h');
INSERT INTO `my_user` VALUES ('3', '小黄', '25', '7c4a8d09ca3762af61e59520943dc26494f8941b', 'w56tg9hjn3');
INSERT INTO `my_user` VALUES ('4', '小颖', '25', '7c4a8d09ca3762af61e59520943dc26494f8941b', 'a5d23e9yh5');
INSERT INTO `my_user` VALUES ('5', '星空幻颖', '22', '7c4a8d09ca3762af61e59520943dc26494f8941b', '86d2sadft9');

图片所示的软件工具是navicat,更多的 数据库管理软件,也可以百度:笔点资源,更多开发干货资源集合

星空幻颖,严颖

个人主页:segmentfault

内容来源:https://segmentfault.com/a/1190000008063719

用户评论
开源开发学习小组列表