《MySQL 入门教程》第 11 篇 限制查询结果数量
2020-06-26 04:12
651 查看
文章目录
MySQL 中的
LIMIT子句可以用于限制查询返回结果的数量,从而实现常见的 Top-N 查询和分页查询等功能。
📝在 SQL 标准中,定义了
FETCH子句实现查询结果数量的限制。如果使用 Oracle、SQL Server 或者 PostgreSQL,可能会见到这种语法。
11.1 LIMIT 子句
在查询语句中使用
LIMIT子句的语法如下:
SELECT col1, col2, ... FROM table_name [WHERE conditions] [ORDER BY ...] LIMIT [off_set,] row_count;
其中,
- off_set 指定一个行偏移量,从第 off_set + 1 行开始返回数据。默认值为 0,表示从第一行开始返回。
- row_count 指定返回记录的上限数量。
这两个参数都必须是大于等于 0 的整数。例如,以下查询返回了 10 位员工的信息:
select emp_name, sex from employee limit 10; emp_name|sex | ---------|----| 刘备 |男 | 关羽 |男 | 张飞 |男 | 诸葛亮 |男 | 黄忠 |男 | 魏延 |男 | 孙尚香 |女 | 孙丫鬟 |女 | 赵云 |男 | 廖化 |男 |
除了以上语法形式的
LIMIT子句之外,MySQL 也支持以下写法(兼容 PostgreSQL):
LIMIT row_count OFFSET off_set
因此,上面的示例也可以写成:
select emp_name, sex from employee limit 10 offset 0;
一般而言,
LIMIT子句很少单独使用,而是和
ORDER BY子句一起返回更有意义的数据。
11.2 Top-N 查询
Top-N 查询通常用于返回按照指定规则排序之后的前 N 条记录,例如销售排行榜。
以下查询用于获取最先入职的前 5 名员工:
select emp_name, hire_date from employee order by hire_date limit 5; emp_name |hire_date | ----------|----------| 刘备 |2000-01-01| 关羽 |2000-01-01| 张飞 |2000-01-01| 孙尚香 |2002-08-08| 孙丫鬟 |2002-08-08|
执行该语句时,先按照 hire_date 从早到晚进行排序;然后通过
LIMIT子句限制返回前 5 条记录。如果将 hire_date 降序排序,可以获取到目前为止最后入职的 5 名员工。
⚠️这种返回 Top-N 的方式存在一个局限性,就是如果最后有多条记录排名相同,只能随机选择其中一些数据返回。这个问题我们可以利用窗口函数解决,在后续文章中会介绍 MySQL 8.0 新增的窗口函数。
11.3 分页查询
在应用程序的前端页面中,通常不会直接显示全部数据,而是采用分页显示的方式。下图是我的 CSDN 博客关注列表:
首先会返回一个记录总数,然后每页显示 15 条记录,并且提供“上一页”、“下一页”等跳转功能。返回总数的方法就是使用 COUNT(*) 函数,例如:
select count(*) from employee; count(*)| --------| 25|
员工表中总共有 25 条记录,COUNT(*) 属于聚合函数,我们在后续文章中将会进行介绍。
然后就是通过
LIMIT子句获取指定页码中对应的数据,实现的方法就是排序后跳过指定的行数,再返回 Top-N 记录。假如我们需要按照月薪从高到低显示员工信息,每页显示 10 条记录;意味着最多需要 3 页。以下查询可以用于返回第 3 页的数据(第 21 到第 25 条记录):
select emp_id,emp_name, sex, hire_date,salary from employee order by salary desc limit 20, 10; emp_id|emp_name |sex |hire_date |salary | ------|---------|----|----------|-------| 22|糜竺 |男 |2018-03-27|4300.00| 21|黄权 |男 |2018-03-14|4200.00| 19|庞统 |男 |2017-06-06|4100.00| 20|蒋琬 |男 |2018-01-28|4000.00| 23|邓芝 |男 |2018-11-11|4000.00|
由于第 3 页是最后一页,返回的结果数量只有 5 条。
对于应用程序而言,传递给数据库的参数 off_set 等于(页码 - 1)乘以每页显示的记录数,参数 row_count 就是每页显示的记录数。
11.4 返回指定名次
基于分页查询的实现,我们还可以获取指定名次的数据,也就是第 N 行数据。例如,以下查询返回了销售部奖金第 2 高的员工:
select emp_id,emp_name, bonus from employee where dept_id = 5 order by bonus desc limit 1, 1; emp_id|emp_name |bonus | ------|----------|-------| 19|庞统 |2000.00|
销售部所有员工按照奖金从高到低的排名结果如下:
select emp_id,emp_name, bonus from employee where dept_id = 5 order by bonus desc; emp_id|emp_name |bonus | ------|----------|-------| 18|法正 |5000.00| 19|庞统 |2000.00| 20|蒋琬 |1500.00| 21|黄权 | | 22|糜竺 | | 23|邓芝 | | 24|简雍 | | 25|孙乾 | |
相关文章推荐
- MySQL使用LIMIT限制查询结果的数量
- MySQL中对查询结果排序和限定结果的返回数量的用法教程
- MySQL中对查询结果排序和限定结果的返回数量的用法教程
- mysql常用基础操作语法(六)--对数据排序和限制结果数量的条件查询【命令行模式】
- 将MySQL查询结果按值排序的简要教程
- J2EE入门视频教程第五讲——MySQL中的数据类型及命令行基本查询语句
- MySQL入门教程7 —— 常用数据库查询的示例
- 将MySQL查询结果按值排序的简要教程
- mysql入门(union合并查询结果十三)
- mysql查询结果加序号
- 使用navicat for mysql 将查询语句过滤的结果导出成insert语句时没有带表名的解决办法
- mysql navcate longblob 查询结果导出倒入
- MySQL入门到全面精通视频教程 全40讲
- ArcGIS API For Javascript中queryTask查询返回结果限制为1000的解决办法
- mysql基础入门知识查询
- mysql ---distincyt/过滤查询的结果
- mysql中将查询结果新建(或者叫做另存为一张表)表并增加一列自增的id
- 21分钟 MySQL 入门教程
- PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
- 21分钟 MySQL 入门教程