【中等】【177. 第N高的薪水】SQL函数浅识

【中等】【177. 第N高的薪水】SQL函数浅识

(一)MySql必会

(1)SQL函数
在MySQL中编写函数时,可以使用以下语法:

CREATE FUNCTION function_name ([parameter1 data_type, parameter2 data_type,...])
    RETURNS return_data_type
    [DETERMINISTIC]
    [SQL DATA ACCESS {CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA}]
    BEGIN
        -- 函数体
        DECLARE variable_name1 data_type;
        DECLARE variable_name2 data_type;
        -- 声明变量
        
        -- 函数逻辑处理
        
        RETURN expression; -- 返回值
    END;

按照以下步骤进行操作:
1.使用CREATE FUNCTION语句创建函数,并指定函数名称。

2.在括号中定义函数的参数,并指定每个参数的数据类型。

3.使用RETURNS关键字指定函数的返回值的数据类型。

4.可选地使用DETERMINISTIC关键字指定函数是否是确定性的(即给定相同的输入是否总是生成相同的输出)。

5.可选地使用SQL DATA ACCESS子句指定函数的SQL数据访问模式。

6.在BEGIN和END关键字之间编写函数的具体逻辑。

7.在函数体内部,使用DECLARE关键字声明所需的变量,并指定每个变量的数据类型。

8.编写函数的逻辑处理部分,包括使用条件语句、循环和SQL查询等。

9.使用RETURN语句返回函数的结果。

以下是两个示例:
A.查询所有员工的总工资

CREATE FUNCTION calculate_total_salary()
    RETURNS DECIMAL(10, 2)
    BEGIN
        DECLARE total_salary DECIMAL(10, 2);
        SELECT SUM(salary) INTO total_salary FROM employees;
        RETURN total_salary;
    END;

B.查询特定员工的工资

CREATE FUNCTION get_employee_salary(employee_id INT)
    RETURNS DECIMAL(10, 2)
    BEGIN
        DECLARE salary DECIMAL(10, 2);
        SELECT salary INTO salary FROM employees WHERE id = employee_id;
        RETURN salary;
    END;

(2)RETURNS DECIMAL
RETURNS DECIMAL是MySQL函数中用于指定返回值类型的语法。DECIMAL是一种数据类型,用于存储十进制数值。在函数声明中,您可以使用RETURNS DECIMAL(p, s)来指定返回的十进制数值的总位数(精度)和小数位数(刻度)。

具体地,p表示总位数,范围是1到65,默认是10。
s表示小数位数,范围是0到30,默认是0。

例如,RETURNS DECIMAL(10, 2)表示返回一个长度为10的十进制数值,其中2位用于小数部分。

这个数据类型适用于需要精确计算和存储小数的情况,例如货币金额、比例、利率等。

在MySQL函数中,可以根据具体的业务需求和数据的特点来选择适当的数据类型来定义函数的返回值。根据您的实际需求,可以选择使用整数类型、浮点数类型、日期时间类型等等。

(二)题目描述

查询 Employee 表中第 n 高的工资。如果没有第 n 个最高工资,查询结果应该为 null

Create table If Not Exists Employee (Id int, Salary int);
Truncate table Employee;
insert into Employee (id, salary) values ('1', '100');
insert into Employee (id, salary) values ('2', '200');
insert into Employee (id, salary) values ('3', '300');

(三)题解

(1)单表查询

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
    DECLARE M INT;
    SET M=N-1;
    RETURN (
        select distinct salary
        from employee
        order by salary desc
        limit 1 offset M
        );
END

(2)子查询

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  
    RETURN (
        SELECT distinct e.salary
      FROM
          employee e
      WHERE
          (SELECT count(DISTINCT salary) FROM employee WHERE salary>e.salary) = N-1
        );
END
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值