📄 一句话概括
WHERE 符号第二箱:IN 一网捞多条、LIKE 模糊匹配(% 万能牌)、IS NULL 专抓空——NULL 不能用 = 找,是本节的灵魂。
📝 本节和前面几节的关系
3-9 的符号管【数值大小】;本节管三种它管不了的活:【值在一串名单里】【只记得一部分】【压根没有值】。上一节埋的【钱七查不到】的伏笔,在本节 IS NULL 处回收。
一、IN:名单制查询
查【2 班或 3 班】:
-- 准备块(没建表先跑 3-6 的准备块)
-- 写法一:OR 串联
SELECT * FROM students WHERE class = 2 OR class = 3;
-- 写法二:IN 一网捞(等价,更清爽)
SELECT * FROM students WHERE class IN (2, 3);
IN (2, 3)=【值在这份名单里就留】- 名单长时(几十个值)IN 优势碾压——一句顶五十个 OR
- 也有反向:
NOT IN (1)——名单之外的都留
二、LIKE:模糊匹配的两个通配符
只记得【姓张】或【名字两个字】?LIKE 来了:
| 通配符 | 意思 | 示例 |
|---|---|---|
% |
任意长度的任意字符 | '张%'=张开头的一切 |
_ |
恰好一个字符 | '__'=恰好两个字 |
SELECT * FROM students WHERE name LIKE '张%'; -- 张三(张开头)
SELECT * FROM students WHERE name LIKE '__'; -- 所有两个字的名字(张三/李四/王五/赵六/钱七)
%能空、能长能短:【%三%】抓【名字里带三】的一切_一板一眼只算一个位
三、IS NULL:抓【没有值】的人
回收上一节伏笔——为什么 score = NULL 查不到钱七?
NULL 是【没有值】,不是【某个值】——连它自己都不等于自己,所以 = NULL 永远不成立。抓它要用专门的句子:
-- 查没有分数的人
SELECT * FROM students WHERE score IS NULL;
输出:钱七那一行。
IS NULL:抓空的IS NOT NULL:抓有值的
四、动手 Demo:三招连打
-- ① IN:1 班和 2 班
SELECT * FROM students WHERE class IN (1, 2);
-- ② LIKE:名字恰好两个字
SELECT * FROM students WHERE name LIKE '__';
-- ③ IS NULL:谁没分数
SELECT * FROM students WHERE score IS NULL;
-- ④ IS NOT NULL:谁有分数(4 行,钱七出局)
SELECT * FROM students WHERE score IS NOT NULL;
看到什么算成功:③只有钱七、④是前四行——【空的和有的一刀两断】。
五、30 秒实验
亲手验证 NULL 的怪脾气:
SELECT * FROM students WHERE score = NULL; -- 0 行!
SELECT * FROM students WHERE score != 60; -- 4 行——钱七也不在!
第二条最颠覆:NULL 连【不等于 60】都不成立——它对一切比较都装死。想抓它只有 IS NULL 这一把钥匙。
六、常见误区
- "查空值写 score = NULL" —— 错!NULL 不是值,
=找不到它;必须 IS NULL。这是全 SQL 最高频的错误之一。 - "LIKE 的 % 和 _ 可以混着随意用" —— 各有分工:
%任意长、_恰一位;【姓张且名两个字】要写'张_'而不是'张%'。 - "IN 只能配数字" —— 文本也行:
name IN ('张三', '李四');名单里是字符串要带引号。
自测三问(点开对答案)
1. `class = 2 OR class = 3` 的清爽等价写法? **`class IN (2, 3)`**。 2. LIKE 的两个通配符各是什么意思? **`%`=任意长度任意字符,`_`=恰好一个字符**。 3. 为什么 `= NULL` 查不到空值?正确写法? **NULL 不是值、对一切比较装死;必须写 `IS NULL`**。- ☐ 下一节(3-11 UPDATE-更新记录)
相关笔记
- !=、>、>=、<、<=、BETWEEN-用于查询的符号1-不相等的值、指定值的范围 —— 上一节:符号第一箱
- 🗄️ 数据库基础 · 索引 —— 全课路线图