like操作符用于模糊匹配。

like支持两个通配符,它们分别是:

  • %通配符,用于匹配多个字符
  • _通配符,用于匹配单个字符

通配符根据所处位置又分为六种匹配方式:

匹配方式 作用
%xx 表示右匹配,右边的xx字符需要完全相等,左边可以是任意字符,也可以没有字符
_xx 表示右匹配,右边的xx字符需要完全相等,左边可以是任意一个字符,必须是一个不能没有字符
xx% 表示左匹配,右边的xx字符需要完全相等,右边可以是任意字符,也可以没有字符
xx_ 表示左匹配,左边的xx字符需要完全相等,右边可以是任意一个字符,必须是一个不能没有字符
%xx% 表示中间匹配,中间必须完全相等,左右两边可以是任意字符,左右两边可以没有其他字符
xx 表示中间匹配,中间必须完全相等,左右两边可以是任意一个字符,左右两边必须是一个不能没有字符


通配符使用

数据准备

  1. SET NAMES utf8mb4;
  2. SET FOREIGN_KEY_CHECKS = 0;
  3. -- ----------------------------
  4. -- Table structure for user
  5. -- ----------------------------
  6. DROP TABLE IF EXISTS `user`;
  7. CREATE TABLE `user` (
  8. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  9. `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名',
  10. `age` int(11) NOT NULL COMMENT '年龄',
  11. `sex` smallint(6) NOT NULL COMMENT '性别',
  12. PRIMARY KEY (`id`) USING BTREE
  13. ) ENGINE = InnoDB AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
  14. -- ----------------------------
  15. -- Records of user
  16. -- ----------------------------
  17. INSERT INTO `user` VALUES (1, '李子捌', 18, 1);
  18. INSERT INTO `user` VALUES (2, '张三', 22, 1);
  19. INSERT INTO `user` VALUES (3, '李四', 38, 1);
  20. INSERT INTO `user` VALUES (4, '王五', 25, 1);
  21. INSERT INTO `user` VALUES (5, '六麻子', 13, 0);
  22. INSERT INTO `user` VALUES (6, '田七', 37, 1);
  23. INSERT INTO `user` VALUES (7, '谢礼', 18, 1);
  24. SET FOREIGN_KEY_CHECKS = 1;

%通配符

%通配符有三种匹配方式,分别是%xx、xx%、%xx%。
%可以匹配多个字符,或者0个字符。

查询user表中姓氏为张的用户

mysql> select * from user where name like '张%';
+----+------+-----+-----+
| id | name | age | sex |
+----+------+-----+-----+
|  2 | 张三 |  22 |   1 |
+----+------+-----+-----+

查询user表中姓名以七结尾的用户

mysql> select * from user where name like '%七';
+----+------+-----+-----+
| id | name | age | sex |
+----+------+-----+-----+
|  6 | 田七 |  37 |   1 |
+----+------+-----+-----+

查询user表中姓名中包含李字符的用户

mysql> select * from user where name like '%李%';
+----+--------+-----+-----+
| id | name   | age | sex |
+----+--------+-----+-----+
|  1 | 李子捌 |  18 |   1 |
|  3 | 李四   |  38 |   1 |
+----+--------+-----+-----+

_通配符

_通配符和%通配符的区别在于只匹配一个字符,并且必须匹配一个字符。

查询user表中姓氏为李,并且名字只有两个中文的用户

mysql> select * from user where name like '李_';
+----+------+-----+-----+
| id | name | age | sex |
+----+------+-----+-----+
|  3 | 李四 |  38 |   1 |
+----+------+-----+-----+

查询user表中名为三的用户

mysql> select * from user where name like '_三';
+----+------+-----+-----+
| id | name | age | sex |
+----+------+-----+-----+
|  2 | 张三 |  22 |   1 |
+----+------+-----+-----+
1 row in set (0.00 sec)

查询user表中姓名为三个子,并且第二个子为麻的用户

mysql> select * from user where name like '_麻_';
+----+--------+-----+-----+
| id | name   | age | sex |
+----+--------+-----+-----+
|  5 | 六麻子 |  13 |   0 |
+----+--------+-----+-----+

通配符使用注意事项

通配符做字符串匹配性能会降低。在使用通配符时注意:

  • 能不用则不用,不用能避免通配符带来的全部问题,如果有其他操作就不要使用like
  • 在使用通配符的地方,尽量缩小查询范围,如果有多个查询条件,尽量将通配符放到其他过滤条件的后面