[Mysql] ORDER BY排序检索数据

本文详细介绍了SQL中的ORDER BY子句用于对查询结果进行排序,包括升序和降序排列,以及如何通过LIMIT子句实现分页。示例展示了如何根据多个字段排序和在相同字段值下按其他字段排序。同时,提到了ORDER BY与LIMIT结合在查询高分或低分记录时的应用,并指出在处理并列排名时的局限性和解决方案。
摘要由CSDN通过智能技术生成

对查询结果进行排序是一个很常见的需求,我们可以使用ORDER BY子句即可达到目的

ORDER BY子句取一个或多个列的名字,据此对输出进行排序

通常,ORDER BY子句中使用的列将是为显示所选择的列。但是,实际上并不一定要这样,用非检索的列排序数据是完全合法的

1.指定排序方向

升序排序(从A到Z) ASC关键字(默认)

降序排序(从Z到A) DESC关键字

2.ORDER BY子句的位置 

在给出ORDER BY子句时,应该保证它位于FROM子句之后。如果使用LIMIT,它必须位于ORDER BY之后。使用子句的次序不对将产生错误消息

导入数据

DROP TABLE IF EXISTS employee_info; 
CREATE TABLE employee_info( 
employee_id VARCHAR(8), 
employee_name VARCHAR(8), 
age INT, 
gender VARCHAR(8), 
salary INT 
) 
ENGINE = InnoDB 
DEFAULT CHARSET = utf8; 
INSERT INTO 
employee_info (employee_id,employee_name,age,gender,salary) 
VALUE ('e001','Bob',28,'male',8000) 
,('e002','Alice',25,'female',6000) 
,('e003','David',26,'male',9000) 
,('e004','Kitty',30,'female',11000) 
,('e005','Allen',24,'male',5500);

employee_info表

1.按单个字段排序

案例1:将查询结果按照age列进行降序排列

SELECT * FROM employee_info ORDER BY age DESC;

结果展示:

案例2:将查询结果按照age列进行升序排列

SELECT * FROM employee_info ORDER BY age ASC;

结果展示:


需要注意的是,如果没有显式指定查询结果的排序方式是升序还是降序,则默认按照升序排列

SELECT * FROM employee_info ORDER BY age;

查询结果和案例2的查询结果相同

2.按多个字段排序

如果按多个字段排序,则先按第一个字段排序,然后针对第一个字段的重复记录再按第二个字段排序,以此类推

为了按多个列排序,只要指定列名,列名之间用逗号分开即可

注意:DESC/ASC关键字只应用到直接位于其前面的列名,如果想在多个列上进行降序/升序排列,必须对每个列指定DESC/ASC关键字

插入两条新数据,代码如下:

INSERT INTO 
employee_info (employee_id,employee_name,age,gender,salary) 
VALUE ('e006','Ben',28,'male',8000)
,('e007','George',26,'male',10000);

插入新数据后的员工信息表

3.将查询结果按照age列进行降序排列,salary列进行升序排列

SELECT * FROM employee_info ORDER BY age DESC,salary ASC;

结果展示:

先按照age列进行降序排列,当age列的各个数据相同时,再按照salary列进行升序排列,观察发现,David和George的年龄相同,都是26岁,而David的薪资比George的薪资低,所以David排在George前面

3.ORDER BY与LIMIT结合

导入数据

DROP TABLE IF EXISTS student_score; 
CREATE TABLE student_score( 
stu_id VARCHAR(8), 
stu_name VARCHAR(8), 
chinese INT, 
mathematics INT, 
english INT, 
total_score INT 
) 
ENGINE = InnoDB 
DEFAULT CHARSET = utf8; 
INSERT INTO 
student_score (stu_id,stu_name,chinese,mathematics,english,total_score) 
VALUE ('s001','Alice',80,90,75,245) 
,('s002','Bob',75,80,90,245) 
,('s003','Kitty',60,75,65,200) 
,('s004','Ben',80,80,80,240) 
,('s005','Allen',90,90,80,260);

student_score(学生成绩表)

问题:按照总分进行排序,并查询总分排在前3名的学生信息,如果他们的总分相同,则按照他们的数学成绩降序排列(查询总分排在前3名的学生信息)

SELECT stu_name,total_score 
FROM student_score 
ORDER BY total_score DESC,mathematics DESC 
LIMIT 3;

结果展示:

排序使用的是ORDER BY子句,限制返回的行数使用的是LIMIT

如果只想找出总分排在前2名的学生信息,则只需要使用如下代码:

SELECT stu_name,total_score 
FROM student_score 
ORDER BY total_score DESC,mathematics DESC 
LIMIT 2;

结果展示:

注意:上述方法有一个缺陷,若存在多个学生的总分并列第2名时,则只能找出一条记录,例如,这里的学生Bob的总分和Alice的总分相同,应该并列第2名,可只显示了Alice的总分。解决该类问题可以使用排序类的窗口函数

扩展

使用ORDER BY和LIMIT的组合,能够找出一个列中最高或最低的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值