第11周 高级数据过滤与通配符查询
第11周 · 高级数据过滤与通配符查询
只记得名字里带个"伟"字、不记得全名怎么办?这周学模糊查询:用 LIKE 配通配符去"按模式"找,再了解正则 REGEXP 和取反 NOT。
一、知识点:为什么用模糊查询
= 是"完全相等"匹配,必须一字不差。现实中常只记得片段,就要用 LIKE 做模式匹配。
二、操作教程:LIKE + %(任意多个字符)
% 代表任意长度(含0个)的任意字符。
SELECT * FROM student WHERE sname LIKE '张%'; -- 姓张的(张开头,后面任意)
SELECT * FROM student WHERE sname LIKE '%伟%'; -- 名字里含"伟"
SELECT * FROM student WHERE sname LIKE '%芳'; -- 以"芳"结尾
'张%':开头是张,后面随便。%伟%:前后都可有字,只要中间有伟。
三、操作教程:LIKE + _(单个字符)
_ 代表恰好一个任意字符(不能多也不能少)。
SELECT * FROM student WHERE sname LIKE '张_'; -- 姓张且正好两个字
SELECT * FROM student WHERE sname LIKE '___'; -- 正好三个字的人名
%与_区别:%长度任意,_长度固定为 1。查"姓张单名"用张_;查"姓张任意名"用张%。
四、操作教程:NOT LIKE 取反
-- 名字里不含"王"的
SELECT * FROM student WHERE sname NOT LIKE '%王%';
-- 作业题3:不含"王" 且 年龄<20
SELECT sname, sage FROM student
WHERE sname NOT LIKE '%王%' AND sage < 20;
五、操作教程:ESCAPE 转义
要查"名字里含下划线 _"这种本身也是通配符的字符,得转义:
-- 查名字里含下划线_ 的记录(_ 是字面下划线,不是通配符)
SELECT * FROM student WHERE sname LIKE '%a_%' ESCAPE 'a';
ESCAPE 'a' 表示 a 后面的字符按字面处理,a_ 里的 _ 就是真下划线。
六、知识点:REGEXP 正则表达式(了解)
REGEXP 用正则规则匹配,比 LIKE 更灵活:
SELECT * FROM student WHERE sname REGEXP '^张'; -- 以"张"开头(^ 开头)
SELECT * FROM student WHERE sname REGEXP '伟$'; -- 以"伟"结尾($ 结尾)
SELECT * FROM student WHERE sname REGEXP '伟|芳'; -- 含"伟"或"芳"(| 或)
SELECT * FROM student WHERE sname REGEXP '张.'; -- "张"后跟任意一个字(. 任意单字符)
| 正则符号 | 含义 |
|---|---|
^ |
字符串开头 |
$ |
字符串结尾 |
. |
任意一个字符 |
| |
或 |
考试以
LIKE为主,REGEXP了解即可,别冲淡主线。
七、综合实操:作业三题
-- 题1:姓张(开头)
SELECT * FROM student WHERE sname LIKE '张%';
-- 题2:计算机系或软件工程系(用 IN)
SELECT * FROM student WHERE sdept IN ('计算机系','软件工程系');
-- 题3:不含"王" 且 年龄<20
SELECT sname, sage FROM student
WHERE sname NOT LIKE '%王%' AND sage < 20;
八、易混点排查表
| 现象 | 解决方法 |
|---|---|
% 和 _ 分不清 |
% 任意长,_ 仅1个字符 |
想查"姓张单名"用 张% |
错!单名用 张_ |
| 要查真下划线查不到 | 用 ESCAPE 转义 |
NOT LIKE 漏掉 NULL 行 |
NULL 不参与 LIKE 比较;需 OR 列 IS NULL |
| LIKE 查大表很慢 | 前导通配符 %xx 无法用索引,数据大时慢 |
| REGEXP 写错 | 正则仅了解,主考 LIKE;符号别混 |
九、小测验(自测)
LIKE '张%'和LIKE '张_'分别匹配什么?区别在哪?- 查"名字里含伟"用什么 LIKE 模式?
- 查"名字不含王且年龄小于20"的 SQL 怎么写?
- 正则
^张和伟$中的^、$分别表示什么?
【声明】本文由 AI 辅助生成,仅供 MySQL 数据库教学参考,如有疑误以教材为准。
浙公网安备 33010602011771号