zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

[Mysql] ORDER BY排序检索数据

mysql排序数据 by order 检索
2023-09-11 14:22:54 时间

对查询结果进行排序是一个很常见的需求,我们可以使用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的组合,能够找出一个列中最高或最低的值