首页 > 数据库 >mysql8.0存储函数

mysql8.0存储函数

时间:2024-01-03 20:32:15浏览次数:37  
标签:存储 函数 RETURNS dept DELIMITER mysql8.0 id SELECT

4、存储函数的使用

4.1、语法分析

学过的函数:LENGTH、SUBSTR、CONCAT等

语法格式
CREATE FUNCTION 函数名(参数名 参数类型,...)
RETURNS 返回值类型
[characteristics ...]
BEGIN
    函数体 #函数体中肯定有 RETURN 语句
END

说明:
1、参数列表:指定参数为IN、OUT或INOUT只对PROCEDURE是合法的,FUNCTION中总是默认为IN参数。
2、RETURNS type 语句表示函数返回数据的类型;
RETURNS子句只能对FUNCTION做指定,对函数而言这是 强制 的。它用来指定函数的返回类型,而且函数体必须包含一个RETURN value语句。
3、characteristic 创建函数时指定的对函数的约束。取值与创建存储过程时相同,这里不再赘述。
4、函数体也可以用BEGIN…END来表示SQL代码的开始和结束。如果函数体只有一条语句,也可以省略BEGIN…END。

4.2、调用存储函数

在MySQL中,存储函数的使用方法与MySQL内部函数的使用方法是一样的。
换言之,用户自己定义的存储函数与MySQL内部函数是一个性质的。区别在于,存储函数是 用户自己定义的,而内部函数是MySQL的开发者定义的。

4.3、代码举例

举例1:
创建存储函数,名称为email_by_name(),参数定义为空,该函数查询Abel的email,并返回,数据类型为字符串型。
CREATE FUNCTION email_by_name()
RETURNS VARCHAR(25)
DETERMINISTIC
CONTAINS SQL
BEGIN
    RETURN (SELECT email FROM employees WHERE last_name = 'Abel');
END //
DELIMITER ;
调用:
SELECT email_by_name();

举例2:
创建存储函数,名称为email_by_id(),参数传入emp_id,该函数查询emp_id的email,并返回,数据类型为字符串型。
DELIMITER //
CREATE FUNCTION email_by_id(emp_id INT)
RETURNS VARCHAR(25)
DETERMINISTIC
CONTAINS SQL
BEGIN
    RETURN (SELECT email FROM employees WHERE employee_id = emp_id);
END //
DELIMITER ;
调用:
SET @emp_id = 102;
SELECT email_by_id(102);

举例3:
创建存储函数count_by_id(),参数传入dept_id,该函数查询dept_id部门的员工人数,并返回,数据类型为整型。
DELIMITER //
CREATE FUNCTION count_by_id(dept_id INT)
RETURNS INT
    LANGUAGE SQL
    NOT DETERMINISTIC
    READS SQL DATA
    SQL SECURITY DEFINER
    COMMENT '查询部门平均工资'
BEGIN
    RETURN (SELECT COUNT(*) FROM employees WHERE department_id = dept_id);
END //
DELIMITER ;
调用:
SET @dept_id = 50;
SELECT count_by_id(@dept_id);

注意:
若在创建存储函数中报错“ you might want to use the less safe
log_bin_trust_function_creators variable ”,有两种处理方法:
方式1:加上必要的函数特性“[NOT] DETERMINISTIC”和“{CONTAINS SQL | NO SQL | READS SQL DATA |
MODIFIES SQL DATA}”
方式2:SET GLOBAL log_bin_trust_function_creators = 1;

4.4、对比存储函数和存储过程

mysql8.0存储函数_SQL

练习

#0.准备工作
USE test15_pro_func;
CREATE TABLE employees
AS
SELECT * FROM test.`employees`;
CREATE TABLE departments
AS
SELECT * FROM test.`departments`;

#无参有返回
#1.创建函数get_count(),返回公司的员工个数
DELIMITER//
CREATE FUNCTION get_count()
RETURNS INT 
BEGIN
    RETURN(SELECT COUNT(*) FROM employees);
END//
DELIMITER;
#调用
SELECT get_count();

#有参有返回
#2.创建函数ename_salary(),根据员工姓名,返回它的工资
DELIMITER//
CREATE FUNCTION ename_salary(emp_name VARCHAR(20))
RETURNS DOUBLE 
BEGIN
    RETURN(
        SELECT salary
        FROM employees
        WHERE last_name=emp_name );
END//
DELIMITER;
#调用
SELECT ename_salary('Abel');

#3.创建函数dept_sal(),根据部门名,返回该部门的平均工资
DELIMITER//
CREATE FUNCTION dept_sal(dept_name VARCHAR(20))
RETURNS DOUBLE
BEGIN
    RETURN(
        SELECT AVG(salary)
        FROM employeese JOIN departmentsd
        ON e.department_id=d.department_id
        WHERE d.department_name=dept_name
    );
END//
DELIMITER;
#调用
SELECT dept_sal('Marketing');

#4.创建函数add_float(),实现传入两个float,返回二者之和DELIMITER//
CREATE FUNCTION add_float(num1 FLOAT,num2 FLOAT)
RETURNS FLOAT
BEGIN
    RETURN(SELECT num1+num2);
END//
DELIMITER;
#调用
SET @num1:=1.2,@num2=3.2;
SELECT add_float(@num1,@num2);

标签:存储,函数,RETURNS,dept,DELIMITER,mysql8.0,id,SELECT
From: https://blog.51cto.com/u_13236892/9088619

相关文章

  • 无涯教程-Java 正则 - XY 匹配函数
    逻辑运算符[XY]匹配X,后跟Y。XY-示例以下示例显示了逻辑运算符的用法。packagecom.learnfk;importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassLogicalOperatorDemo{privatestaticfinalStringREGEX="to";privatestaticfin......
  • C++11中的匿名函数用法
    C++11中引用了匿名函数这一个新的特性,它的使用方法如下:[capture](parameters)->return_type{body} 其中:capture 指定了Lambda表达式可以访问的外部变量parameters 是Lambda表达式的参数列表return_type 是返回类型(可选)body 是Lambda函数体下面是一个简单......
  • React函数式组件避免无用渲染的方案
    在class组件中可以使用shouldComponentUpdate钩子函数,但是函数式组件中是没有这种钩子函数的,那么在函数式组件中来达到类似的效果呢?答案是:React.Memo,如以下使用案例://父组件const[values,setValues]=useState({a:1,b:1,});functionincrement(){......
  • 无涯教程-Java 正则 - X|Y 匹配函数
    逻辑运算符[X|Y]匹配X或Y。X|Y-示例以下示例显示了逻辑运算符的用法。packagecom.learnfk;importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassLogicalOperatorDemo{privatestaticfinalStringREGEX="t|o";privatestatic......
  • PG数据库存储验证
    PG数据库存储验证背景最近学习了SQLServer数据库的varchar和nvarchar的存储想到PG数据库其实没让选择字符集,也没有nvarchar所以想学习一下nvarchar的使用情况建表以及插入sqlsu-postgrespsqlcreatedatabasezhaobsh\czhaobshcreatetablezhaobsh(zhaobshvarchar(30));......
  • 无涯教程-Java 正则 - X{n}+ 匹配函数
    PossesiveQuantifier[X{n}+]与存在的X个精确匹配n次。X{n}+-示例packagecom.learnfk;importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassPossesiveQuantifierDemo{privatestaticfinalStringREGEX="T{2}+";privatestat......
  • riak_cs elrang 的s3 存储服务
    riak_cs是riak团队开发的s3兼容存储,基于了riakkv,目前似乎缺少维护了(毕竟已经有不少开源而且更加强大的s3实现了)riak_cs基于erlang开发,对于学习下设计还是比较有帮助的,同时也能学习下erlang项目开发说明当然riak做为一个分布式的no-sql数据库还是最出名的,其他组件似乎使用的人......
  • 无涯教程-Java 正则 - X++ 匹配函数
    PossesiveQuantifier[X++]与X匹配一次或多次。X++-示例packagecom.learnfk;importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassPossesiveQuantifierDemo{privatestaticfinalStringREGEX="T++";privatestaticfinalS......
  • 深入理解 LockWindowUpdate: 该函数的作用
    今天说说被误解的LockWindowUpdate。这是LockWindowUpdate系列中的第一篇,我将会讲讲它的作用、用途以及(也许最重要的是)对它的误用。LockWindowUpdate的作用非常简单。当一个窗口被锁定时,所有试图绘制它或其子窗口的尝试都会失败。窗口管理器不会进行绘制,而是记住应用程序尝试......
  • 无涯教程-Java 正则 - X*+ 匹配函数
    PossesiveQuantifier[X*+]匹配X出现零次或多次。X*+-示例packagecom.learnfk;importjava.util.regex.Matcher;importjava.util.regex.Pattern;publicclassPossesiveQuantifierDemo{privatestaticfinalStringREGEX="T*+";privatestaticfinal......