欢迎光临
我们一直在努力

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

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

本文是【数据库工程系列】的一部分。

如果你已经能写 SELECT,但经常遇到:

  • 条件一多就乱
  • AND / OR 写完结果不对
  • NULL 怎么判断都不安心

那这一篇,解决的就是: 让查询真正具备“判断力”。


0. 开篇:为什么说 WHERE 是查询真正“有判断力”的开始?

在上一篇里《简单查询:把数据“拿出来”(SELECT 基础能力一次讲透)》,我们解决的是:数据怎么拿出来。 但只会 SELECT,本质上只是“把菜端上桌”。

WHERE 的出现,才让查询开始具备判断力。

在真实工程里,几乎所有有价值的查询,都是: 在一堆数据中,判断哪些行“有资格”进入结果集。

这一步做错了,后面再怎么排序、分页,都是错的。


1. 条件查询的基本形态:SELECT + FROM + WHERE(先记住这个“骨架”)

条件查询的最小工程骨架是:

SELECT *
FROM student2
WHERE age >= 18;

工程视角

这条 SQL 做的不是“查年龄 ≥18 的学生”,而是:

  • 扫描 student2 表的每一行
  • 对每一行执行判断:age >= 18
  • 只有判断为真的行,才能进入结果集
  • 工程提示:

    • WHERE 永远是“筛行”的
    • 没有 WHERE 的查询,在真实系统里通常是高风险操作

    2. 关系运算符:数据库的“真假判断”

    关系运算符负责回答一个问题:

    这一行,条件成立吗?

    SELECT *
    FROM student2
    WHERE age >= 20;

    常用关系运算符:

    • = 等于
    • <> 不等于
    • > < >= <=

    SELECT *
    FROM student2
    WHERE city <> '成都';

    工程视角

    • 每一行都会被代入判断
    • 判断结果只有两个:真 / 假

    常见坑:

    • 把条件理解成“对表判断”,而不是“对每一行判断”

    3. 逻辑运算符:AND / OR / NOT(括号 = 你的思考顺序)

    逻辑运算符用来组合多个条件。

    SELECT *
    FROM student2
    WHERE age >= 18 AND city = '成都';

    OR 的优先级陷阱(必须重视)

    很多人会写出这样的 SQL:

    SELECT *
    FROM student2
    WHERE age >= 18 AND city = '成都' OR city = '重庆';

    真实执行逻辑是:

    (age >= 18 AND city = '成都') OR city = '重庆'

    这通常不是你想要的。

    正确写法:用括号表达你的思考顺序

    SELECT *
    FROM student2
    WHERE age >= 18
    AND (city = '成都' OR city = '重庆');

    工程提示:

    括号不是语法装饰,是判断逻辑本身。


    4. 范围关键字:BETWEEN / IN(区间 vs 集合)

    BETWEEN:连续区间

    SELECT *
    FROM student2
    WHERE age BETWEEN 18 AND 25;

    等价于:

    WHERE age >= 18 AND age <= 25;

    工程提示:

    • BETWEEN 只适合连续数值区间

    IN:离散集合

    SELECT *
    FROM student2
    WHERE city IN ('成都', '重庆', '北京');

    等价于多个 OR:

    WHERE city = '成都'
    OR city = '重庆'
    OR city = '北京';

    工程提示:

    IN 表达的是“属于这个集合”,不是范围。


    5. NULL 关键字:SQL 里“未知/不存在”的语义

    这是条件查询里最容易写错的一点。

    错误写法(非常常见)

    SELECT *
    FROM student2
    WHERE phone = NULL;

    正确写法

    SELECT *
    FROM student2
    WHERE phone IS NULL;

    或:

    SELECT *
    FROM student2
    WHERE phone IS NOT NULL;

    工程视角

    • NULL 表示:未知 / 不存在
    • 它不等于 0,也不等于空字符串

    常见坑:

    • ❌ = NULL
    • ❌ != NULL

    工程提示:

    判断 NULL,只能用 IS / IS NOT。


    6. 模糊匹配 LIKE:把“模糊意图”交给数据库

    LIKE 用来处理不精确的查询意图。

    SELECT *
    FROM student2
    WHERE name LIKE '张%';

    通配符含义

    • %:任意长度字符
    • _:单个字符

    必须掌握的课堂案例

    查询姓马,且名字正好三个字的学生

    SELECT *
    FROM student2
    WHERE name LIKE '马__';

    解释:

    • 第一个字:马
    • 后两个字:任意字符
    • 总长度:3 个字

    工程提示:

    • % 用于“模糊长度”
    • _ 用于“精确字符数”

    7. 本篇小结:条件查询的“工程模板”与习惯

    安全条件查询模板(工程推荐)

    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:子查询:把查询拆成“中间结果”的工程思维

    赞(0)
    未经允许不得转载:171主机测评 » 数据库系列3——条件查询:把数据“筛对、排对”(WHERE/逻辑/范围/null/LIKE 一次讲透)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址