LeetCode-177. 第N高的薪水( Nth Highest Salary)。

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

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

+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 200                    |
+------------------------+

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

解题:

按照176的思路,首先应该排序order by

然后使用用limit子句选择第n个

为排除第n个值可能为null的可能性应该使用ifnull()函数

select ((select * from  Employee order by Salary limit n,1),null)  as  getNthHighestSalary(2)

上边的思路和176题一样,还有更好的方式,应该使用mysql自定义函数。

自定义函数解答方式:

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
DECLARE M INT;
SET M=N-1;
  RETURN (
      # Write your MySQL query statement below.
      SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT M, 1
  );
END

注意:

MySQL创建存储过程时出错(...use near ' 'at line),

分隔符的问题

解决办法是改变分隔符:delimiter //

delimiter //

sql语句

//

mysql的自定义变量:

用户变量:@变量名。用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效

全局变量:set GLOBAL 变量名  或者  set @@global.变量名,对所有客户端生效。只有具有super(超级权限)权限才可以设置全局变量

会话变量:本次连接会话有用的变量

局部变量:作用范围在begin到end语句块之间。declare语句专门用于定义局部变量,本条sql语句使用的就是局部变量。

自定义函数:

函数与存储过程的区别:函数只会返回一个值,不允许返回一个结果集。本题获取第n高,所以是一个值,可以使用函数,函数强调返回值,即使是查询语句也不允许返回多个值的情况出现。

create function 函数名([参数列表]) returns 数据类型
begin
 sql语句;
 return 值;
end;

参数列表的格式是:  变量名 数据类型   与java相反。

create function myfun() returns int return 666;
--函数的调用
select myfun(); 

--有sql语句
create function myfun() returns int
begin 
    declare c int;
    select id from class where cname="python" into c;
    return c;
end;
select myfun();
-- 带参的函数
create function myfun(name varchar(15)) returns int
begin 
    declare c int;
    select id from class where cname=name into c;
    return c;
end;
select myfun("python");

函数的调用:

直接使用函数名()就可以调用(sql中不使用select的话任何结果都无法显示出来(所以单纯调用会报错))

如果想要传入参数可以使用函数名(参数)

调用方式:

-- 无参
select myfun();
-- 传参
select myfun("python");
select * from class where id=myfun("python");

查看函数创建语句:show create function 函数名;

删除函数:drop function 函数名;

你可能感兴趣的:(数据库)