今天一个同事说他写了一个 sql 语句查询没有结果,他是这样写的
- SELECT * FROM Persons WHERE City LIKE '[BLN]%'
那么就再理一下:
SQL 通配符是使用特殊字符或语法拼写,用来执行模糊搜索指令的语句。查询数据库中的数据时,sql 通配符可以替代一个或多个字符。使用是必须与 LIKE 运算符一起使用。在 SQL 中可以使用的通配符有:
通配符 | 说明 |
% | 替代一个或多个字符 |
- | 仅替代一个字符 |
[charlist] | 字符列中的任何一个字符 |
[^charlist] 或 [!charlist] | 不在字符列中的任何单一字符 |
"%":匹配任意数目的字符(零个或多个);"_": 匹配任何单个字符;
在使用通配符时 可以用 LIKE 或 NOT LIKE 比较操作符,而不能用 = 或 !=
以 user 表为例:
查询以 a 结尾的记录:select * from user where username like '%a';
查询以 a 开头的用户名:select * from user where username like 'a%';
查询不是以 a 开头的用户名:select * from user where username like 'a%';
查询包含 a 的用户名:select * from user where username like '%a%';
查询有两个字符的用户名:select * from user where username like '__';
重点在这里:
MySQL 模式匹配的其他类型是使用扩展正则表达式,使用 REGEXP 和 NOT REGEXP 操作符 (或 RLIKE 和 NOT RLIKE,之后遇到 HIVE 可以自己查下 LIKE 、RLIKE)。
扩展正则表达式的一些字符是:
"." 匹配任何单个的字符,一个字符类 "[...]" 匹配方括号内的任何字符如,"[abc]" 匹配 "a"、"b" 或 "c"。为了命名字符的一个范围,使用一个连接符 "-" 。"[a-z]" 匹配任何小写字母,而 "[0-9]" 匹配任何数字。
"*" 匹配零个或多个在它前面的东西。例如,"x*" 匹配任何数量的 "x" 字符,"[0-9]*"匹配的任何数量的数字,而".*" 匹配任何数量的任何字符。
另外,正则表达式是区分大小写的,当然也可以使用一个字符类同事匹配大小写如,"[aA]" 匹配小写或大写的 "a" 而 "[a-zA-Z]" 匹配两种写法的任何字母。
为定位一个模式,以便匹配目标值的开始或末尾,在模式开始处使用 "^" 或在模式的结尾用 "$"。 下面是使用 REGEXP 写 LIKE 查询:
查询 city 以 "L" 开头的人信息,使用 "^" 匹配名字的开始并且 "[lL]" 匹配小写或大写的 "l"
- select * from Persons where City REGEXP "^[lL]";
查询 lastname 以 "sh" 结尾的人,使用 "$" 匹配名字的结尾:
- SELECT * FROM Persons WHERE LastName REGEXP "sh$";
查询 lastname 包含一个 "A" 的人,使用 "[aA]" 匹配小写或大写的 "a":
- SELECT * FROM Persons WHERE LastName REGEXP "[aA]";
查询 city 名恰好包含 6 个字符的记录,使用 "^" 和 "$" 匹配名字的开始和结尾,和 6 个 "." 实例在两者之间:
- SELECT * FROM Persons WHERE city REGEXP "^......$";
也可以使用 "{n}"" 重复 n 次 " 操作符:
- SELECT * FROM pet WHERE name REGEXP "^.{6}$";
来源: