第10周 数据排序与WHERE条件过滤
第10周 · 数据排序与 WHERE 条件过滤
上週学了 SELECT 看数据。这周加两个"筛选+排列"的能力:WHERE 决定哪些行进来,ORDER BY 决定以什么顺序显示。两者经常一起用。
一、知识点:WHERE 的作用位置
SELECT 的执行顺序是:FROM 取表 → WHERE 筛行 → SELECT 定列 → ORDER BY 排序。
WHERE 在"行"层面过滤,不符合条件的整行都不会进入结果。
二、操作教程:比较运算
SELECT * FROM student WHERE sage > 18; -- 年龄大于18
SELECT * FROM student WHERE sdept = '计算机系'; -- 等于(文本加引号)
SELECT * FROM student WHERE sage <> 18; -- 不等于(也可写 !=)
SELECT * FROM student WHERE sage >= 19 AND sage <= 21;
比较运算符:
=><>=>=<=<>(不等于)。文本值必须单引号,数字不用。
三、操作教程:范围查询 BETWEEN … AND
-- 年龄 18~20(含两端)
SELECT sname FROM student WHERE sage BETWEEN 18 AND 20;
等价于 sage >= 18 AND sage <= 20,但 BETWEEN 更简洁,且两端都包含。
四、操作教程:集合查询 IN( )
-- 查计算机系或软件工程系的学生
SELECT * FROM student
WHERE sdept IN ('计算机系', '软件工程系');
-- 等价于
SELECT * FROM student
WHERE sdept = '计算机系' OR sdept = '软件工程系';
IN 适合"等于多个离散值"的场景,比一堆 OR 清爽。
五、操作教程:NULL 值判断(重点)
NULL 表示"未知/没填",不能用 = 判断,必须用 IS NULL:
SELECT * FROM student WHERE sage IS NULL; -- 年龄没填的
SELECT * FROM student WHERE sage IS NOT NULL; -- 年龄填了的
易错:
WHERE sage = NULL是错误写法,永远查不到(NULL 不等于任何值,包括它自己)。记住:判空用IS NULL。
六、知识点:逻辑组合 AND / OR / NOT 与优先级
| 运算符 | 含义 |
|---|---|
AND |
同时满足 |
OR |
满足其一 |
NOT |
取反 |
优先级:NOT > AND > OR。混合用时用括号 () 明确优先级,避免歧义。
七、操作教程:ORDER BY 排序
SELECT * FROM student ORDER BY sage ASC; -- 年龄升序(默认就是 ASC)
SELECT * FROM student ORDER BY sage DESC; -- 年龄降序
-- 多列排序:先按年龄降序,年龄相同再按学号升序
SELECT * FROM student ORDER BY sage DESC, sid ASC;
ASC升序可省略;DESC降序必须写。ORDER BY一定写在WHERE之后。
八、综合:WHERE + ORDER BY 配合
-- 计算机系的学生,按年龄从大到小排
SELECT * FROM student
WHERE sdept = '计算机系'
ORDER BY sage DESC;
九、综合实操:作业三题
-- 题1:按年龄降序,同岁按学号升序
SELECT * FROM student ORDER BY sage DESC, sid ASC;
-- 题2:年龄 18~20 的姓名
SELECT sname FROM student WHERE sage BETWEEN 18 AND 20;
-- 题3:(计算机系且年龄>18) 或 软件工程系
SELECT sname, sdept FROM student
WHERE (sdept='计算机系' AND sage>18) OR sdept='软件工程系';
十、易混点排查表
| 现象 | 解决方法 |
|---|---|
WHERE sage = NULL 查不到 |
NULL 用 IS NULL,不能用 = |
| AND/OR 混用结果不对 | 用括号明确优先级,记住 NOT>AND>OR |
BETWEEN 不含端点 |
实际包含两端;要排除用 > < |
| 排序没生效 | ORDER BY 必须写在 WHERE 之后 |
| DESC 写成 DSEC | 拼写是 DESC |
| 文本值漏引号报错 | 文本必须单引号 '计算机系' |
十一、小测验(自测)
- 查年龄 18~20 含两端,用
BETWEEN怎么写?BETWEEN包含端点吗? - 查"计算机系且年龄>18,或软件工程系"的 SQL?为什么这里要加括号?
- 判断某列"为空"为什么不能写
= NULL?正确写法是什么? ORDER BY sage DESC, sid ASC的排序规则是什么?ORDER BY应该写在WHERE前还是后?
【声明】本文由 AI 辅助生成,仅供 MySQL 数据库教学参考,如有疑误以教材为准。
浙公网安备 33010602011771号