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