mysql中的函数与存储过程
mysql中的函数: 1 mysql下创建函数:
1.1 语法:
delimiter $$ -- 设置分隔符,默认是; 设置成其他符号,让编译器知道我们函数编写的结束,此处设置成$$
create function 函数名(参数列表) returns 返回值类型
begin 函数语句 end
$$ -- 表示结束
delimiter ; -- 结束符修改成默认 例如:编写一个返回a+b的函数
delimiter $$
create function get_sum(a int , b int ) returns int
begin
declare res int default 0;
set res = a + b;
return res;
end
$$ delimiter ; -- 函数中不支持sql语句,唯一可用放入函数的sql就是 select... into 变量。在函数当中把查询结果赋值给变量。 1.2 函数语句:
1.2.1 定义一个变量: declare 变量名 类型 default 默认值
例如: declare x varchar(100);
1.2.2 修改变量值: set 变量名 = 值
例如: set x = "abc"; 1.2.3 判断语法:
if 条件1 then
语句1;
elif 条件2 then
语句2;
else
语句;
end if 1.2.4 循环语法:
while 条件 do
语句;
end while;
-- leave 可以退出循环 相当于break
-- iterate 结束本次循环开始下一次循环 相当于continue 1.2.5 实例:一个输出1到1000之间偶数的函数odd
delimiter $$ -- 设置结束标识符
create function odd() returns varchar(300)
begin
declare i int default 2;
declare res varchar(300) default "";
while i <= 100 do
set res = concat(res ," ", i);
-- 拼接字符串
set i = i + 2;
end while;
return res;
end;
$$ delimiter ; 1.3 用户变量/会话变量:
只有当前连接用户有效,其他连接用户我发访问。 -- 使用@表示声明用户变量。 set @变量名 = 值
set @ age = 20; -- 查看当前用户变量。 select @变量名;
select @age; -- 为用户变量赋值。
select @age := max(age) from students; 1.4 系统变量:
任何用户都可以访问。
使用@@来标识系统变量。
使用select来查看系统变量 -- 查看所有的系统变量
show variables; -- 查看系统变量: select @@变量名;
select @@max_connections; -- 当前用户/会话中修改系统变量: set 变量名 = 值;
set max_connections = 1000; 2 查看函数:
所有函数(和存储过程)存储在mysql数据库下的proc表中
查看python数据库中的函数:
select db , name , type from mysql.proc where db="python" 3 调用函数:
select 函数名(传入参数); 比如 select get_sum(4,6); 4 删除函数:
drop function 函数名称;
例如:
drop function get_sum; mysql中的存储过程:
存储过程是多条sql语句的集合,是一种批处理过程。 1 存储过程的创建:
1.1 语法:
delimiter // -- 更换终止分隔符
create procedure 存储过程名称(参数列表)
begin
sql语句;
end
// delimiter ; -- 改回分隔符关键字 -- sql语句结尾的;会让创建存储过程语句结束
-- 所以我们自己更改一个终止分隔符, 也可以指定其他符号。 实例:查询学生信息的存储过程
delimiter //
create procedure pro_stu()
begin
select * from students;
end
// delimiter ; 1.2 参数与返回值:存储过程没有返回值,如果需要向外传递数据,可以设置参数。
参数有三种类型:
in 向存储过程内部传递数据 默认就是in类型
out 存储过程向外传递数据 可以代替返回值的功能
inout 可以双向传递数据 例如: 查询指定id的学生信息 并且在外部想要获取学生总人数
delimiter //
create procedure get_stu( in id int , out num int )
begin
select * from students where students.id = id;
select count(*) from students into num; end
// delimiter ; 之后调用的借助一个用户变量:
call get_stu(1,@num);
之后总人数赋值给了@num 用户变量:
select @num; 2 查看存储过程:
所有存储过程和函数都放在mysql数据库下的proc表中
desc mysql.proc\G 主要字段:
name 名称
type 类型 存储过程或者函数
body 正文内容
db 属于那个数据库 查看python数据库的所有存储过程
select db , name , type , body from mysql.proc where db = "python" ; 3 调用存储过程: call 存储过程名(参数列表);
例如:
call proc_stu() ; 4 删除存储过程: drop procedure 存储过程名称;
例如:
drop procedure proc_stu; 存储过程和函数的区别 相同点
存储过程和函数都是为了可重复的执行操作数据库的 sql 语句的集合.
存储过程和函数都是一次编译,就会被缓存起来,下次使用就直接命中缓存中已经编译好的 sql, 不需要重复编译
减少网络交互,减少网络访问流量 不同点
标识符不同,函数的标识符是 function, 过程:procedure
函数中有返回值,且必须有返回值,而过程没有返回值,但是可以通过设置参数类型(in,out)来实现多个参数或者返回值
函数使用 select 调用,存储过程需要使用 call 调用
select 语句可以在存储过中调用,但是除了 select ... into 之外的 select 语句都不能再函数中调用
通过 in out 参数,过程相关函数更加灵活,可以返回多个结果
在实际开发中根据个人喜好选择使用函数或者存储过程
mysql中的函数与存储过程的更多相关文章
- Mysql中的函数
什么是函数 mysql中的函数与存储过程类似,都是一组SQL集: 与存储过程的区别 函数可以return值,存储过程不能直接return,但是有输出参数可以输出多个返回值: 函数可以嵌入到sql语句中 ...
- mysql创建自定义函数与存储过程
mysql创建自定义函数与存储过程 一 创建自定义函数 在使用mysql的过程中,mysql自带的函数可能不能完成我们的业务需求,这时就需要自定义函数,例如笔者在开发过程中遇到下面这个问题 mysql ...
- thinkphp中的内置操作数据库与mysql中的函数汇总
8.4.4 Model类getModelName() 获取当前Model的名称getTableName() 获取当前Model的数据表名称switchModel(type,vars=array()) ...
- mysql中now()函数的使用,还有oracle的sysdate,可能埋下的坑
mysql中now()函数的使用,还有oracle的sysdate 在需求中如果系统中药添加当前操作的时间那么很简单的一个操作在写sql的时候直接在这个字段对应的位置写上now()函数就可以了,这样就 ...
- MySQL中concat函数(连接字符串)
MySQL中concat函数使用方法:CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意:如果所有参数均为非二进制字符串 ...
- MySQL中concat函数
MySQL中concat函数使用方法:CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意:如果所有参数均为非二进制字符串 ...
- mysql中INSTR函数的用法
mysql中INSTR函数的用法 INSTR(字段名, 字符串) 这个函数返回字符串在某一个字段的内容中的位置, 没有找到字符串返回0,否则返回位置(从1开始) SELECT * FROM tblTo ...
- MySQL中group_concat函数-和group by配合使用
MySQL中group_concat函数 完整的语法如下: group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔 ...
- MySQL中时间函数NOW()和SYSDATE()的区别
mysql中日期函数还是比较常用的.主要有NOW()和SYSDATE()两种,虽然都表示当前时间,但使用上有一点点区别. NOW()取的是语句开始执行的时间,SYSDATE()取的是动态的实时时间. ...
随机推荐
- RDP 拒绝服务攻击
先看一下百度百科怎么定义的 靶机ip Win7: 192.168.123.19 Win7开远程桌面,为方便测试 需关闭防火墙 kali打开msf 进入 use auxiliary/dos/wind ...
- OpenStack中的rabbitmq的配置方法
OpenStack中的rabbitmq的配置方法 author:headsen chen 2017-10-11 17:24:58 个人原创,允许转载,转载请注明作者,出处,否则依法追究法律责任 ...
- PHP实现KMP算法
KMP算法是一种比较高效的字符串匹配算法,关于其讲解,可参考文章 字符串匹配的KMP算法,本文只给出具体的PHP代码实现. /** * @desc构建next数组 * @param string $s ...
- FNV算法实战
HASH算法介绍 Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长 ...
- 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址;
package com.utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.htt ...
- Java多线程:队列与阻塞队列
1. 什么是阻塞队列 阻塞队列(BlockingQueue)是 Java 5 并发新特性中的内容,阻塞队列的接口是 java.util.concurrent.BlockingQueue,它提供了两个附 ...
- SSH三大框架的整合
SSH三个框架的知识点 一.Hibernate框架 1. Hibernate的核心配置文件 1.1 数据库信息.连接池配置 1.2 Hibernate信息 1.3 映射配置 1.4 Hibernate ...
- ConcurrentHashMap 源码分析
ConcurrentHashMap 源码分析 1. 前言 终于到这个类了,其实在前面很过很多次这个类,因为这个类代码量比较大,并且涉及到并发的问题,还有一点就是这个代码有些真的晦涩,不好懂.前前 ...
- 如何从RxJava升级到RxJava2
如何从RxJava升级到RxJava2. RxJava2已经推出有一年半的时间,由于之前RxJava已经在现有项目中广泛使用,而RxJava2在除了很多命名外并没有太多革新,所以相信有很多人跟我一样都 ...
- python实现K聚类算法
参考:<机器学习实战>- Machine Learning in Action 一. 基本思想 聚类是一种无监督的学习,它将相似的对象归到同一簇中.它有点像全自动分类.聚类方法几乎可以应 ...