MySQL变量、函数、存储过程的使用

MySQL语句:

  1. 变量
  2. 流程控制语句
  3. 函数
  4. 存储过程

一、变量

在mysql文档中,mysql变量可分为两大类,即系统变量和用户变量。

但根据实际应用又被细化为四种类型,即局部变量用户变量会话变量全局变量

1、局部变量

mysql局部变量,只能用在begin/end语句块中,比如存储过程中的begin/end语句块。其作用域仅限于该语句块。

-- declare语句专门用于定义局部变量,可以使用default来说明默认值
-- DECLARE 变量名 [,variable_name...] 数据类型 [DEFAULT value];
declare age int default 0;

 -- 局部变量的赋值方式一
 -- SET 变量名 = 表达式值 [,variable_name = expression ...]
 set age=18;
 
 -- 局部变量的赋值方式二
 select StuAge 
 into age
 from demo.student 
 where StuNo='A001';

2、用户变量

mysql用户变量,mysql中用户变量不用提前申明,在用的时候直接用“@变量名”使用就可以了。其作用域为当前连接。

 1 -- 第一种用法,使用set时可以用“=”或“:=”两种赋值符号赋值
 2 set @age=19;
 3 
 4 set @age:=20;
 5 
 6 -- 第二种用法,使用select时必须用“:=”赋值符号赋值
 7 select @age:=22;
 8 
 9 select @age:=StuAge 
10 from demo.student 
11 where StuNo='A001';

3、会话变量

mysql会话变量,服务器为每个连接的客户端维护一系列会话变量。其作用域仅限于当前连接,即每个连接中的会话变量是独立的。

 1 -- 显示所有的会话变量
 2 show session variables;
 3 
 4 -- 设置会话变量的值的三种方式
 5 set session auto_increment_increment=1;
 6 set @@session.auto_increment_increment=2;
 7 set auto_increment_increment=3;        -- 当省略session关键字时,默认缺省为session,即设置会话变量的值
 8 
 9 -- 查询会话变量的值的三种方式
10 select @@auto_increment_increment;
11 select @@session.auto_increment_increment;
12 show session variables like '%auto_increment_increment%';        -- session关键字可省略
13 
14 -- 关键字session也可用关键字local替代
15 set @@local.auto_increment_increment=1;
16 select @@local.auto_increment_increment;

4、全局变量

mysql全局变量,全局变量影响服务器整体操作,当服务启动时,它将所有全局变量初始化为默认值。要想更改全局变量,必须具有super权限。其作用域为server的整个生命周期。

 1 -- 显示所有的全局变量
 2 show global variables;
 3 
 4 -- 设置全局变量的值的两种方式
 5 set global sql_warnings=ON;        -- global不能省略
 6 set @@global.sql_warnings=OFF;
 7 
 8 -- 查询全局变量的值的两种方式
 9 select @@global.sql_warnings;
10 show global variables like '%sql_warnings%';

二、流程控制语句

1、区块定义

[lable:]begin
  statement
end [label];

2、条件语句

 

if 条件 then
    statement
elseif 条件 then
    statement
else statement 

end if;

 

case -- 条件开始
    when 条件 then statement;
    when 条件  then statement;
    else statement;
end case; -- 条件结束

3、循环语句

  • while循环

[label:] WHILE expression DO

    statements

END WHILE [label] ;
  • loop循环

[label:] LOOP

    statements
   -- leave [label]
-- 结束循环
   -- iterate [label] -- 结束本次循环
END LOOP [label];
  • repeat until循环

[label:] REPEAT

    statements

UNTIL expression

END REPEAT [label] ;

三、函数

函数存储着一系列sql语句,调用函数就是一次性执行这些语句,但是只能返回一个值。

自定义函数分为二种,一种是标量值函数,另一种是表格值函数

1、 标量值函数 :返回一个标量值

Create function 函数名(参数) Returns 返回值数据类型
as
begin
    SQL语句(必须有return 变量或值)
End
 -- 创建函数
CREATE  FUNCTION MySTR(@strs VARCHAR(50)) RETURNS VARCHAR(50) 
AS
BEGIN
     DECLARE @str2 VARCHAR(30)
     SET @str2=@strs

     DECLARE @str3 VARCHAR(30)
     SET @str3=(select name from userinfo where huji=dbo.MySTR('邯郸') and id=23 )
     RETURN @str2
END

-- 调用函数
SELECT dbo.MySTR('aa') AS result

2、表格值函数 ,表格值函数有二种(内联表格值函数,多句表格值函数)

  • 内联表格值函数:返回一个表格

create function 函数名(参数)returns table
as
return(一条SQL语句)
-- 创建函数
CREATE  FUNCTION   tabcmess(@title VARCHAR(10)) RETURNS  TABLE 
AS 
return(select title,des from product where title like '%'+@title+'%')

-- 调用
SELECT * FROM tabcmess('aaa')
  • 多句表格值函数

create function 函数名(参数) returns 表格变量名 table(表格变量定义)
as
begin
    SQL语句
end
-- 创建函数
CREATE   function tabcmessalot (@title varchar(10)) Returns @ctable table(title varchar(10) null,des varchar(100) null)
As
Begin
    Insert @ctable Select title,des from product WHERE title LIKE '%'+@title+'%'
    return
End
 
-- 调用函数
SELECT * FROM tabcmessalot('aaa')

四、存储过程

存储过程简单来说,就是为以后的使用而保存的一条或多条 MySQL 语句的集合

  delimiter //  一般情况下MYSQL以;结尾表示确认输入并执行语句,但在存储过程中;不是表示结束,因此可以用该命令将;号改为//表示确认输入并执行。

1、创建存储过程

-- 创建存储过程
create
procedure sp_name(in 输入变量名 数据类型,out 输出变量名 数据类型,inout 输入输出变量名 数据类型) begin ......... end

2、调用存储过程

call sp_name([输入参数], [@输出变量名])  -- 调用存储过程
select @输出变量名 -- 显示过程输出结果

3、删除存储过程

drop procedure sp_name

4、其他命令

-- 显示存储过程
SHOW PROCEDURE STATUS;

-- 显示特定数据库的存储过程
SHOW PROCEDURE status where db = 'schooldb';

-- 显示特定模式的存储过程
SHOW PROCEDURE status where name like '%my%';

-- 显示存储过程“mypro1”的源码
SHOW CREATE PROCEDURE mypro1;
作者:zhangshuai
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/zhangshaui/p/15118517.html