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 查询的核心组合技巧,结合学生场景练习能快速掌握。

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

相关推荐
AC赳赳老秦19 分钟前
DeepSeek教育科技应用:智能生成个性化学习规划与知识点拆解教程
前端·网络·数据库·人工智能·学习·matplotlib·deepseek
枫叶丹41 小时前
【Qt开发】Qt系统(一)-> 定时器 QTimerEvent 和 QTimer
c语言·开发语言·数据库·c++·qt·系统架构
后端小张1 小时前
【AI学习】深入探秘AI之神经网络的奥秘
人工智能·深度学习·神经网络·opencv·学习·机器学习·自然语言处理
d111111111d2 小时前
STM32 GPIO输出模式配置详解:从寄存器层面理解引脚控制
笔记·stm32·单片机·嵌入式硬件·学习
曾浩轩2 小时前
跟着江协科技学STM32之4-1OLED调试工具
科技·stm32·单片机·学习
计算机毕设VX:Fegn08955 小时前
计算机毕业设计|基于springboot + vue在线考试系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
ejjdhdjdjdjdjjsl8 小时前
JSON序列化与反序列化实战指南
数据库·microsoft·c#
CC.GG8 小时前
【C++】STL容器----unordered_map和unordered_set的使用
java·数据库·c++
virtual_k1smet8 小时前
梧桐·鸿鹄- 大数据assistant-level
大数据·笔记
编程小Y9 小时前
如何优化MySQL的查询性能?
数据库·mysql