龙空技术网

《MySQL 入门教程》第 11 篇 限制结果数量

编程仔日常 51

前言:

现在看官们对“oracle的bonus”可能比较关切,大家都想要剖析一些“oracle的bonus”的相关资讯。那么小编也在网络上网罗了一些关于“oracle的bonus””的相关文章,希望看官们能喜欢,朋友们快快来学习一下吧!

文章来源:

原文作者:不剪发的Tony老师

来源平台:CSDN

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, sexfrom employeelimit 10; emp_name|sex |---------|----|刘备      |男  |关羽      |男  |张飞      |男  |诸葛亮     |男 |黄忠      |男  |魏延      |男  |孙尚香     |女 |孙丫鬟     |女 |赵云      |男  |廖化      |男  |

除了以上语法形式的LIMIT子句之外,MySQL 也支持以下写法(兼容 PostgreSQL):

LIMIT row_count OFFSET off_set

因此,上面的示例也可以写成:

select emp_name, sexfrom employeelimit 10 offset 0;

一般而言,LIMIT子句很少单独使用,而是和ORDER BY子句一起返回更有意义的数据。

11.2 Top-N 查询

Top-N 查询通常用于返回按照指定规则排序之后的前 N 条记录,例如销售排行榜。

以下查询用于获取最先入职的前 5 名员工:

select emp_name, hire_datefrom employeeorder by hire_datelimit 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 分页查询

在应用程序的前端页面中,通常不会直接显示全部数据,而是采用分页显示的方式。

首先会返回一个记录总数,然后每页显示 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,salaryfrom employeeorder by salary desclimit 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, bonusfrom employeewhere dept_id = 5order by bonus desclimit 1, 1;emp_id|emp_name  |bonus  |------|----------|-------|    19|庞统      |2000.00|

销售部所有员工按照奖金从高到低的排名结果如下:

select emp_id,emp_name, bonusfrom employeewhere dept_id = 5order by bonus desc;emp_id|emp_name  |bonus  |------|----------|-------|    18|法正      |5000.00|    19|庞统      |2000.00|    20|蒋琬      |1500.00|    21|黄权      |       |    22|糜竺      |       |    23|邓芝      |       |    24|简雍      |       |    25|孙乾      |       |

如果你在学习过程中遇到任何问题,欢迎留言提问,不用客气!

对了,在这里说一下,我目前是在职Java开发,如果你现在正在学习Java,了解Java,渴望成为一名合格的Java开发工程师,在入门学习Java的过程当中缺乏基础入门的视频教程,可以关注并私信我:01。获取。我这里有最新的Java基础全套视频教程。

标签: #oracle的bonus #mysql查询一行中不及格的数据怎么办 #oracle 查询怎么限制条数