1. 什么是模糊查询?
模糊查询就是根据一个不明确的条件查询数据,它和精确查询某个值或者某个字段是相对的。
2. 模糊查询的三种方式
- 第①种: 可以用between and 、in、is null、is not null 这些关键字进行模糊匹配查询。
示例:
--使用 between and 查询学号在2~9之间的学生的信息
SELECT * FROM student WHERE sid BETWEEN 2 AND 9;
--使用 in 查询学号为(1,8,10,13)的学生的信息
SELECT * FROM student WHERE sid IN(1,8,10,13);
--使用 is nul 查询email为空的学生的信息
SELECT * FROM student WHERE email IS NULL;
--使用 is not null 查询email不为空的学生的信息
SELECT * FROM student WHERE email IS NOT NULL;
- 第②种: 用like关键字搭配百分号%或者下划线_这两种通配符进行模糊匹配查询。
- % 表示的是匹配任意个数的字符
- _ 表示的是匹配单个字符
示例:
-- 查询name字段中包含五的
select * from user where name like'%五%';
-- 查询name字段中最后一个字符 为 五的
select * from users where name like '%五';
-- 查询name字段中第一个字符 为 王 的
select * from users where name like '王%';
-- 使用 _ 单个的下划线。表示一个任意字符,使用和%类似
-- 查询表中 name 字段为两个字符的数据
select * from users where name like '__';
-- 查询 name 字段最后为五,的两个字符的数据
select * from users where name like '_五';
- 第③种: 用REGEXP关键字,利用正则表达式的方式进行模糊查询匹配。
说明:一般来说前面两种方式就可以解决大部分的业务需求了,但是有时候也需要用正则的方式。
例如,我们要从员工表中查询出姓张的,姓王的,姓李的等多姓氏的员工的话,这个时候用like关键字搭配通配符进行模糊匹配查询的话需要用多个or关键字进行连接,代码很繁琐,如果用正则来进行模糊匹配的话就只需要一个简短表达式。
示例:
-- 查询出张姓、凌姓、马姓的员工的全部信息(like方式)
SELECT * FROM student WHERE sname LIKE '张%' OR sname LIKE '凌%' OR sname LIKE '马%';
-- 查询出张姓、凌姓、马姓的员工的全部信息(正则方式)
SELECT * FROM student WHERE sname REGEXP '^张|^凌|^马';
正则表达式概念:
- 它描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
- 几乎大多数的语言都是支持正则表达的语法的,可以通用。比如Java、c++、python、js…
常用语法:
-- 字符类 --
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)
-- 预定义字符类 --
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
-- 边界匹配器 --
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
-- 数量词 --
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
-- 运算符 --
XY X 后跟 Y
X|Y X 或 Y
(X) 用来将X这个表达式包裹起来