数据库系列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:子查询:把查询拆成"中间结果"的工程思维

相关推荐
草莓熊Lotso2 小时前
Qt 显示与输入类控件进阶:数字、进度、输入框实战攻略
java·大数据·开发语言·c++·人工智能·qt
山峰哥2 小时前
SQL调优实战:从索引到执行计划的深度优化指南
大数据·开发语言·数据库·sql·编辑器·深度优先
jkyy20142 小时前
慢病智能管理+精准营销:健康有益赋能保健品行业价值重构
大数据·人工智能
heze092 小时前
sqli-labs-Less-26a
数据库·mysql·网络安全
azoo2 小时前
cv2.mean() 用于计算图像的像素值的平均值
人工智能·opencv·计算机视觉
啵啵鱼爱吃小猫咪2 小时前
机器人几何雅可比与解析雅可比
人工智能·学习·算法·机器学习·matlab·机器人
汗流浃背了吧,老弟!2 小时前
Function Call实战:图书查询助手Agent
人工智能
渡我白衣2 小时前
从线性到非线性——神经网络的原理、训练与可解释性探索
开发语言·javascript·人工智能·深度学习·神经网络·机器学习·数字电路
橘子132 小时前
MySQL表的内外连接(九)
数据库·mysql·adb