本文介绍什么是通配符,如何利用通配符进行数据库数据过滤查询。
本文使用的数据表在本文最后附录
简介
之前几篇文章的所有例子查询的条件都是确定的值,比如大于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意思为,查询已星
开头的,并且以颖
结尾的名字。
提醒:
Mysql默认的配置中,模糊查询不区分大小写。但是修改设置,区分大小写,则小写字母不能匹配大写,反之亦然。
如果在一个字符最后有一个空格,比如小颖 后面有个空格,那么
%颖
无法匹配小颖。解决办法就是在最后加个%,变成%颖%
%可以匹配很多东西,但是不可以匹配NULL,即使使用
LIKE '%'
也不能匹配NULLLIKE后面匹配的内容需要使用单引号括起来,比如
LIKE '%小%'
下划线(_)通配符
下划线通配符(_)与(%)通配符有点儿相似,但是也不同。%可以匹配任意多个字符,而(_)只能匹配一个字符。
SELECT * FROM my_user WHERE `name` LIKE '_颖';
该例子与上面一个很相似,但是上面的例子匹配到了小颖
和星空幻颖
两个用户。这是由于(_)只能匹配一个字符,所以星空幻颖的颖字前面有3个字符,所以无法被匹配。而小颖正好符合。
其他情况也是一样,当(_)放在后面,表示只能匹配后面一个字符。
经验:
%通配符可以匹配任意多个,包括0个字符。而(_)只能匹配一个,一个也不能多,一个也不能少。
由于通配符查询时间会比其他搜索时间长,所以不要过度使用。尽量优选其他解决方案。
通配符放在开始处,搜索速度最慢,能不放在最前面就不要放在最前面。
通配符摆放位置一定要注意,否则会返回不想要的结果。
通配符在开发中还是非常常用的。如果只是做简单的搜索,是个不错的选择。如果数据量太大,则需要考虑其他解决方案。后面的文章中我们会提及各种大量数据搜索情况。
附录
创建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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。