MySQL 查询实战(三):排序与综合练习

前两篇我们以学生表为例学习了列选择、条件筛选等基础查询技巧,本文将补充查询结果的排序(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),组合筛选班级和成绩条件。

总结

  1. 排序(ORDER BY)需放在语句最后,支持单列 / 多列,ASC(升序)可省略,DESC(降序)需显式指定;
  2. 实战查询需注意字段名、条件匹配的准确性,多条件组合优先用 IN/NOT IN 简化语句;
  3. 别名、排序、条件筛选可组合使用,是 SQL 查询的核心组合技巧,结合学生场景练习能快速掌握。

希望这篇文章对你有帮助,如果你有任何问题或建议,欢迎在评论区留言。谢谢阅读(求攒攒 收藏 关注)!

相关推荐
Apple_羊先森3 小时前
ORACLE数据库巡检SQL脚本--19、磁盘读次数最高的前5条SQL语句
数据库·sql·oracle
AI视觉网奇3 小时前
ue 角色驱动衣服 绑定衣服
笔记·学习·ue5
全栈前端老曹4 小时前
【MongoDB】Node.js 集成 —— Mongoose ORM、Schema 设计、Model 操作
前端·javascript·数据库·mongodb·node.js·nosql·全栈
三水不滴4 小时前
计网ping原理
经验分享·笔记·计算机网络
神梦流4 小时前
ops-math 算子库的扩展能力:高精度与复数运算的硬件映射策略
服务器·数据库
prog_61034 小时前
【笔记】思路分享:各种大模型免费当agent后台
笔记·大语言模型·agent·cursor
让学习成为一种生活方式4 小时前
trf v4.09.1 安装与使用--生信工具42-version2
数据库
啦啦啦_99995 小时前
Redis-5-doFormatAsync()方法
数据库·redis·c#
凯尔萨厮5 小时前
Maven(Windows下载安装)
笔记·maven
wdfk_prog5 小时前
[Linux]学习笔记系列 -- [drivers][input]serio
linux·笔记·学习