数据库系列3——条件查询:把数据“筛对、排对”(WHERE/逻辑/范围/null/LIKE 一次讲透)

数据库系列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 的学生",而是:

  1. 扫描 student2 表的每一行
  2. 对每一行执行判断:age >= 18
  3. 只有判断为真的行,才能进入结果集

工程提示:

  • 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------高级查询:从查数据到算结果》

数据库系列4:高级查询:排序 分页 聚合 分组 过滤一次讲透

数据库系列5:子查询:把查询拆成"中间结果"的工程思维

相关推荐
198******126346 分钟前
2026企业AI办公工具选型指南:从评估框架到场景适配
大数据·运维·人工智能
OxYGC13 分钟前
[AI工程]Jev 决策模型第二篇:三原语、一次多问与置信度路由,从 Playground 到能上线的代码
人工智能
楚来客14 分钟前
AI基础概念之十四:时空Transformer架构
人工智能·深度学习·transformer
u13013025 分钟前
AI 日报(2026年10月2日)
人工智能
吠品37 分钟前
CSS图片模糊过渡:一个transition加filter就够
java·数据库·notepad++
数字化顾问1 小时前
(138页PPT)流程体系的建设优化与运营(附下载方式)
大数据·运维·人工智能
梦想不只是梦与想2 小时前
对象存储服务器vs数据库
数据库·对象存储·图片存储
知了学历孙老师2 小时前
非全硕士上课怎么安排:周末班、集中班还是网络班
人工智能·考研·福建成考
ksueh2 小时前
AI网文创作软件实测:蛙趣拼文是我筛完留下的一款
人工智能·ai写作·ai工具·ai写小说
凯哥Java2 小时前
写代码怎么避免逻辑漏洞?
java·开发语言·人工智能·自动化