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()取的是动态的实时时间. ...
随机推荐
- selenium webdriver 使用Chrome 浏览器
首先需要有ChromeDriver驱动来协助.ChromeDriver是实现WebDriver有线协议的一个单独的服务.ChromeDriver通过chrome的自动代理框架控制浏览器,ChromeD ...
- jQuery对于动态生成的元素绑定无效的问题~~
问题:很多时候发现,对动态生成的元素绑定click事件是无效的- 原因:直接绑定到动态生成的元素是无效的,是因为Jquery扫描文档找出所有的$(‘’)元素,并把函数绑定到每个元素的click事件上, ...
- java容器类4:Queue深入解读
Collection的其它两大分支:List和Set在前面已近分析过,这篇来分析一下Queue的底层实现. 前三篇关于Java容器类的文章: java容器类1:Collection,List,Arra ...
- EOS 开发进展速报
Daniel Larimer 刚刚披露了 EOS 的最近开发进展,原文 :https://steemit.com/eos/@dan/ukoxz-eos-io-development-update 为了 ...
- ------- Tor 源码分析第三部分—— 日志设施与智能链表 --------
------------------------------------------------------------------------------------ init_logging()( ...
- day01的那些事
代码之道 路漫漫其修远兮,吾将上下而求索
- 笔记:Hibernate 持久化类标注示例-双向1-N关系映射
1-N关系的1端持久化类 package org.drsoft.hibernate.model.oneToMany; import java.util.Date; import java.ut ...
- 一、Android四大框架之ContentProvider的学习与运用,实现SQLite的增删改查。
本文系原创博客,文中不妥烦请指出,如需转载摘要请注明出处! ContentProvider的学习与运用 Alpha Dog 2016-04-13 10:27:06 首先,项目的地址:https:// ...
- Mybatis转义字符
Mybatis的sql语句中需要用到'>'或者'<'时,不能直接使用. < < 小于号 > > 大于号 & & 和 ' ' 单引号 ...
- 手把手 git建立仓库,远程推拉及常用git命令和部分Linux命令集锦
方法一:直接在GitHub上建立一个项目,然后git clone (git address name): 此时已经建立好了一个git仓库: cd 文件夹 > 添加文件进去 >git add ...