SQL每日刷题总结

SQL—day2

题目

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

示例:

+----+--------+
| Id | Salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+

例如上述 Employee 表,SQL查询应该返回 200 作为第二高的薪水。如果不存在第二高的薪水,那么查询应返回 null

+---------------------+
| SecondHighestSalary |
+---------------------+
| 200                 |
+---------------------+

说明:所有电子邮箱都是小写字母。

预备知识


limit n : 表示查询结果返回前n条数据
offset n : 表示跳过x条语句
limit y offset x 分句表示查询结果跳过 x 条数据,读取前 y 条数据

select * from table limit 2 offset 1;     

//limit后面跟的是2条数据,offset后面是从第1条开始读取,含义是从第1条(不包括)数据开始取出2条数据,即读取第2,3条


limit i,n
i:为查询结果的索引值(默认从0开始),当i=0时可省略i
n:为查询结果返回的数量
i与n之间使用英文逗号”,”隔开

select * from table limit 2,1;    

含义是跳过2条取出1条数据,limit后面是从第2条开始读,读取1条信息,即读取第3条数据


IFNULL函数

IFNULL(expression_1,expression_2); 

如果expression_1不为NULL,则IFNULL函数返回expression_1; 否则返回expression_2的结果

思路

1. 利用 limit 进行限制,此方法还可适用于求第N高的薪水
2. 如果没有这样的第二最高工资,这个解决方案将被判断为 “错误答案”,因为本表可能只有一项记录。为了克服这个问题,我们可以将其作为临时表。附加一个嵌套查询,内层查询结果为为空时,将 Null 附给 SecondHighestSalary 使得其返回值为 Null;
3. IFNULL函数保证null的情况

代码

select (
	select distinct salary 
	from Employee 
	order by salary desc 
	limit 1,1) 
as SecondHighestSalary 
select IFNULL(
	(select distinct Salary 
	from Employee
	order by Salary desc
	limit 1,1),null) 
as SecondHighestSalary
SELECT IFNULL(
    (select distinct t.Salary 
    from(
        select salary,
            rank() over (order by salary desc) as ranking
        from Employee) as t
    where t.ranking =2),NULL)
    as 'SecondHighestSalary'

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/second-highest-salary

查询表格里第N高的薪水记录

窗口函数

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  RETURN (
      select distinct Salary from 
      (select dense_rank() 
      over(order by Salary desc) num,
      Salary from Employee) as t 
      where t.num=N
  );
END

limit offset

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET N = N-1;
  RETURN (
      select ifnull(
          (select distinct salary
            from Employee
            order by Salary desc 
            limit 1 offset N),null)
      as getNthHighestSalary //可有可无
      
  );
END

limit

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
SET N=N-1;
  RETURN (
      select distinct Salary 
      from Employee
      order by Salary desc 
      limit N,1
  );
END

本文地址:https://blog.csdn.net/weixin_45880764/article/details/110678559

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐