SQL语句-DQL(数据查询语言)中排序、分页功能详解
2023-12-11 16:46:52排序
取出按照某个字段升序或者降序进行排列的结果集,用 ORDER BY 关键字来实现。
SELECT [字段名1, ..., 字段n] FROM 表名 [WHERE 条件] [ORDER BY 字段名1 [DESC|ASC], 字段名2 [DESC|ASC], ...字段名n [DESC|ASC] ];
desc|asc: 排序顺序关键字,desc是descend简写,表示降序,asc是ascend简写,表示升序。
如果不写排序关键字,默认是asc,升序排列
ORDER BY 后面可以跟多个排序字段,每个排序字段后可以有不同的排序顺序。
如果排序字段的值一致,则值相同的字段按照第二个排序字段进行排序,以此类推。如果只有一个排序字段,这些字段相同的记录,则无需排列。
例如:
(1)在student表中,按照分数降序(从上到下,依次减少)排列学生信息:
SELECT * FROM student ORDER BY score DESC;
(2)在student表中,学生按照分数降序排列,如果分数相同,则按照年龄降序排序:
SELECT * FROM student ORDER BY score DESC, age DESC;
分页
取出的结果集只需要显示其中一部分,用 LIMIT 关键字来实现,语法如下:
SELECT [字段名1, ..., 字段n] FROM 表名 [WHERE 条件] [LIMIT 起始偏移量, 记录数];
起始偏移量,默认是0,如果是0,默认可以省略
记录数: 展示的记录行数
注意:LIMIT 只是mysql的分页关键字,不同的数据库可能不一样。
例如:
(1)取出排名前3的学生信息:
SELECT * FROM student LIMIT 0, 3;
// 或者
SELECT * FROM student LIMIT 3;
(2)取出第二页,每页3个的学生信息:
SELECT * FROM student LIMIT 3, 3;
如果pageSize表示每页的记录数,pageNo表示当前页码(从1开始),那么:
起始偏移量:(pageNo - 1) * pageSize
记录数:pageSize
student表和teacher表创建及插入数据完整语法
语法如下:
SELECT [字段名1, 字段名2, ...字段名n] [, function_name] FROM 表名 WHERE 条件1, 条件2, ...条件n GROUP BY 分组字段列表 [WITH ROLLUP] HAVING 分组后条件列表 ORDER BY 排序字段列表 LIMIT 分页参数
首先,创建student和teacher表:
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT "主键id",
name varchar(10) UNIQUE NOT NULL COMMENT "学生名称",
age INT COMMENT "学生年龄",
teacher_id INT COMMENT "学生辅导员id",
score INT NOT NULL COMMENT "学生分数"
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO
student (name, age, teacher_id, score)
VALUES
("李红", 20, 1, 80),
("刘涛", 10, 1, 90),
("王武", 19, 2, 80),
("李明", 18, null, 90),
("李小明", 15, null, 99);
CREATE TABLE teacher (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT "主键id",
name VARCHAR(10) UNIQUE NOT NULL COMMENT "辅导员名称"
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO teacher (name) VALUES ("王老师"), ("蒋老师");
ALTER TABLE student ADD CONSTRAINT fk_teacher_id FOREIGN KEY (teacher_id) REFERENCES teacher(id);