# 创建函数并在语句中使用它

# 任务描述

本关任务:
编写一个依据客户编号计算其在本金融机构的存储总额的函数,并在 SELECT 语句使用这个函数。

# 相关知识

为了完成本关任务,你需要掌握:

  • 函数的定义;
  • 在 SELECT 语句中应用自定义函数;

# 函数定义和应用

函数其实有多种,比如标量函数 (仅返回一个值) 和表函数 (返回结果是表), 语法也各不相同。这里,我们仅给出一个简化的创建标量函数的语法:

create function 语句的语法:

create function function_name([para data_type[,...]])
returns data_type
begin
    function_body;
    return expression; 
end
  • function_name: 函数名;
  • para: 参数名;
  • data_type: 参数的数据类型;
  • 一个函数可以没有参数,也可以有多个。多参数间用逗号分隔。
  • function_body: 函数体。即由合法的 SQL 语句组成的程序段。
  • expression: 函数返回值,可以是常量、表达式,甚至是一条 select 语句查询的值(必须保证结果唯一); 该值类型应与 returns 短语定义的类型相同。

函数一旦定义,就可以像内部函数一样使用,比如出现在 select 列表、表达式、以及 where 子句的条件中。

MySQL 的函数定义与存储过程的定义一样,在定义函数之前要用 “delimiter 界符” 语句指定函数定义的结束界符,并在函数定义后,再次使用 “delimiter 界符” 语句恢复 MySQL 语句的界符 (分号)。

# 编程要求

在右侧代文件编辑器补充代码,完成以下编程任务:

  1. 用 create function 语句创建符合以下要求的函数:

    • 依据客户编号计算其所有储蓄卡余额的总和。
    • 函数名为:get_deposit
  2. 利用创建的函数,仅用一条 SQL 语句查询存款总额在 100 万 (含) 以上的客户身份证号,姓名和存款总额 (total_deposit),结果依存储总额从高到低排序。

use finance1;
set global log_bin_trust_function_creators=1;
drop function IF EXISTS get_deposit;
/*
   用 create function 语句创建符合以下要求的函数:
   依据客户编号计算该客户所有储蓄卡的存款总额。
   函数名为:get_Records。函数的参数名可以自己命名:*/
delimiter $$
create function get_deposit(client_id int)
returns numeric(10,2) 
begin
	return (
        select
            sum(b_balance)
        from bank_card
        where b_type = "储蓄卡"
        group by b_c_id
        having b_c_id = client_id
    );
end$$
delimiter ;
/*  应用该函数查询存款总额在 100 万以上的客户身份证号,姓名和存储总额 (total_deposit),
    结果依存款总额从高到代排序  */
select
    *
from (
    select
        c_id_card,
        c_name,
        get_deposit(c_id) total_deposit
    from client
) a
-- 上面这个 a 为什么一定需要,去掉就会报错
where total_deposit >= 1000000
order by total_deposit desc;
/*  代码文件结束     */