首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SQL使用(一):如何使用SQL语句去查询第二高的值

SQL使用(一):如何使用SQL语句去查询第二高的值

作者头像
王豆豆
发布于 2020-07-24 07:01:09
发布于 2020-07-24 07:01:09
6.5K00
代码可运行
举报
文章被收录于专栏:资深Tester资深Tester
运行总次数:0
代码可运行

今天刷MYSQL题的时候刷到这样一个题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 编写一个 SQL 查询,获取 Employee 表中第二高的薪水(Salary) 。

 +----+--------+
 | Id | Salary |
 +----+--------+
 | 1  | 100    |
 | 2  | 200    |
 | 3  | 300    |
 +----+--------+
 例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null+---------------------+
 | SecondHighestSalary |
 +---------------------+
 | 200                 |
 +---------------------+

初看了一眼题时,脑子还有一点迷糊,对于数值最大的和最小的,可以使用max和min去查询出来,但对于第N的就不好找了,思考了一会儿了,心里大致有二个思路:

第一个思路,因为是求的第二高,那就把最高的找出来,小于的它的,然后再排列一下取最大的就行了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 1、求最大的值
select max(Salary)
from Employee;
# 2、求小于最大的值
select max(Salary) as SecondHighestSalary
from Employee
where Salary < (select max(Salary) from Employee);

第二个思路,先将所有值倒序排,然后输出第二个就行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select Salary as SecondHighestSalary
from Employee
order by Salary desc
limit 1,1;
#若是有相同的值,只输出一个,所以加上distinct
select distinct Salary as SecondHighestSalary
from Employee
order by Salary desc
limit 1,1;

然后去执行语句的时候,发现与预期结果相同,心里窃喜,这就算出来了。。。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
输入:
 {"headers": {"Employee": ["Id", "Salary"]}, "rows": {"Employee": [[1, 100], [2, 200], [3, 300]]}}
 输出:
 {"headers": ["Salary"], "values": [[200]]}
预期结果:
 {"headers": ["SecondHighestSalary"], "values": [[200]]}

随着去提交代码之后,返回的结果却是 解答错误,满头的黑人问号脸,哪里错了?怎么错了的?

查看错误详情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 输入:
{"headers": {"Employee": ["Id", "Salary"]}, "rows": {"Employee": [[1, 100]]}}
输出:
{"headers": ["SecondHighestSalary"], "values": []}
预期:
{"headers":["SecondHighestSalary"],"values":[[null]]}

恍然大悟,原来是没有考虑”如果不存在第二高的薪水,那么查询应返回 null“这个情况,找到问题就好办了,这也是我们在代码中写sql时常没有考虑到异常情况。

如果查询不到数据,应该返回什么值,需不需对这种情况进行封装的考虑,这道题里已经要求了,若是没有查询到就输出null,所以再次修改了我的sql:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select ifnull(
                   (select Salary from Employee order by Salary desc limit 1,1), null) as SecondHighestSalary;

结果:顺利通过

这道题主要考察的知识点就是LIMIT的使用和对NULL的处理,之前写过一篇与LIMIT有关的文章,LIMIT在实际使用过程使用情况非常普遍。

知识点总结:

  • LIMIT

LIMIT 一般都是放在SQL语句的最后,是对展示的结果做一个限制输出,比如查询了十条记录,但只展示一条,那就可以在SQL语句后面加一个LIMIT 1。

LIMIT 语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT column_list
FROM table1
ORDER BY column_list
LIMIT row_count OFFSET offset_count;
# row_count 表示 返回的记录数
# offset为偏移量,表示从哪条数据开始返回,使用过程中也可以省略

举例:

1、查询出雇员表中的5条记录

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select * from Employee limit 5;

2、查询出雇员表第二条数据后的5条记录(不包括第二条数据)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#不显示最前面二条数据,从第三条数据开始展示
select * from Employee 5 offset 2;
==
select * from Employee 2,5;-->这是我最喜欢使用的写法
  • IFNULL()

IFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。 菜鸟教程

IFNULL()语法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
IFNULL(expression, alt_value)

举例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select ifnull("111","展示我" );

输出结果:

如果SQL语句是这样写的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select ifnull(null,"展示我" );

输出结果:

上面内容就是这个题想要考察的知识点,其实这些知识点都知道,但在写SQL语句的时候就没有这个意识去考虑异常情况的处理,就像我们经常设计测试用例的时候需要特别对异常场景的考虑,是因为程序最容易出错的地方就是对异常情况的处理,若是不处理那就是一个bug,也许这个bug当时没有体现,但久了就一定会暴露出来。

如果在设计用例或写代码时没有这个思维,那就多练多写,让自己有意识地去考虑异常情况。

最后给大家留一个变种之后难度更高的题,欢迎大家在留言区中给出答案:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 编写一个 SQL 查询,获取 Employee 表中第 n 高的薪水(Salary)。

 +----+--------+
 | Id | Salary |
 +----+--------+
 | 1  | 100    |
 | 2  | 200    |
 | 3  | 300    |
 +----+--------+
 例如上述 Employee 表,n = 2 时,应返回第二高的薪水 200。如果不存在第 n 高的薪水,那么查询应返回 null+------------------------+
 | getNthHighestSalary(2) |
 +------------------------+
 | 200                    |
 +------------------------+

 来源:力扣(LeetCode)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 王豆豆的测试观 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
JAVA安全之Thymeleaf模板注入防护绕过
若依CMS中使用到了Thymeleaf模板引擎且存在模板注入可控点,但是在漏洞测试过程中发现常规的通用载荷并不生效,遂对其进行调试分析,最后发现是和Thymeleaf版本有莫大的关系,其中3.0.12版本增加了多处安全机制来防护模板注入漏洞,本篇文章将基于此背景对Thymeleaf模板的注入防御措施和绕过进行深入刨析
Al1ex
2024/10/14
3730
JAVA安全之Thymeleaf模板注入防护绕过
org.springframework.expression.spel.SpelEvaluationException: EL1011E: Method call: Attempted to call
前言 本文中提到的解决方案,源码地址在:springboot-thymeleaf,希望可以帮你解决问题。 至于为什么已经写了一篇文章thymeleaf模板引擎调用java类中的方法,又多此一举的单独整理了这篇文章,是因为在解决此问题时首先搜索了一下关于此问题的文章,但是网上并没有搜到关于此问题的答案,因此自己做了整理。 问题描述 在springboot与thymeleaf整合过程中,出现了如下报错: ``` org.thymeleaf.exceptions.TemplateProcessingExcepti
程序员十三
2018/03/15
2.1K0
三行代码解决Springboot框架自带异常
近期一个原业务图片上传的接口偶发会报异常,原有高可用方案是当上传七牛云失败上传腾讯云,都失败才会报异常,或者会存在目录创建失败的异常,此类异常重试即可解决,但近期异常如下
疯狂的KK
2023/01/12
4730
三行代码解决Springboot框架自带异常
org.springframework.expression.spel.SpelEvaluationException: EL1004E: Method call: Method service()
前言 本文中提到的解决方案,源码地址在:springboot-thymeleaf,希望可以帮你解决问题。 至于为什么已经写了一篇文章thymeleaf模板引擎调用java类中的方法,又多此一举的单独整理了这篇文章,是因为在解决此问题时首先搜索了一下关于此问题的文章,但是网上并没有搜到关于此问题的答案,因此自己做了整理。 问题描述 在springboot与thymeleaf整合过程中,出现了如下报错: org.thymeleaf.exceptions.TemplateProcessingExcepti
程序员十三
2018/03/15
2.7K0
chaos-monkey-spring-boot小试牛刀
chaos-monkey-spring-boot是专门为Spring Boot打造的Chaos Monkey
code4it
2018/09/17
1.1K0
spring cloud利用feign和sentinel进行内部或外部远程调用
    基于上篇讲解的Sentinel之后,这次讲讲spring cloud环境下最优雅的远程调用方式Feign
chinotan
2019/04/03
3.5K0
spring cloud利用feign和sentinel进行内部或外部远程调用
jxls工具导出excel,报错:Cannot load XLS transformer. Please make sure a Transformer implementation is in cl
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/163882.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/15
1.3K0
还在使用kill -9 pid结束spring boot项目吗?那你已经落伍了!
kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令或jobs指令查看(这段话来自菜鸟教程)。
肉眼品世界
2021/01/25
9680
还在使用kill -9 pid结束spring boot项目吗?那你已经落伍了!
Swagger-ui在文件上传时报错net::ERR_CONNECTION_RESET
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
yingzi_code
2019/08/30
2K0
SpringBoot服务端表单数据校验
1、首先说明一下,这里使用的是Springboot2.2.6.RELEASE版本,由于Springboot迭代很快,所以要注意版本问题。
别先生
2020/05/18
8550
SpringBoot服务端表单数据校验
这才是实现分布式锁的正确姿势!
其实Java世界的”半壁江山”——Spring早就提供了分布式锁的实现。早期,分布式锁的相关代码存在于Spring Cloud的子项目Spring Cloud Cluster中,后来被迁到Spring Integration中。
JAVA葵花宝典
2019/05/24
1.1K0
初学Spring Cloud踩坑之org.springframework.web.client.HttpClientErrorException: 400 null
初学Spring Cloud踩坑之org.springframework.web.client.HttpClientErrorException: 400 null
Java架构师必看
2021/05/14
1.7K0
SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after
SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30001ms.
二十三年蝉
2018/10/11
7.5K0
SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after
springcloud与hystrix整合时freemarker依赖问题分析
乍一看,是 freemarker 解析的问题,但是所有的依赖都是正常情况下处理的,没有头绪。
山行AI
2020/02/11
1.2K0
阿里问题定位神器 Arthas 的骚操作,定位线上BUG,超给力!
公司有个渠道系统,专门对接三方渠道使用,没有什么业务逻辑,主要是转换报文和参数校验之类的工作,起着一个承上启下的作用。
程序员小强
2020/03/23
1.4K0
阿里问题定位神器 Arthas 的骚操作,定位线上BUG,超给力!
feign.FeignException$MethodNotAllowed: status 405 reading xxx#yyy(Integer)
使用feign 调用异常 feign.FeignException$MethodNotAllowed: status 405 reading ConsumerService#findById(Integer)
时间静止不是简史
2020/07/27
2.3K0
feign.FeignException$MethodNotAllowed: status 405 reading xxx#yyy(Integer)
聊聊springcloud的serviceRegistryEndpoint
本文主要研究一下springcloud的serviceRegistryEndpoint
code4it
2018/09/17
1.4K0
SpringBoot整合SpringMVC、持久层技术MyBatis
1、通过使用SpringBoot、SpringMVC、MyBatis整合,实现一个对数据库中的数据表的增加、修改、删除、查询操作。
别先生
2020/05/18
9940
SpringBoot整合SpringMVC、持久层技术MyBatis
zuul报错java.net.UnknownHostException: 4d59d509898a: Name or service not known
是这样的,eureka、zuul和普通的微服务在本地是OK的,部署到docker后,通过zuul访问某个微服务就报错了。用的是serviceId的方式,在eureka界面也能看到各个微服务都是在线的,没有问题,但就是通过zuul的路由访问时会报错。
天涯泪小武
2019/01/17
2.6K0
BadSqlGrammarException:PageHelper use near 'LIMIT 50'
作为一名Java开发人员,你可能在某个深夜,面对着那令人头秃的错误日志,不禁发问:“为什么我的SQL语句总是出错?”今天,就让我们一起深入探讨这个在Java开发项目中常见的问题——org.springframework.jdbc.BadSqlGrammarException,特别是在处理Excel导入时,如何避免这个让人头疼的错误。
疯狂的KK
2025/01/16
2360
BadSqlGrammarException:PageHelper use near 'LIMIT 50'
推荐阅读
相关推荐
JAVA安全之Thymeleaf模板注入防护绕过
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档