【MySQL】MySQL函数、自定义函数、存储过程

Mysql运算符和函数

字符函数



删除指定字符串

删除前指定字符串


删除后续的


删除前后的


字符串替换


截取字符串,mysql中字符从1开始


查询包含%的字串


_下划线代表任意一个字符

数值运算符和函数



日期时间函数



日期格式化

SELECT DATE_FORMAT('2014-3-2','%m/%d/%Y');

信息函数


聚合函数


加密函数


自定义函数(UDF,user-defined function)

CREATE FUNCTION function_name

RETURNS

{STRING | INTEGER | REAL | DECIMAL}

Routine_body

 

关于函数体

1.      函数体由合法的SQL语句组成;

2.      函数体可以是简单的SELECT或INSERT语句;

3.      函数体如果为复合结构则使用BEGIN … END 语句;

4.      复合结构可以包含声明,循环,控制结构;

 

例1:创建不带参数的自定义函数(格式化当前日期)

CREATE FUNCTION f1()

RETURNS VARCHAR(30)

RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H点:%i分:%s秒');


例2: 创建带有参数的函数(求两个数的平均值)

CREATE FUNCTION f2(num1 SMALLINTUNSIGNED,num2 SMALLINT UNSIGNED)

RETURNS FLOAT(10,2) UNSIGNED

RETURN (num1+num2)/2;


例3:创建具有复合结构函数体的自定义函数(向数据表插入一条数据)复合结构的函数体要包含在BEGIN END 中间

Tip : DELIMITER // 设置mysql的结束符,这里设置为两条斜线结束。

 

CREATE FUNCTION addpname(pname VARCHAR(20))

RETURNS INT UNSIGNED

BEGIN

INSERT province(pname) VALUES(pname);

RETURN LAST_INSERT_ID();

END

//


删除函数

DROP FUNCTION [IFEXISTS] function_name

 

存储过程

 

SQL命令 –》MySQL引擎分析-》语法正确-》执行可识别命令-》执行结果-》客户端

 

存储过程是SQL语句与控制语句的预编译集合(只在第一次编译),以一个名称存储并作为一个单元处理。

1.      增强了SQL语句的功能和灵活性

2.      实现了较快的速度。

3.      减少了网络流量。

 

创建存储过程

CREATE

[DEFINED = {user| CURRENT_USER}]

PROCEDUREsp_name([proc_parameter[,…]])

[characteristic …]routine_body

Proc_parameter:

[IN | OUT |INOUT] param_name type

 

参数

IN,表示该参数的值必须在调用存储过程时指定。

OUT,表示该参数的值可以被存储过程改变,并且可以返回。

INOUT,表示该参数调用时指定,并且可以被改变和返回。

过程体

         过程体由合法的SQL语句构成。

         过程体可以是任意SQL语句。

         过程体如果为复合结构则使用BEGIN…END 语句。

         复合结构可以包含声明,循环,控制结构。

 

例1:创建不带参数的存储过程

CREATE PROCEDURE sql()

SELECT VERSION();


例2:带有IN 类型参数的存储过程

CREATE PROCEDUREremoveById(IN p_id INT UNSIGNED)

BEGIN

DELETE FROMprovince WHERE id = p_id;

END

//

删除存储过程

DROP PROCEDUREprocedure_name

 

例3:创建带有IN 和OUT 类型的参数的存储过程

这个存储过程可以删除指定id的数据并且返回剩下的总数

CREATE PROCEDUREremoveUserAndReturnUserNums(

IN p_id INTUNSIGNED ,OUT userNums INT UNSIGNED)

BEGIN

DELETE FROMcounty WHERE id=p_id;

SELECT count(id)FROM county INTO userNums;

END

//


1.    用户变量:以"@"开始,形式为"@变量名"
用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生

2.    全局变量:定义时,以如下两种形式出现,set GLOBAL 变量名  或者  set @@global.变量名
对所有客户端生效。只有具有super权限才可以设置全局变量

3.    会话变量:只对连接的客户端有效。

4.    局部变量:作用范围在beginend语句块之间。在该语句块里设置的变量
declare
语句专门用于定义局部变量。set语句是设置不同类型的变量,包括会话变量和全局变量


例4:创建带有多个OUT类型参数的存储过程

 

ROW_COUNT(); 增加或删除的数量表示最后一次操作的数量

 

删除一个表的数据,并返回删除了几条,还剩下几条数据。

CREATE PROCEDURE removeUserByAgeAndReturnInfos(

IN p_age SMALLINT,

OUT deleteUsers SMALLINT UNSIGNED,

OUT userCounts SMALLINT UNSIGNED)

BEGIN

DELETE FROM  user WHEREage=p_age;

SELECT ROW_COUNT() INTO deleteUsers;

SELECT COUNT(id) FROM user INTO userCounts;

END

//


存储过程与自定义函数的区别

1.      存储过程实现的功能要复杂一些;而函数的针对性更强。

2.      存储过程可以返回多个值;函数只能有一个返回值。

3.      存储过程一般独立的来执行;而函数可以作为其他SQL语句的组成部分来出现。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值