MySQL LIKE:模糊查询

在 MySQL 中,LIKE 关键字主要用于搜索匹配字段中的指定内容。其语法格式如下:

[NOT] LIKE  '字符串'

其中:
  • NOT :可选参数,字段中的内容与指定的字符串不匹配时满足条件。
  • 字符串:指定用来匹配的字符串。“字符串”可以是一个很完整的字符串,也可以包含通配符。

LIKE 关键字支持百分号“%”和下划线“_”通配符。

通配符是一种特殊语句,主要用来模糊查询。当不知道真正字符或者懒得输入完整名称时,可以使用通配符来代替一个或多个真正的字符。 

带有“%”通配符的查询

“%”是 MySQL 中最常用的通配符,它能代表任何长度的字符串,字符串的长度可以为 0。例如,a%b表示以字母 a 开头,以字母 b 结尾的任意长度的字符串。该字符串可以代表 ab、acb、accb、accrb 等字符串。

例 1

在 tb_students_info 表中,查找所有以字母“T”开头的学生姓名,SQL 语句和运行结果如下。
mysql> SELECT name FROM tb_students_info
    -> WHERE name LIKE 'T%';
+--------+
| name   |
+--------+
| Thomas |
| Tom    |
+--------+
2 rows in set (0.12 sec)
可以看到,查询结果中只返回了以字母“T”开头的学生姓名。

注意:匹配的字符串必须加单引号或双引号。

NOT LIKE 表示字符串不匹配时满足条件。

例 2

在 tb_students_info 表中,查找所有不以字母“T”开头的学生姓名,SQL 语句和运行结果如下。
mysql> SELECT NAME FROM tb_students_info
    -> WHERE NAME NOT LIKE 'T%';
+-------+
| NAME  |
+-------+
| Dany  |
| Green |
| Henry |
| Jane  |
| Jim   |
| John  |
| Lily  |
| Susan |
+-------+
8 rows in set (0.00 sec)
可以看到,查询结果中返回了不以字母“T”开头的学生姓名。

例 3

在 tb_students_info 表中,查找所有包含字母“e”的学生姓名,SQL 语句和运行结果如下。
mysql> SELECT name FROM tb_students_info
    -> WHERE name LIKE '%e%';
+-------+
| name  |
+-------+
| Green |
| Henry |
| Jane  |
+-------+
3 rows in set (0.00 sec)
可以看到,查询结果中返回了所有包含字母“e”的学生姓名。

带有“_”通配符的查询

“_”只能代表单个字符,字符的长度不能为 0。例如,a_b可以代表 acb、adb、aub 等字符串。

例 4

在 tb_students_info 表中,查找所有以字母“y”结尾,且“y”前面只有 4 个字母的学生姓名,SQL 语句和运行结果如下。
mysql> SELECT name FROM tb_students_info
    -> WHERE name LIKE '____y';
+-------+
| name  |
+-------+
| Henry |
+-------+
1 row in set (0.00 sec)

LIKE 区分大小写

默认情况下,LIKE 关键字匹配字符的时候是不区分大小写的。如果需要区分大小写,可以加入 BINARY 关键字。

例 5

在 tb_students_info 表中,查找所有以字母“t”开头的学生姓名,区分大小写和不区分大小写的 SQL 语句和运行结果如下。
mysql> SELECT name FROM tb_students_info WHERE name LIKE 't%';
+--------+
| name   |
+--------+
| Thomas |
| Tom    |
+--------+
2 rows in set (0.00 sec)

mysql> SELECT name FROM tb_students_info WHERE name LIKE BINARY 't%';
Empty set (0.01 sec)
由结果可以看到,区分大小写后,“Tom”和“Thomas”等记录就不会被匹配到了。

使用通配符的注意事项和技巧

下面是使用通配符的一些注意事项:
  • 注意大小写。MySQL 默认是不区分大小写的。如果区分大小写,像“Tom”这样的数据就不能被“t%”所匹配到。
  • 注意尾部空格,尾部空格会干扰通配符的匹配。例如,“T% ”就不能匹配到“Tom”。
  • 注意 NULL。“%”通配符可以到匹配任意字符,但是不能匹配 NULL。也就是说 “%”匹配不到 tb_students_info 数据表中值为 NULL 的记录。

下面是一些使用通配符要记住的技巧。
  • 不要过度使用通配符,如果其它操作符能达到相同的目的,应该使用其它操作符。因为 MySQL 对通配符的处理一般会比其他操作符花费更长的时间。
  • 在确定使用通配符后,除非绝对有必要,否则不要把它们用在字符串的开始处。把通配符置于搜索模式的开始处,搜索起来是最慢的。
  • 仔细注意通配符的位置。如果放错地方,可能不会返回想要的数据。

总之,通配符是一种极其重要和有用的搜索工具,以后我们会经常用到它。

拓展

如果查询内容中包含通配符,可以使用“\”转义符。例如,在 tb_students_info 表中,将学生姓名“Dany”修改为“Dany%”后,查询以“%”结尾的学生姓名,SQL 语句和运行结果如下:
mysql> SELECT NAME FROM test.`tb_students_info` WHERE NAME LIKE '%\%';
+-------+
| NAME  |
+-------+
| Dany% |
+-------+
1 row in set (0.00 sec)

推荐文章

addIntHeader(Stringname,intvalue) name:header的名称。 value:整数值。 示例

Python rjust()字符串右对齐方法详解

和ljust()方法类似,不同之处在于,rjust()方法是向字符串的左侧填充指定字符,从而达到右对齐文本的目的。 rjust()方法的基本格式如下: S.rjust(width[,fillcha

Python命名空间包

提到命名空间,其实包含2层含义,一种是语言上下文的命名空间,其实在编写Python程序时,无时无刻都在使用命名空间,比如模块使用的全局命名空间、函数或方法调用的本地命名空间等;另一种命名空间可以在包的

Java生成随机数(random()和random类)

在Java中要生成一个指定范围之内的随机数字有两种方法:一种是调用Math类的random()方法,一种是使用Random类。 Random类提供了丰富的随机数生成方法,可以产生boolean、in

JSP out对象:向客户端输出数据

out对象是一个输出流,用来向客户端输出数据,可以是各种数据类型的内容,同时,它还可以管理应用服务器上的输出缓冲区,缓冲区的默认值是8KB,可以通过页面指令page来改变默认大小。 out对象是一个

lsass.exe是什么程序?

lsass.exe是一个系统进程,用于微软Windows系统的安全机制。它用于本地安全和登陆策略。进程文件:lsass或者lsass.exe进程名称:LocalSecurityAuthoritySer

串是什么,串存储结构的3种实现方法

数据结构中,字符串要单独用一种存储结构来存储,称为串存储结构。这里的串指的就是字符串。 严格意义上讲,串存储结构也是一种线性存储结构,因为字符串中的字符之间也具有"一对一"的逻辑关系。只不过,与之前

PHP Cookie入门教程

Cookie是在HTTP协议下,将服务器传递给浏览器的少量数据保存到用户浏览器的一种方式。通过这种方式,即使在浏览器被关闭和连接中断的情况下,用户仍然可以维护这些数据。 Cookie的使用很普遍,许

JS获取浏览器窗口大小

获取标签的clientWidth和clientHeight属性,就可以知道浏览器窗口的可视宽度和高度,而标签在脚本中表示为document.documentElement。可以这样设计: varw

c语言和c++区别大吗?

c语言和c++是两门相似却完全不同的语言,学任何其中一个都要忘记另一个。c语言和c++有本质的区别,C语言是面向过程的,而C++是面向对象的,下面就给大家梳理梳理。1、C语言有标准的函数库,它们松散的

进程间的五种通信方式是什么?

进程间通信(IPC,InterProcessCommunication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、S

jQuery offset()和position()方法

在jQuery中,很多时候我们需要获取元素的位置,再进行相应的操作。例如在C语言中文网的在线调色板工具中,就是根据元素的位置来确定颜色值的,如图1所示。 图1:在线调色板 如何获取元素的位置?j

JSP Request.getInputStream()方法:获取request对象的输入流

该方法返回页面request请求对象的输入流,用于获得请求中的数据。 语法: getInputStream() 返回值:ServletInputStream类的示例对象,它是request对象的输

MongoDB insert()方法:插入数据

要将数据插入MongoDB集合中,可以使用MongoDB的insert()方法,同时MongoDB针对插入一条还是多条数据,提供了更可靠的insertOne()和insertMany()方法。 Mo

系统的特性是什么?

系统一词来源于英文system的音译,即若干部分相互联系、相互作用,形成的具有某些功能的整体。中国著名学者钱学森认为:系统是由相互作用相互依赖的若干组成部分结合而成的,具有特定功能的有机整体,而且这个

MySQL Event事件(定时任务)是什么?

在数据库管理中,经常要周期性的执行某一命令或SQL语句,于是MySQL5.1版本以后就提供了事件,它可以很方便的实现MySQL数据库的计划任务,定期运行指定命令,使用起来非常简单方便。 事件(Eve

Go语言适合做什么

前面我们已经介绍过了Go语言的种种优势和不足,那么我们究竟可以使用Go语言来做些什么呢? 其实Go语言主要用作服务器端开发,其定位是用来开发“大型软件”的,适合于需要很多程序员一起开发,并且开发周期

Redis和数据库的结合

使用Redis可以优化性能,但是存在Redis的数据和数据库同步的问题,这是我们需要关注的问题。假设两个业务逻辑都是在操作数据库的同一条记录,而Redis和数据库不一致,如图1的场景。 图1  R

Java Object类详解

Object是Java类库中的一个特殊类,也是所有类的父类。也就是说,Java允许把任何类型的对象赋给Object类型的变量。当一个类被定义后,如果没有指定继承的父类,那么默认父类就是Object类。

jQuery attr()和prop()方法的区别

prop()方法和attr()方法相似,都是用来获取或设置元素的HTML属性的,不过两者也有着本质上的区别。 jQuery官方建议:具有true和false这两种取值的属性,如checked、sel