SQL WHERE条件查询,讲解的条件过滤都是对已知值进行的过滤,还有一种情况是我们要检索文本中包含某个词的所有数据,这里就需要使用通配符。通配符就是我们用来匹配值的一部分的特殊字符。这里我们需要使用到LIKE操作符。
如果我们想要匹配任意字符串出现的任意次数,需要使用(%)通配符。比如我们想要查找英雄名中包含“太”字的英雄都有哪些:
SELECT name FROM heros WHERE name LIKE '%太%'
运行结果:(2条记录)
需要说明的是不同DBMS对通配符的定义不同,在Access中使用的是(*)而不是(%)。另外关于字符串的搜索可能是需要区分大小写的,比如'liu%'
就不能匹配上'LIU BEI'
。具体是否区分大小写还需要考虑不同的DBMS以及它们的配置。
如果我们想要匹配单个字符,就需要使用下划线()通配符。(%)和()的区别在于,(%)代表零个或多个字符,而(_)只代表一个字符。比如我们想要查找英雄名除了第一个字以外,包含‘太’字的英雄有哪些。
SELECT name FROM heros WHERE name LIKE '_%太%'
运行结果(1条记录):
因为太乙真人的太是第一个字符,而_%太%
中的太不是在第一个字符,所以匹配不到“太乙真人”,只可以匹配上“东皇太一”。
同样需要说明的是,在Access中使用(?)来代替(_
),而且在DB2中是不支持通配符(_
)的,因此你需要在使用的时候查阅相关的DBMS文档。
你能看出来通配符还是很有用的,尤其是在进行字符串匹配的时候。不过在实际操作过程中,我还是建议你尽量少用通配符,因为它需要消耗数据库更长的时间来进行匹配。即使你对LIKE检索的字段进行了索引,索引的价值也可能会失效。如果要让索引生效,那么LIKE后面就不能以(%)开头,比如使用LIKE '%太%'
或LIKE '%太'
的时候就会对全表进行扫描。如果使用LIKE '太%'
,同时检索的字段进行了索引的时候,则不会进行全表扫描。
关于通配符的解释
关于查询语句中通配符的使用理解,我举了一个查询英雄名除了第一个字以外,包含“太”字的英雄都有谁的例子,使用的SQL语句是:
SELECT name FROM heros WHERE name LIKE '_%太%'
(_)匹配任意一个字符,(%) 匹配大于等于0个任意字符。
所以通配符'_%太%'
说明在第一个字符之后需要有“太”字,这里就不能匹配上“太乙真人”,但是可以匹配上“东皇太一”。如果数据表中有“太乙真人太太”,那么结果集中也可以匹配到。
另外,单独的LIKE '%'
无法查出NULL值,比如:SELECT * FROM heros WHERE role_assist LIKE '%'
。