前两篇我们以学生表为例学习了列选择、条件筛选等基础查询技巧,本文将补充查询结果的排序(ORDER BY),并通过 9 个学生场景的实战练习,帮你融会贯通所有知识点,真正掌握 SQL 查询的核心能力。
目录
[一、ORDER BY:查询结果排序](#一、ORDER BY:查询结果排序)
[1. 单列排序](#1. 单列排序)
[2. 多列排序](#2. 多列排序)
[练习 1:查询数学成绩超过 95 分的学生姓名和数学成绩](#练习 1:查询数学成绩超过 95 分的学生姓名和数学成绩)
[练习 2:查询学号为 2024001 的学生姓名和班级 ID](#练习 2:查询学号为 2024001 的学生姓名和班级 ID)
[练习 3:查询数学成绩不在 60-80 分之间的学生姓名和数学成绩](#练习 3:查询数学成绩不在 60-80 分之间的学生姓名和数学成绩)
[练习 4:查询班级 ID 为 2 和 4 的学生姓名和班级 ID,按姓名字母顺序升序排序](#练习 4:查询班级 ID 为 2 和 4 的学生姓名和班级 ID,按姓名字母顺序升序排序)
[练习 5:查询数学成绩在 80-95 分且班级 ID 为 1 或 3 的学生,列名自定义为 "学生姓名""数学成绩"](#练习 5:查询数学成绩在 80-95 分且班级 ID 为 1 或 3 的学生,列名自定义为 “学生姓名”“数学成绩”)
[练习 6:查询未填写地址的学生姓名和地址](#练习 6:查询未填写地址的学生姓名和地址)
[练习 7:查询有加分项的学生姓名、数学成绩、加分项,按数学成绩 + 加分项降序排序](#练习 7:查询有加分项的学生姓名、数学成绩、加分项,按数学成绩 + 加分项降序排序)
[练习 8:查询姓名同时包含 "小" 和 "明" 的学生姓名](#练习 8:查询姓名同时包含 “小” 和 “明” 的学生姓名)
[练习 9:查询班级 ID 为 1、3、5,且数学成绩≠80、85、90 的学生姓名、班级 ID 和数学成绩](#练习 9:查询班级 ID 为 1、3、5,且数学成绩≠80、85、90 的学生姓名、班级 ID 和数学成绩)
一、ORDER BY:查询结果排序
排序是查询中高频需求(如按成绩排名),ORDER BY子句需放在 SQL 语句最后,支持单列 / 多列排序,默认升序(ASC),降序需显式指定(DESC)。
1. 单列排序
语法:
sql
SELECT 列名 FROM 表名 WHERE 条件 ORDER BY 排序列 [ASC/DESC];
示例 1:查询所有学生的姓名和数学成绩,按数学成绩升序排序(ASC 可省略)
sql
SELECT st_name, math_score FROM student ORDER BY math_score;
-- 等价写法
SELECT st_name, math_score FROM student ORDER BY math_score ASC;
示例 2:查询所有学生的姓名和总分,按总分降序排序(从高到低)
sql
SELECT st_name, (math_score + chinese_score) AS 总分 FROM student ORDER BY 总分 DESC;
2. 多列排序
先按第一列排序,第一列值相同时,按第二列排序,以此类推。
示例:查询学生的班级 ID、数学成绩,先按班级 ID 升序,再按数学成绩降序排序
sql
SELECT class_id, math_score FROM student ORDER BY class_id ASC, math_score DESC;
二、综合实战练习(附解析)
以下练习基于student学生表(字段:st_id (学号)、st_name (姓名)、math_score (数学成绩)、chinese_score (语文成绩)、class_id (班级 ID)、address (地址)、bonus (加分项)),涵盖列选择、条件筛选、别名、排序等所有核心知识点。
练习 1:查询数学成绩超过 95 分的学生姓名和数学成绩
sql
SELECT st_name, math_score FROM student WHERE math_score > 95;
解析:基础比较条件(>),筛选数学成绩大于 95 的行。
练习 2:查询学号为 2024001 的学生姓名和班级 ID
解析:精准匹配(=),按学号筛选指定学生。
练习 3:查询数学成绩不在 60-80 分之间的学生姓名和数学成绩
sql
SELECT st_name, math_score FROM student WHERE math_score NOT BETWEEN 60 AND 80;
解析:反向范围筛选(NOT BETWEEN),排除 60-80 分的学生。
练习 4:查询班级 ID 为 2 和 4 的学生姓名和班级 ID,按姓名字母顺序升序排序
解析:多值匹配(IN)+ 单列排序(ORDER BY),字母排序默认按 ASCII 码升序。
练习 5:查询数学成绩在 80-95 分且班级 ID 为 1 或 3 的学生,列名自定义为 "学生姓名""数学成绩"
sql
SELECT st_name AS 学生姓名, math_score AS 数学成绩 FROM student
WHERE math_score BETWEEN 80 AND 95 AND class_id IN (1,3);
解析:范围筛选(BETWEEN)+ 多值匹配(IN)+ 列别名,多条件用 AND 组合。
练习 6:查询未填写地址的学生姓名和地址
sql
SELECT st_name, address FROM student WHERE address IS NULL;
解析:空值判断(IS NULL),筛选地址为空的学生。
练习 7:查询有加分项的学生姓名、数学成绩、加分项,按数学成绩 + 加分项降序排序
sql
SELECT st_name, math_score, bonus FROM student
WHERE bonus IS NOT NULL
ORDER BY (math_score + bonus) DESC;
解析:非空判断(IS NOT NULL)+ 计算列排序,按最终成绩降序展示。
练习 8:查询姓名同时包含 "小" 和 "明" 的学生姓名
sql
SELECT st_name FROM student WHERE st_name LIKE "%小%" AND st_name LIKE "%明%";
解析:模糊匹配(LIKE)+ AND 组合,需同时满足包含 "小" 和 "明"。
练习 9:查询班级 ID 为 1、3、5,且数学成绩≠80、85、90 的学生姓名、班级 ID 和数学成绩
sql
SELECT st_name, class_id, math_score FROM student
WHERE class_id IN(1,3,5) AND math_score NOT IN (80,85,90);
解析:多值匹配(IN)+ 反向多值匹配(NOT IN),组合筛选班级和成绩条件。
总结
- 排序(ORDER BY)需放在语句最后,支持单列 / 多列,ASC(升序)可省略,DESC(降序)需显式指定;
- 实战查询需注意字段名、条件匹配的准确性,多条件组合优先用 IN/NOT IN 简化语句;
- 别名、排序、条件筛选可组合使用,是 SQL 查询的核心组合技巧,结合学生场景练习能快速掌握。
希望这篇文章对你有帮助,如果你有任何问题或建议,欢迎在评论区留言。谢谢阅读(求攒攒 收藏 关注)!
