sql Like & Regexp
1. 定义
编程之家解释:
Like
和Regexp
操作符一般与Where
搭配用于搜索和匹配字符字段
。
2. 前言
本小节中,我们将一起学习sql Like
和 sql Regexp
的基本使用。
很多时候,数据表中存储了大量的字符类型字段,如 varchar 和 char 。虽然它们可以和其它类型字段一样通过 > ,= 等基本运算符进行比较和操作。但是字符串的特性较为复杂,当需要字符串匹配时,基本运算符就无法满足了,因此 sql 提供了 Like 和 Regexp两个特殊的操作来处理字符类型。
注意: Like 还可以作用于其它字段类型,如 int ,但一般情况下 int 类型字段直接使用基本运算符就足够了。
本小节测试数据如下,请先在数据库中执行:
DROP TABLE IF EXISTS imooc_user;CREATE TABLE imooc_user( username varchar(), age int);INSERT INTO imooc_user(username,age) VALUES('pedro', ), ('peter', ), ('faker', );
3. sql Like
我们可以直观地将 like 这个单词理解为像
,当与 Where 搭配时,sql语句可以大概的翻译为:搜索某个字段像什么的结果。
sql Like 的语法如下:
SELECT [col] FROM [table_name] WHERE [col] LIKE [val];
其中col
表示字段名称,table_name
表示数据表名称,val
表示条件值。
3.1 例1 单独使用 Like
Like 单独使用时,作用与=
运算符一致。
请书写 sql 语句,查询imooc_user
表中用户名像pedro
的用户。
分析:
题干中明确的指出,查询用户名像 pedro 的用户,可以得出username
是条件字段,LIKE 是操作符,pedro 是条件值。
语句:
整理可得语句如下:
SELECT username, age FROM imooc_user WHERE username LIKE 'pedro';
查询结果如下:
+----------+-----+ | username | age | +----------+-----+ | pedro | 23 | +----------+-----+
在上面例子中,Like 与 Where 搭配,搜索出了 pedro 这个用户。可在 imooc_user 表中不仅有 pedro ,其实还有 peter 这个用户,你能否书写一条 sql 语句,使用 Like 将 pedro 和 peter 二人同时搜索出来了。
单独使用 Like 是无法做到的,但搭配通配符
就可以轻松完成。
4. 通配符
常见的通配符如下:
通配符 | 描述 |
---|---|
% | 匹配一个或多个字符 |
— | 匹配一个字符 |
[char_list] | char_list是一个字符列表,其匹配列表中的任意一个字符 |
[^char_list] | char_list是一个字符列表,其匹配不在列表中的任意一个字符 |
提示:
[^char_list]
与[!char_list]
作用是一样的,即^
和!
等价。
如果你是初次接触通配符,可能还不甚明白,我们还是通过例子来学习。
4.1 例2 Like 搭配单个通配符%
Like 可搭配单个通配符%
,用于匹配特定模式下的字符串。
请书写一条 sql 语句,使用 Like 将pedro
和peter
二人同时搜索出来了。
分析:
现在有了通配符%
,我们就可以轻松的搞定。
语句:
SELECT username, age FROM imooc_user WHERE username LIKE 'pe%';
+----------+-----+ | username | age | +----------+-----+ | pedro | 23 | | peter | 18 | +----------+-----+
%
表示匹配一个或多个字符,pe
是 pedro 和 peter 的前缀,后缀dro
和ter
都以通配符%
来匹配,因此 Like 在匹配搜索的时候迅速地找到了答案。
%
通配符的作用远不止于此。
4.2 例3 Like 搭配两个通配符%
Like 也可搭配两个通配符%
,匹配特定模式下的字符串。
请书写 sql 语句,找出用户名
内(不包括首尾字符)含有e
的用户。
分析:
既然是含有e
,因此e
可以出现在除首尾以外的任何地方,通配符可表示为%e%
。
语句:
SELECT username, age FROM imooc_user WHERE username LIKE '%e%';
结果如下:
+----------+-----+ | username | age | +----------+-----+ | pedro | 23 | | peter | 18 | | faker | 23 | +----------+-----+
%
是最常见的通配符,但有些时候我们也需要精确的位数匹配,这时_
的作用就体现出来了。
4.3 例4 Like 搭配通配符_和%
Like 还可搭配两个不同的通配符%,_
,匹配特定模式下的字符串。
分析:
语句:
整理可得语句如下:
SELECT username, age FROM imooc_user WHERE username LIKE '_e%';
结果如下:
+----------+-----+ | username | age | +----------+-----+ | pedro | 23 | | peter | 18 | +----------+-----+
注意: MysqL 与 Postgresql 均不支持
[char_list]
和[^char_list]
通配符,在实际场景中可以使用正则(Regexp)来替代。
5. sql Regexp
正则表达式可谓是如雷贯耳,与 Like 对比起来,Regexp
更加强大,当然正则表达式的性能不如 Like。
同 Like 一样,sql Regexp 的语法如下:
SELECT [col] FROM [table_name] WHERE [col] REGEXP [val];
其中col
表示字段名称,table_name
表示数据表名称,val
表示条件值。
正则表达式好用却较为复杂,本小节不会介绍正则表达式具体的语法,如果你感兴趣,可以查阅相关资料进行学习。
5.1 例5 使用 Regexp 查询
Regexp 搭配正则表达式,可用于匹配特定模式下的字符串。
请书写 sql 语句,找出imooc_user
表中用户名以p
或f
开头的用户。
分析:
从题干中可以得出,username
是条件字段,条件值是用户名以p
或f
开头,用正则表达式可表示为^[pf]
。
语句:
整理可得语句如下:
SELECT username,age FROM imooc_user WHERE username REGEXP '^[pf]';
结果:
+----------+-----+ | username | age | +----------+-----+ | pedro | 23 | | peter | 18 | | faker | 23 | +----------+-----+
从例子中可以看到 Regexp 的用法几乎与 Like 一致,只不过将条件值从通配符
换成了正则表达式
。