[MySQL] 排序与分页(二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: [MySQL] 排序与分页(二)

每页显示20条记录,此时显示第2页:

第一条记录的位置偏移量是0,第二条记录的位置偏移量是1,每页显示20条,第二页第一条为第21条,所以要显示第二页偏移量为 (21-1)=20。

SELECT employee_id, last_name
FROM employees
LIMIT 20, 20;

每页显示20条记录,此时显示第3页:

第一条记录的位置偏移量是0,第二条记录的位置偏移量是1,每页显示20条,第三页第一条为第41条,所以要显示第三页偏移量为 (41-1)=40。

SELECT employee_id, last_name
FROM employees
LIMIT 40, 20;

3.1 每页显示pageSize条记录,此时显示第pageNo页:

由上面的例子:

第一页偏移量:( 1 - 1 ) * 20

第二页偏移量:( 2 - 1 ) * 20

第三页偏移量:( 3 - 1 ) * 20

可以得出,每页显示pageSize条记录,此时显示第pageNo页的偏移量计算公式为: ( pageNo - 1 ) * pageSize

3.2 WHERE … ORDER BY …LIMIT 声明顺序如下:

SELECT employee_id,last_name,salary
FROM employees
WHERE salary > 6000
ORDER BY salary DESC
LIMIT 0,10;

注意:LIMIT 子句必须放在整个SELECT语句的最后

表里有107条数据,我们只想要显示第 32、33 条数据:

# 表里有107条数据,我们只想要显示第 32、33 条数据
SELECT employee_id, last_name
FROM employees
# 偏移量为 要显示的第一条数据的行数减一
LIMIT 31, 2;

3.3 MySQL8.0新特性:LIMIT … OFFSET …

例如,“LIMIT 3 OFFSET 4”,意思是获取从第5条记录开始后面的3条记录,和“LIMIT 4,3;”返回的结果相同。

LIMIT … OFFSET … :

从查询出来的结果集拿去 N 条数据 ( LIMIT … ) ,偏移 M 个位置 ( OFFSET … )

表里有107条数据,我们只想要显示第 32、33 条数据:

# 表里有107条数据,我们只想要显示第 32、33 条数据
SELECT employee_id, last_name
FROM employees
# 获取 32 33 条数据 => 获取两条数据
# 从 32 条开始 => 偏移量为 (32-1)
LIMIT 2 OFFSET 31;

查询员工表中工资最高的员工信息:

# 查询员工表中工资最高的员工信息
SELECT employee_id, last_name, salary
FROM employees
# 查询工资最高,倒序排序,选出第一个
ORDER BY salary DESC
LIMIT 1 OFFSET 0;
# 或
SELECT employee_id, last_name, salary
FROM employees
ORDER BY salary DESC
LIMIT 0, 1;

3.4 拓展

LIMIT 可以使用在MySQL、PGSQL、MariaDB、SQLite 等数据库中使用,表示分页,需要放到 SELECT 语句的最后面。

不能使用在SQL Server、DB2、Oracle!

4 排序与分页练习

题目:

# 1. 查询员工的姓名和部门号和年薪,按年薪降序,按姓名升序显示
# 2. 选择工资不在 8000 到 17000 的员工的姓名和工资,按工资降序,显示第21到40位置的数据 
# 3. 查询邮箱中包含 e 的员工信息,并先按邮箱的字节数降序,再按部门号升序

解答:

  • #1. 查询员工的姓名和部门号和年薪,按年薪降序,按姓名升序显示
#1. 查询员工的姓名和部门号和年薪,按年薪降序,按姓名升序显示
  SELECT last_name, department_id, (salary*12) AS annual_sal
  FROM employees
  ORDER BY annual_sal DESC, last_name ASC;

  • #2. 选择工资不在 8000 到 17000 的员工的姓名和工资,按工资降序,显示第21到40位置的数据
#2. 选择工资不在 8000 到 17000 的员工的姓名和工资,按工资降序,显示第21到40位置的数据
SELECT last_name, salary
FROM employees
WHERE salary>17000 OR salary<8000
ORDER BY salary DESC
LIMIT 20,20;
# 或
SELECT last_name, salary
FROM employees
WHERE salary NOT BETWEEN 8000 AND 17000
ORDER BY salary DESC
LIMIT 20,20;

  • #3. 查询邮箱中包含 e 的员工信息,并先按邮箱的字节数降序,再按部门号升序
#3. 查询邮箱中包含 e 的员工信息,并先按邮箱的字节数降序,再按部门号升序
SELECT last_name, email, department_id
FROM employees
WHERE email LIKE '%e%'
# 字节数 邮箱的长度
# length() 求长度
ORDER BY length(email) DESC, department_id ASC;
# 或
SELECT last_name, email, department_id
FROM employees
WHERE email REGEXP '[e]'
ORDER BY length(email) DESC, department_id ASC


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
SQL 缓存 关系型数据库
如何解决MySQL 的深度分页问题?
在构建高性能Web应用程序时,数据库查询性能至关重要。本文深入探讨了MySQL中`LIMIT ... OFFSET ...`语法的性能瓶颈,并介绍了一种更高效的分页方法——游标分页(Cursor Pagination)。通过记录每页最后一个记录的唯一标识,游标分页能显著提升查询效率,将时间复杂度从O(n + m)降低到O(log n + m),特别适用于大规模数据的分页查询场景。此外,文章还介绍了其他优化方法,如覆盖索引分页、分区表、缓存和基于时间戳的分页,并提供了实践中的最佳建议,帮助开发者选择最适合的分页策略,提升系统性能和用户体验。
198 9
|
1月前
|
缓存 算法 关系型数据库
MySQL底层概述—8.JOIN排序索引优化
本文主要介绍了MySQL中几种关键的优化技术和概念,包括Join算法原理、IN和EXISTS函数的使用场景、索引排序与额外排序(Using filesort)的区别及优化方法、以及单表和多表查询的索引优化策略。
MySQL底层概述—8.JOIN排序索引优化
|
20天前
|
监控 关系型数据库 MySQL
MySQL和SQLSugar百万条数据查询分页优化
在面对百万条数据的查询时,优化MySQL和SQLSugar的分页性能是非常重要的。通过合理使用索引、调整查询语句、使用缓存以及采用高效的分页策略,可以显著提高查询效率。本文介绍的技巧和方法,可以为开发人员在数据处理和查询优化中提供有效的指导,提升系统的性能和用户体验。掌握这些技巧后,您可以在处理海量数据时更加游刃有余。
75 9
|
3月前
|
关系型数据库 MySQL PHP
php实现一个简单的MySQL分页
通过本文的详细步骤和代码示例,我们实现了一个简单的PHP MySQL分页功能。主要步骤包括计算总记录数、设置分页参数、查询当前页的数据以及生成分页链接。这种分页方式适用于大多数Web应用,能够有效提升用户体验和页面响应速度。
90 4
|
3月前
|
SQL 关系型数据库 MySQL
mysql分页读取数据重复问题
在服务端开发中,与MySQL数据库进行数据交互时,常因数据量大、网络延迟等因素需分页读取数据。文章介绍了使用`limit`和`offset`参数实现分页的方法,并针对分页过程中可能出现的数据重复问题进行了详细分析,提出了利用时间戳或确保排序规则绝对性等解决方案。
166 1
|
4月前
|
SQL NoSQL 关系型数据库
2024Mysql And Redis基础与进阶操作系列(5)作者——LJS[含MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页等详解步骤及常见报错问题所对应的解决方法]
MySQL DQL基本查询:select;简单、排序、分组、聚合、分组、分页、INSERT INTO SELECT / FROM查询结合精例等详解步骤及常见报错问题所对应的解决方法
|
5月前
|
缓存 关系型数据库 MySQL
一文彻底弄懂MySQL优化之深度分页
【10月更文挑战第24天】本文深入探讨了 MySQL 深度分页的原理、常见问题及优化策略。首先解释了深度分页的概念及其带来的性能和资源问题。接着介绍了基于偏移量(OFFSET)和限制(LIMIT)以及基于游标的分页方法,并分析了它们的优缺点。最后,提出了多种优化策略,包括合理创建索引、优化查询语句和使用数据缓存,帮助提升分页查询的性能和系统稳定性。
398 1
|
5月前
|
SQL 搜索推荐 关系型数据库
MySQL 如何实现 ORDER BY 排序?
本文详细解析了MySQL中`ORDER BY`的实现原理及优化方法。通过解析与优化、执行及多种优化技术,如索引利用、内存排序、外部排序等,帮助你提升排序性能。了解其背后的机制,可显著优化查询效率。
332 4
|
6月前
|
算法 关系型数据库 MySQL
MySQL高级篇——排序、分组、分页优化
排序优化建议、案例验证、范围查询时索引字段选择、filesort调优、双路排序和单路排序、分组优化、带排序的深分页优化
|
5月前
|
SQL 搜索推荐 关系型数据库
MySQL 如何实现 ORDER BY 排序?
在实际开发中,我们经常会使用 MySQL 的 `ORDER BY`进行排序,那么,`ORDER BY`是如何实现的排序的?我们该如何优化 `ORDER BY`的排序性能?这篇文章,我们来聊一聊。
70 3