6.4 使用LIKE操作符实现模糊查询
在使用SQL语句进行查询时,经常会遇到这样一种情况,就是不能完全确定所需要查询信息的完整条件,但是这些信息又具有某些明显的特征。例如,想学习SQL语言,希望到图书馆中找一些相关的资料,但是又不知道有关SQL语言的书都有哪些,这个时候一般都会在图书管理系统中输入关键字SQL,这样与SQL有关的所有书籍就都会查到了。这就是模糊查询。在SQL语言中就提供了用于模糊查询的关键字LIKE,它需要和通配符“%”和“_”配合使用。这一节就来介绍如何使用LIKE来实现模糊查询。
6.4.1 匹配任意单个字符
在SQL语句中,通配符“_”表示匹配单个字符。即在查询语句中,一个“_”只能表示匹配一个字符。下面来看一个使用“_”的例子。
例6.13 查询学生信息表中7位学生编号中以s开头并以3结尾的学生信息。
SELECT stuID,stuName,age,sex,birth FROM T_student WHERE stuID LIKE's_____3'
例题明确需要查询的学生编号是7位,并且给定了其中第一位和最后一位的查询条件,因此需要使用的通配符是“_”。在WHERE子句中,使用了5个“_”,每一个“_”只能表示匹配学生编号中的任意一个字符。其查询结果如图6.12所示。
图6.12 查询学生信息表中7位学生编号中以s开头并以3结尾的学生信息
这条SQL语句是从学生信息表中选择学生编号为7位的并且以字符s开头以数字3作为学生编号的最后一位的所有学生信息。从查询的结果可以看到,所检索出来的学生编号都是7位,并且学生编号的开头字符都是s,结尾数字都是3。
除了使用LIKE和通配符“_”进行匹配任意单个字符的模糊查询,也可以使用NOT LIKE和通配符“_”查询不匹配任意单个字符的记录。来看下面这个例子。
例6.14 查询学生信息表中不匹配7位学生编号中以s开头并以3结尾的学生信息。
SELECT stuID,stuName,age,sex,birth FROM T_student WHERE stuID NOT LIKE's_____3'
由于这里要查询学生信息表中不匹配7位学生编号中以s开头并以3结尾的学生信息,所以需要使用NOT LIKE关键字进行模糊查询,其查询的结果如图6.13所示。
图6.13 查询学生信息表中不匹配7位学生编号中以s开头并以3结尾的学生信息
从查询的运行结果可以看到,使用NOT LIKE关键字查询出来的结果和使用LIKE关键字查询出来的结果正好是相反的。
注意 和字符串的比较一样,MySQL数据库中的LIKE操作符在进行匹配时,对字母的大小写不敏感。即在例6.13和例6.14中,LIKE操作符后面的字符s无论是大写还是小写,其查询的结果是一样的。
6.4.2 匹配0个或者多个字符
在SQL语句中,通配符“%”表示匹配0个或者多个字符。即一个“%”可以表示0个字符,也可以表示一个字符,还可以表示两个或者更多的字符。下面来看一个使用“%”的例子。
例6.15 查询学生信息表中姓王的所有学生的信息。
SELECT stuID,stuName,age,sex,birth
FROM T_student
WHERE stuName LIKE'王%'
这里使用的通配符是“%”。例题中需要查询的是学生信息表中姓王的所有学生的信息,而姓王学生的名字有的是两个字的,有的可能是三个字的,所以这里使用“%”通配符来匹配学生信息表中所有姓王的学生信息。其查询结果如图6.14所示。
图6.14 查询学生信息表中姓王的所有学生的信息
这条SQL语句是从学生信息表中选择所有以“王”字开头的学生信息。这里的WHERE子句中的LIKE'王%'表示会匹配任何一个以“王”字开头的所有学生的信息。无论这个姓王的学生的名字是两个字还是三个字,都会被检索出来。
注意 LIKE关键字后面的匹配字符必须要使用单引号。另外,在对字母进行匹配时,要注意区分字母的大小写。
同6.4.1节中“_”通配符的使用一样,也可以使用NOT LIKE和通配符“%”查询不匹配0个或者多个字符的记录。读者可以参看例6.12自己试一下,这里就不再举例了。
说明 在Microsoft SQL Server数据库中除了支持“%”通配符和“_”通配符之外,还支持使用“[ ]”和“[^]”通配符。其中通配符“[ ]”表示查询某一个范围内的所有单个字符,通配符“[^]”用来表示那些不在某一个指定范围内的字符。例如在Microsoft SQL Server数据库中,要想知道查询的字段是否匹配abcd,SQL语句可以这样写LIKE [abcdd](或者LIKE [abcdd])。同理,如果想匹配abcd以外的字符就可以使用LIKE [^abcdd](或者LIKE [^abcdd])。
6.4.3 使用转义字符
在使用SQL执行模糊查询时,有时数据表某个字段中的字符值本身就含有“%”或者是“_”这两个字符。开发人员希望在查询时,将字符值本身就含有“%”或者是“_”两个字符作为该字符的一部分查询出来,这个时间就需要使用ESCAPE关键字对其进行转义操作。使用ESCAPE关键字进行转义操作步骤如下:
(1)在需要转义的“%”或者是“_”字符前加一个转义符,该转义符可以是一个任意字符。
(2)在ESCAPE关键字后指定该转义符的名称。
经过这两个步骤之后,位于该转义符之后的那个通配符(“%”或者是“_”字符)就会被转义为一个普通字符。下面看一个使用转义字符的例子。
例6.16 查询院系信息表中院系编号对应的院系信息。
SELECT deptID,deptName FROM T_dept WHERE deptID like '%$_%' ESCAPE '$'
其中deptID表示院系编号,deptName表示院系名称。由于在院系信息表中院系编号是以字符_数字的形式组合而成的,所以要想完整地输出院校编号,需要使用ESCAPE关键字对院系编号字段中的记录进行转义操作。其查询结果如图6.15所示。
图6.15 查询院校信息表中院校编号对应的院校信息
从查询结果可以看到。包含有_的院系编号字段信息完整地显示了出来。这里的转义符使用的是“$”,也可以使用其他的字符。只要将该转义符放到需要转移到通配符的前面,并且使用ESCAPE关键字定义了转义符,就可以将该通配符转换为一个普通字段来处理。
说明 需要转义的“%”或者是“_”字符前加的这个转义符可以是一个任意字符。例如可以是一个字母,也可以是一个“/”等。读者可以试一下,将例6.16中的“$”符号换成字母a,看一下查询结果是否一样。