数据库系列3------条件查询:把数据"筛对、排对"(WHERE/逻辑/范围/NULL/LIKE 一次讲透)
本文是【数据库工程系列】的一部分。
如果你已经能写 SELECT,但经常遇到:
- 条件一多就乱
- AND / OR 写完结果不对
- NULL 怎么判断都不安心
那这一篇,解决的就是:
让查询真正具备"判断力"。
0. 开篇:为什么说 WHERE 是查询真正"有判断力"的开始?
在上一篇里《简单查询:把数据"拿出来"(SELECT 基础能力一次讲透)》,我们解决的是:数据怎么拿出来 。
但只会 SELECT,本质上只是"把菜端上桌"。
WHERE 的出现,才让查询开始具备判断力。
在真实工程里,几乎所有有价值的查询,都是:
在一堆数据中,判断哪些行"有资格"进入结果集。
这一步做错了,后面再怎么排序、分页,都是错的。
1. 条件查询的基本形态:SELECT + FROM + WHERE(先记住这个"骨架")
条件查询的最小工程骨架是:
sql
SELECT *
FROM student2
WHERE age >= 18;
工程视角
这条 SQL 做的不是"查年龄 ≥18 的学生",而是:
- 扫描
student2表的每一行 - 对每一行执行判断:
age >= 18 - 只有判断为真的行,才能进入结果集
工程提示:
WHERE永远是"筛行"的- 没有
WHERE的查询,在真实系统里通常是高风险操作
2. 关系运算符:数据库的"真假判断"
关系运算符负责回答一个问题:
这一行,条件成立吗?
sql
SELECT *
FROM student2
WHERE age >= 20;
常用关系运算符:
=等于<>不等于><>=<=
sql
SELECT *
FROM student2
WHERE city <> '成都';
工程视角
- 每一行都会被代入判断
- 判断结果只有两个:真 / 假
常见坑:
- 把条件理解成"对表判断",而不是"对每一行判断"
3. 逻辑运算符:AND / OR / NOT(括号 = 你的思考顺序)
逻辑运算符用来组合多个条件。
sql
SELECT *
FROM student2
WHERE age >= 18 AND city = '成都';
OR 的优先级陷阱(必须重视)
很多人会写出这样的 SQL:
sql
SELECT *
FROM student2
WHERE age >= 18 AND city = '成都' OR city = '重庆';
真实执行逻辑是:
text
(age >= 18 AND city = '成都') OR city = '重庆'
这通常不是你想要的。
正确写法:用括号表达你的思考顺序
sql
SELECT *
FROM student2
WHERE age >= 18
AND (city = '成都' OR city = '重庆');
工程提示:
括号不是语法装饰,是判断逻辑本身。
4. 范围关键字:BETWEEN / IN(区间 vs 集合)
BETWEEN:连续区间
sql
SELECT *
FROM student2
WHERE age BETWEEN 18 AND 25;
等价于:
sql
WHERE age >= 18 AND age <= 25;
工程提示:
- BETWEEN 只适合连续数值区间
IN:离散集合
sql
SELECT *
FROM student2
WHERE city IN ('成都', '重庆', '北京');
等价于多个 OR:
sql
WHERE city = '成都'
OR city = '重庆'
OR city = '北京';
工程提示:
IN 表达的是"属于这个集合",不是范围。
5. NULL 关键字:SQL 里"未知/不存在"的语义
这是条件查询里最容易写错的一点。
错误写法(非常常见)
sql
SELECT *
FROM student2
WHERE phone = NULL;
正确写法
sql
SELECT *
FROM student2
WHERE phone IS NULL;
或:
sql
SELECT *
FROM student2
WHERE phone IS NOT NULL;
工程视角
- NULL 表示:未知 / 不存在
- 它不等于 0,也不等于空字符串
常见坑:
- ❌
= NULL - ❌
!= NULL
工程提示:
判断 NULL,只能用 IS / IS NOT。
6. 模糊匹配 LIKE:把"模糊意图"交给数据库
LIKE 用来处理不精确的查询意图。
sql
SELECT *
FROM student2
WHERE name LIKE '张%';
通配符含义
%:任意长度字符_:单个字符
必须掌握的课堂案例
查询姓马,且名字正好三个字的学生
sql
SELECT *
FROM student2
WHERE name LIKE '马__';
解释:
- 第一个字:马
- 后两个字:任意字符
- 总长度:3 个字
工程提示:
%用于"模糊长度"_用于"精确字符数"
7. 本篇小结:条件查询的"工程模板"与习惯
安全条件查询模板(工程推荐)
sql
SELECT
id,
name,
age,
city
FROM student2
WHERE age >= 18
AND city IN ('成都', '重庆')
AND phone IS NOT NULL
LIMIT 10;
一句话总结
WHERE 决定谁"能进来",
条件判断决定"凭什么进来",
括号决定你的逻辑顺序,
NULL 和 LIKE 决定你是否真的"筛对了数据"。
到这里,你已经可以:
- 精确控制"哪些行有资格进入结果集"
- 正确处理 AND / OR 的优先级
- 安全应对 NULL 与 LIKE 的真实语义
但接下来,真实业务会提出新的问题:
我不想看明细,我想看"结果"。
比如:平均值、Top N、每组统计。
👉 下一篇:《数据库系列4------高级查询:从查数据到算结果》