SQL中 limit 和 offset 的用法

刷题的时候遇到一个涉及limit 和 offset解题的。记录一下。

首先记录一下limit 和 offset 的用法

LIMIT语句用于限制从查询结果中返回的记录数。它可以用于分页查询,以限制每页显示的数据量。

下面直接引用文心一言的回答

LIMIT语句通常有两种形式:

LIMIT offset,count:在这种形式中,offset表示从查询结果中的第几行开始返回数据,count表示返回的记录数。
例如,SELECT * FROM table LIMIT 10, 5将返回从第11行开始的5条记录。

offset可以是正整数或负整数。正整数表示从查询结果的起始位置开始返回数据,负整数表示从查询结果的末尾位置开始返回数据。
count必须是正整数,表示返回的记录数。
例如,SELECT * FROM table LIMIT 10, 5将返回查询结果中的第11至第15条记录。 LIMIT count:在这种形式中,count表示返回的记录数。
例如,SELECT * FROM table LIMIT 10将返回前10条记录。

如果未指定offset,则默认从查询结果的起始位置开始返回数据。

自己重新组织一下语言。

LIMIT count可以分为以下两种情况:

  1. 接一个参数时,参数代表返回前多少条记录。
  2. 接两个参数时,第一个参数代表返回记录的起始位置,第二个参数代表返回多少条记录。

LIMIT offset :

LIMIT后面只能有一个参数,表示要取的的数量

offset表示从查询结果中开始返回数据的位置

例:limit 5 offset 2 表示从第3条记录开始取5条记录。

题目:第二高的薪水

Employee 表:
±------------±-----+ | Column Name | Type |
±------------±-----+ | id | int | | salary | int |
±------------±-----+ 在 SQL 中,id 是这个表的主键。 表的每一行包含员工的工资信息。

查询并返回 Employee 表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null(Pandas 则返回 None) 。

查询结果如下例所示。

示例 1:

输入: Employee 表:
±—±-------+ | id | salary |
±—±-------+ | 1 | 100 | | 2 | 200 | | 3 | 300 |
±—±-------+ 输出:
±--------------------+ | SecondHighestSalary |
±--------------------+ | 200 |
±--------------------+ 示例 2:

输入: Employee 表:
±—±-------+ | id | salary |
±—±-------+ | 1 | 100 |
±—±-------+ 输出:
±--------------------+ | SecondHighestSalary |
±--------------------+ | null |
±--------------------+

在知道 limit 和 offset 的用法之前,我第一反应是用窗口函数排序,然后取rank第二的值。
解法如下:

select (
    select salary
    from(
        select
        distinct salary,
        dense_rank() over(order by salary desc) as salary_rank
        from Employee
    ) as t	#必须重命名 
    where salary_rank = 2	#取第二高的薪水
) as SecondHighestSalary	#用临时表解决不存在第二高薪水的问题。

知道 limit 和 offset 的用法后
解决如下:

select (
    select 
    distinct salary
    from 
    Employee
    order by salary desc
    limit 1 offset 1
) as SecondHighestSalary

简单很多,不过在力扣上执行用时第二种比第一种慢,菜鸡还不知道原因。

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值