一、变量

类似Java中的变量,MySQL也存在变量。变量分类:

  • 系统变量

    • 全局变量
    • 会话变量
  • 自定义变量
    • 用户变量
    • 局部变量

1.1、系统变量

说明:变量由系统定义,不是用户定义,属于服务器层面。 注意:全局变量需要添加global关键字,会话变量需要添加session关键字,如果不写,默认会话级别。

常见操作如下:

# 查看所有系统变量
show global|session variables;
# 查看满足条件的部分系统变量
show global|session variables like 'xxx';
# 查看指定的系统变量的值
select @@global|session.系统变量名;
# 为某个系统变量赋值
# 方式一:
set global|session 系统变量名=值;
# 方式二:
set @@global|session.系统变量名=值;# 设置隔离级别
set autocommit=0; #默认设置,设置会话的自动提交
set @@global.autocommit=0;# 查看隔离级别
select @@autocommit; #默认查询,查询会话的自动提交
select @@global.autocommit; #查询全局的自动提交

1.2、自定义变量

说明:变量由用户自定义,而不是系统提供的。 使用步骤:

  • 声明
  • 赋值
  • 使用(查看、比较、运算等)

1.2.1、用户变量

作用域:针对于当前会话(连接)有效,作用域同会话变量。

赋值操作符:=或:=

# 声明并初始化
set @变量名=值;
set @变量名:=值;
select @变量名:=值;# 赋值,更新变量的值
# 方式1
set @变量名=值;
set @变量名:=值;
select @变量名:=值;
# 方式2,查询出的数据一定是单个值
select 字段 into @变量名 from 表;# 使用,查看变量的值
select @变量名;set @name='zs';
set @ct:=100;
select @ct:=0;select count(*) into @ct from emp;
select @ct;

1.2.2、局部变量

作用域:仅仅在定义它的beginend块中有效。 应用在beginend中的第一句话。

# 声明
declare 变量名 类型;
declare 变量名 类型 [default 值];# 赋值
# 方式1
set 局部变量名=值;
set 局部变量名:=值;
select 局部变量名:=值;
# 方式2
select 字段 into 变量名 from 表;# 使用,查看变量的值
select 局部变量名;

1.2.3、用户变量和局部变量对比

作用域 定义和使用的位置 语法
用户变量 当前会话 会话中的任何地方 必须加@符号,不用限定类型
局部变量 beginend块中 只能在beginend块中,且为第一句话 不用加@符号,需要限定类型

二、存储过程

含义:一组预先编译好的SQL语句的集合,理解成批处理语句。

优势:

  • 提高代码的重用性;
  • 简化操作;
  • 减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率。

2.1、创建语法

create procedure 存储过程名(参数列表)
begin存储过程体(一组SQL语句)
end

说明:

  1. 如果存储过程体仅仅只有一句话,beginend可以省略;

  2. 存储过程体中的每条sql语句的结尾要求必须加分号;

  3. 由于存储过程体使用分号表示结束,那么存储过程必须使用其他字符表示结尾。存储过程使用delimiter重新设置结尾;

    # 语法
    delimiter 结束标记
    # 案例
    delimiter $
    
  4. 参数列表包含三部分:

    • 参数模式

      • in:该参数可以作为输入,也就是该参数需要调用方传入值
      • out:该参数可以作为输出,也就是该参数可以作为返回值
      • inout:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值
    • 参数名
    • 参数类型

2.2、调用语法

call 存储过程名(实参列表);

2.3、删除存储过程

drop procedure 存储过程名;

2.4、查看存储过程的信息

show create proceduce 存储过程名;

2.5、举例

# 创建存储过程,在部门表中添加两条数据
delimiter $
create procedure pro1()
begininsert into dept(dname, loc) values('aaa', 'bj'),('bbb', 'tj');
end $
# 调用存储过程
call pro1()$# 创建存储过程,根据部门名称查询部门名
delimiter $
create procedure pro2(in deptloc varchar(20))
beginselect dname from dept where loc=deptloc;
end $
# 调用存储过程
call pro2('北京')$# 创建存储过程,查询在特定部门从事特定工种的员工的信息和部门信息
delimiter $
create procedure pro3(in job varchar(20), in deptname varchar(20))
beginselecte.*, d.*fromemp e, dept dwheree.deptno=d.deptno and e.job=job and d.dname=deptname;
end $
# 调用存储过程
call pro3('文员','市场部')$# 创建存储过程,查询特定部门和特定工种的员工个数
delimiter $
create procedure pro4(in job varchar(20), in deptname varchar(20))
begindeclare result int default 0;selectcount(*) into resultfromemp e, dept dwheree.deptno=d.deptno and e.job=job and d.dname=deptname;select result as '个数';
end $
# 调用存储过程
call pro4('文员','市场部')$# 创建存储过程,查询特定部门和特定工种的员工个数
delimiter $
create procedure pro5(in job varchar(20), in deptname varchar(20), out result int)
beginselectcount(*) into resultfromemp e, dept dwheree.deptno=d.deptno and e.job=job and d.dname=deptname;
end $
# 调用
call pro5('文员', '研发部', @r);
select @r;# 创建存储过程,传入a和b两个值,最终a和b都翻倍并返回
delimiter $
create procedure pro6(inout num1 int, inout num2 int)
beginset num1=num1*2;set num2=num2*2;
end $
set @a=2$
set @b=3$
# 调用存储过程
call pro6(@a, @b)$
select @a$
select @b$

三、函数

含义:一组预先编译好的SQL语句的集合,理解成批处理语句。

优势:

  • 提高代码的重用性;
  • 简化操作;
  • 减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率。

与存储过程区别:

  • 存储过程:可以有0个返回,也可以有多个返回,适合做批量插入、批量更新;
  • 函数:有且仅有1 个返回,适合做处理数据后返回一个结果。

3.1、创建语法

create function 函数名(参数列表) returns 返回类型
begin函数体
end

说明:

  1. 参数列表包含两部分:参数名 参数类型
  2. 函数体肯定会有return语句,如果没有会报错;
  3. 函数体中仅有一句话,则可以省略beginend
  4. 使用delimiter语句设置结束标记。

3.2、调用语法

select 函数名(参数列表)

3.3、查看函数

show create function 函数名;

3.4、删除函数

drop function 函数名;

3.5、案例

# 定义函数,查询员工数量
delimiter $
create function myfun1() returns int
begindeclare c int default 0;select count(*) into c from emp;return c;
end $
# 调用函数
select myfun1()$# 定义函数,根据工种查询员工数量
delimiter $
create function myfun2(job varchar(20)) returns int
begindeclare c int default 0;select count(*) into c from emp where emp.job=job;return c;
end $
# 调用函数
select myfun2('研发部')$# 定义函数,根据部门名称,查询平均工资
delimiter $
create function myfun3(dname varchar(20)) returns double
begindeclare avgsal double default 0;selecta.a into avgsalfromdept d, (select deptno, avg(sal) a from emp group by deptno) awhered.deptno=a.deptno and d.dname=dname;return avgsal;
end $
# 调用函数
select myfun3('研发部')$# 定义函数,求两数的和
delimiter $
create function myfun4(num1 int, num2 int) returns int
begindeclare sum int default 0;set sum:=num1+num2;return sum;
end $
# 调用函数
select myfun4(11,21)$

【mysql】扩展-变量_存储过程_函数相关推荐

  1. mysql基础——变量、存储过程和函数

    目录 一.变量 1.1  基本介绍 1.2  系统变量 1.3  自定义变量 二.存储过程 2.1  基本介绍 2.2  存储过程的创建 2.3  存储过程的删除 2.4  存储过程的查看 2.5  ...

  2. 第15章_存储过程与函数(创建存储过程、调用存储过程、存储函数的使用、存储过程和函数的查看、修改、删除)

    第15章_存储过程与函数 第15章_存储过程与函数 1. 存储过程概述 1.1 理解 1.2 分类 2. 创建存储过程 2.1 语法分析 2.2 代码举例 3. 调用存储过程 3.1 调用格式 3.2 ...

  3. MySQL06:变量、存储过程和函数、流程控制结构

    6.变量.存储过程和函数.流程控制结构 变量 分类 系统变量: 全局变量 会话变量 自定义变量: 用户变量 局部变量 系统变量 说明:变量由系统定义,不是用户定义,属于服务器层面 注意:全局变量需要添 ...

  4. 使用变量_存储过程和函数及变量的使用

    存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句.存储过程和函数可以避免开发人员重复的编写相同的SQL语句.而且,存储过程和函数是在mys ...

  5. Mysql数据库基础知识(五)之:视图、变量、存储过程、函数、流程控制结构

    第一部分:Mysql数据库基础知识(一)之 基础查询----分组查询 第二部分:Mysql数据库基础知识(二)之 连接查询----子查询-----分页查询------union联合查询 第三部分:My ...

  6. MySQL—变量、存储过程和函数(十一)

    一.变量 1 变量的种类 1.1 系统变量 系统变量一共分为两种:                                     1)全局变量                         ...

  7. 尚硅谷李玉婷老师MySQL课程--视图、变量、存储过程和函数、流程控制结构

    一.视图 1.视图的创建 CREATE VIEW 视图名 AS 查询语句; 例1: create view myv as select avg(salary),job_id from employee ...

  8. MySQL(视图、存储过程与函数、流程控制、触发器)

    第一章 视图 1 什么是视图 为了提高复杂的SQL语句的复用性和表的操作的安全性 ,MySQL数据库管理系统提高了视图特性,所谓视图,本质上是一种虚拟表,其内容与真实的表相似,包含一系列带有名称的列和 ...

  9. MySQL(8)存储过程和函数

    字段名   数据类型 主键 外键 非空 唯一 自增 id  INT  是   否    是    是  否 name VARCHAR(50)  否   否    是    否  否 glass   V ...

  10. 变量、存储过程与函数

    变量 分类 系统变量 全局变量 会话变量 自定义变量 用户变量 局部变量 系统变量 变量由系统提供,不是用户定义,属于服务器层面 查看所有的系统变量 SHOW GLOBAL | [SESSION] V ...

最新文章

  1. MLIR多级中间表示概述
  2. maven中打包项目为war包的pom.xml配置
  3. ASP.NET Core 实战:基于 Dapper 扩展你的数据访问方法
  4. C#线程、前后台线程
  5. 各种树:trie树、B树、B-树、B+树、B*树
  6. xhprof安装和使用方法(linux版本)
  7. SSL 1108——【USACO 2.1】海明码(DFS)
  8. 关于framework4.5的相关介绍
  9. SqlServer中查询某数据库所有表及其数据总条数和占用空间
  10. 湖南计算机专科学院分数线,湖南电子科技职业学院历年录取分数线
  11. 中望cad自定义快捷键命令_中望CAD快捷键全集
  12. 数据通信与计算机网络参考文献,通信工程论文参考文献
  13. JAVA就业管理系统(JAVA毕业设计)
  14. win7 计算机定时关机脚本,电脑设置定时关机的方法 win7系统怎么设置定时关机...
  15. Python爬虫实战 | (13) 爬取新浪滚动新闻
  16. 瑞士证交所主席认为发行加密瑞士法郎有益经济发展
  17. 微信隐藏/显示右上角菜单接口
  18. ojdbc6中的错误信息(中英) 【转】
  19. 毛球科技论述区块链之符号理论(下)
  20. 文件与异常及其相关函数(os模块)

热门文章

  1. P2661 信息传递
  2. (一)Quartz2.2.1 简单例子
  3. centos 挂载与卸载硬盘
  4. 后台代码调用Application Resources
  5. 拓端tecdat|python聚类算法的应用实例
  6. mysql比较varchar值大小_Mysql varchar大小长度问题
  7. rhel linux 自动 fsck,red hat as 4 启动报错:checking filesystems fsck.ext3: bad magic number ......
  8. detectron2 ImportError: cannot import name ‘_C‘ from ‘detectron2‘
  9. 数据挖掘著名学者的网站
  10. I/O多路复用技术(select/poll/epoll)