想要精通算法和SQL的成长之路 - 第N高的薪水(SQL)

  • 前言
  • 一. 第二高的薪水
    • 1.1 offset 的使用
    • 1.2 ifnull 的使用
    • 1.3 分页查询
    • 1.3 总结
  • 二. 第N高的薪水

前言

想要精通算法和SQL的成长之路 - 系列导航

一. 第二高的薪水

原题链接
编写一个 SQL 查询,获取并返回 Employee 表中第二高的薪水 。如果不存在第二高的薪水,查询应该返回 null

我们来建立一张表:

随便插入几条数据:

那么首先,查询薪水的最高值,我们就利用到了 max 函数:

SELECT max(salary) as secondhighestsalary  from Employee

那么查询第二高的怎么办?简而言之就是

  • 排除掉最大值,再查一次max,得到的结果就是第二高的。
SELECTmax( salary ) AS secondhighestsalary
FROMEmployee
WHEREsalary != (SELECT max( salary ) FROM Employee)

1.1 offset 的使用

offset n 的意思代表跳过n条语句。一般和limit一起用。例如:limit n offset m 代表:先跳过m条结果,再取前n条结果。

我们先看下这个SQL

select salary from Employee order by salary desc limit 2

结果如下:

因此我们需要考虑到去重。加一个distinct字段。

此时我们再通过offset来取第二个值,并赋个别名即可:

SELECT( SELECT DISTINCT salary FROM Employee ORDER BY salary DESC LIMIT 1 OFFSET 1 ) AS secondhighestsalary

大家在来思考下,为什么要下面这条SQL不行?

select distinct salary as secondhighestsalary from Employee order by salary desc limit 1 offset 1

如果表里面只有一条数据的话,它的执行效果如下:

不满足返回null的要求。 这么一看,第一个SQL就相当于 select (空数据) as secondhighestsalary 这里就会将对应的字段设置为null。因此得用第一种。

1.2 ifnull 的使用

如果第一个表达式为null,就返回第二个参数的值。否则返回第一个表达式的返回结果。

IFNULL(expression, alt_value)

结果如下:

SELECTifnull( ( SELECT DISTINCT salary FROM Employee ORDER BY salary DESC LIMIT 1 OFFSET 1 ), NULL ) AS secondhighestsalary

1.3 分页查询

简单利用分页即可,limit从0开始,那么我们限制每页的大小是1,取第二页的即是第二大的。

SELECTifnull( ( SELECT DISTINCT salary FROM Employee ORDER BY salary DESC LIMIT 1, 1 ), NULL ) AS secondhighestsalary

1.3 总结

四种方式:

# 第一种,select + where
SELECTmax( salary ) AS secondhighestsalary
FROMEmployee
WHEREsalary != (SELECT max( salary ) FROM Employee)# 第二种 limit 1 offset 1
SELECT ( SELECT DISTINCT salary FROM Employee ORDER BY salary DESC LIMIT 1 OFFSET 1 ) AS secondhighestsalary# 第三种 limit + ifnull
SELECT ifnull( ( SELECT DISTINCT salary FROM Employee ORDER BY salary DESC LIMIT 1 OFFSET 1 ), NULL ) AS secondhighestsalary# 第四种 分页
SELECT ifnull( ( SELECT DISTINCT salary FROM Employee ORDER BY salary DESC LIMIT 1, 1 ), NULL ) AS secondhighestsalary

知识点:

  • ifnull的使用。
  • offset的使用:limit n offset m 代表:先跳过m条结果,再取前n条结果。

二. 第N高的薪水

原题链接
相当于第一个题目的进阶了,直接结果如下:相当于把上面的1替换成N-1

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGINSET N = N - 1;RETURN (SELECT ifnull( ( SELECT DISTINCT salary FROM Employee ORDER BY salary DESC LIMIT 1 OFFSET N ), NULL ) );
END

想要精通算法和SQL的成长之路 - 第N高的薪水(SQL)相关推荐

  1. 想要精通算法和SQL的成长之路 - 两两交换链表中的节点

    想要精通算法和SQL的成长之路 - 两两交换链表中的节点 前言 一. 两两交换链表中的节点 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 两两交换链表中的节点 原题链接 给你一个链表,两两 ...

  2. 想要精通算法和SQL的成长之路 - 超过经理收入的员工(SQL)

    想要精通算法和SQL的成长之路 - 超过经理收入的员工(SQL) 前言 一. 超过经理收入的员工 1.1 自连接 1.2 子查询 1.3 join 语句 前言 想要精通算法和SQL的成长之路 - 系列 ...

  3. 想要精通算法和SQL的成长之路 - 判断子序列问题

    想要精通算法和SQL的成长之路 - 判断子序列问题 前言 一. 判断子序列 1.1 动态规划做法 1.2 双指针 二. 不同的子序列 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 判断子序 ...

  4. 第二高的薪水--sql查询

    LEETCODE题目:编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . +----+--------+ | Id | Salary | +----+-------- ...

  5. 好想学python机器人_【Python成长之路】从零学GUI -- 制作智能聊天机器人

    [写在前面] 鹏哥:最近老惹小燕同学不开心,结果都没人陪我聊天了.哎,好无聊呀! 肥宅男:女朋友什么的最无聊了,还没我的图灵机器人好玩. 鹏哥:图灵?好巧,和我部门同名. [效果如下] [实现过程] ...

  6. C语言基于FOC控制算法和STM32主控芯片的双路直流无刷电机控制器源码

    [FOC+STM32]双路直流无刷电机矢量控制器-使用文档

  7. leetcode176. 第二高的薪水(SQL)

    编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . +----+--------+ | Id | Salary | +----+--------+ | 1  | 10 ...

  8. SQL.176.(简单)第二高的薪水

    编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) . ±-±-------+ | Id | Salary | ±-±-------+ | 1 | 100 | | 2 | ...

  9. 编写一个SQL查询,获取Employee表中第二高的薪水(Salary)

    单选 class X{Y y=new Y();public X(){System.out.print("X");} } class Y{public Y(){System.out. ...

最新文章

  1. 深度对话林元庆:AI创业历史性窗口到来,将诞生下个BAT
  2. Windows下各个盘中的文件夹属性变为隐藏,怎么取消隐藏属性
  3. 在 wxWidgets 中播放声音的示例
  4. cobbler基础安装
  5. maven原型_创建自定义Maven原型
  6. simulink中mask设置_(实现BPSK学习Verilog)1. Simulink仿真实现
  7. php html class,html中规定元素的类名的属性class
  8. java导入错误怎么解决_eclipse导入文件及导入错误的解决方法
  9. wps怎么把当前页面设置为横向_办公软件操作技巧011:如何将word文档的部分页面改为横向...
  10. 从原子操作走向模板部署,详解云上资源自动化部署新模式
  11. 从苏宁电器到卡巴斯基(第二部)第08篇:我在卡巴的日子 VIII
  12. python怎么调用类中的函数_类中的python函数调用
  13. 【BZOJ1061】【NOI2008】志愿者招募 费用流神题、单纯形裸题(代码费用流)
  14. Python使用阿里API进行情感分析
  15. cpp导入excel到mysql_将EXCEL表格中的数据导入mysql数据库表中
  16. 从REINFORCE到PPO,看Policy Gradient的前世今生
  17. Centos8安装vsftpd
  18. 申请CSC公派访问学者的常见问题
  19. Vue 源码 思维导图
  20. 2022最新最全MyBatis(简单全面,一发入魂,内容超详细)

热门文章

  1. ccf:201909-2 小明种苹果(续)
  2. script标签4种的四种用法,你知道几种?
  3. 从chatGPT看AI的未来—“专脑”
  4. 线程池参数和状态详解
  5. mysql 存储年月_php – 在mysql数据库中存储月份和年份
  6. rabbitmq原理及应用--笔记
  7. linux系统出现gnome进程卡死,在Linux系统上修复损坏的Gnome登录屏幕
  8. PCA9685寄存器用法和通信(一)
  9. 《花雕学AI》02:人工智能挺麻利,十分钟就为我写了一篇长长的故事
  10. Mac mini安装内存条和Xcode安装