编写一个 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 函数名;