• SQL存储过程和函数


    变量

    在MySQL中变量分为三种类型: 系统变量、用户定义变量、局部变量。

    系统变量

    系统变量 是MySQL服务器提供,不是用户定义的,属于服务器层面。分为全局变量(GLOBAL)、会话变量(SESSION)。

    • 全局变量(GLOBAL): 全局变量针对于所有的会话。

    • 会话变量(SESSION): 会话变量针对于单个会话,在另外一个会话窗口不生效。

    查看系统变量:

    SHOW [ SESSION | GLOBAL ] VARIABLES ; -- 查看所有系统变量
    SHOW [ SESSION | GLOBAL ] VARIABLES LIKE '......'; -- 可以通过LIKE模糊匹配方
    式查找变量
    SELECT @@[SESSION | GLOBAL] 系统变量名; -- 查看指定变量的值
    
    • 1
    • 2
    • 3
    • 4

    设置系统变量:

    SET [ SESSION | GLOBAL ] 系统变量名 =;
    SET @@[SESSION | GLOBAL]系统变量名 =;
    
    • 1
    • 2

    用户定义变量

    用户定义变量 是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用 “@变量名” 使用就可以。其作用域为当前连接。

    -- 赋值
    set @myname = 'XXX';
    set @myage := 10;
    set @mygender := '男', @myhobby := 'sleep';
    select @mycolor := 'blue';
    select count(*) into @mycount from tb_user;
    
    -- 使用
    select @myname,@myage,@mygender,@myhobby;
    select @mycolor , @mycount;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    局部变量

    局部变量 是根据需要定义的在局部生效的变量,访问之前,需要DECLARE声明。

    可用作存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的BEGIN … END块。

    -- 声明局部变量 - declare
    -- 赋值
    create procedure p2()
    begin
    	declare ecount int default 0;  --声明
    	select count(*) into ecount from employee;  //赋值
    	select ecount;
    end;
    call p2();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    存储过程

    存储过程是事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。

    存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
    在这里插入图片描述
    特点:

    • 封装,复用
    • 可以接收参数,也可以返回数据
    • 减少网络交互,效率提升

    建表语句:

    CREATE TABLE employee(
    	employee_ID int not null,
    	employee_name varchar(20) not null,
    	street varchar(20) not null,
    	city varchar(20) not null,
    	PRIMARY KEY(employee_ID)
    );
    
    CREATE TABLE company(
    	company_name varchar(30) not null,
    	city varchar(20) not null,
    	PRIMARY KEY(company_name)
    );
    
    create table manages(
    	employee_ID int not null,
    	manager_ID int,
    	primary key(employee_ID),
      foreign key(employee_ID) references employee(employee_ID) on delete cascade,
    	foreign key(manager_ID) references employee(employee_ID) on delete set null			
    );
    
    create table works(
    	employee_ID int not null,
    	company_name varchar(30),
    	salary numeric(8,2) check (salary>3000),  
    	primary key(employee_ID),
    	foreign key(employee_ID) references employee(employee_ID) on delete cascade,
    	foreign key(company_name) references company(company_name) on delete set null									
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    1.创建一个存储过程CountEmp,其作用是获取employee表中记录的条数。

    CREATE PROCEDURE CountEmp()
    BEGIN
    	SELECT COUNT(*) as 'employee表记录数' FROM employee;
    END;
    
    CALL CountEmp();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.创建一个存储过程AvgSal,其作用是获取所有员工的平均工资。

    CREATE PROCEDURE AvgSal()
    BEGIN
    	SELECT AVG(salary) '员工的平均工资' from works;
    END;
    
    CALL AvgSal();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.创建一个存储过程CountCom1,输入变量为公司的名字(company_name),输出为该公司中员工的个数。

    CREATE PROCEDURE CountCom1(IN com_name VARCHAR(30))
    BEGIN
    	SELECT COUNT(*) '该公司中员工的个数' FROM works WHERE company_name=com_name;
    END;
    
    CALL CountCom1('Alibaba');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4.分别查看存储过程CountCom1的状态和定义。

    SHOW PROCEDURE STATUS LIKE 'CountCom1';
    SHOW CREATE PROCEDURE CountCom1;
    
    • 1
    • 2

    5.删除存储过程CountEmp。

    DROP PROCEDURE CountEmp;
    
    • 1

    存储函数

    存储函数是有返回值的存储过程。

    1.创建一个函数CityByName, 其作用是返回姓名为‘Shelby’的员工所居住的城市city。

    CREATE FUNCTION CityByName(ename VARCHAR(20))
    RETURNS VARCHAR(20) DETERMINISTIC
    BEGIN
    	DECLARE temp_city VARCHAR(20) DEFAULT NULL;
    	SELECT city INTO temp_city FROM employee WHERE employee_name=ename;
    	RETURN temp_city;
    END;
    
    SELECT CityByName('Shelby') '居住城市';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.创建一个函数CountCom2,输入变量为公司的名字(company_name),输出为该公司中员工的个数。

    CREATE FUNCTION CountCom2(com_name VARCHAR(30))
    RETURNS INT DETERMINISTIC
    BEGIN
    	DECLARE ecount INT DEFAULT 0; 
    	SELECT COUNT(*) INTO ecount FROM works WHERE company_name=com_name;
    	RETURN ecount;
    END;
    
    SELECT CountCom2('Alibaba') '该公司中员工的个数';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    3.分别查看函数CountCom2的状态和定义。

    SHOW FUNCTION STATUS LIKE 'CountCom2';
    SHOW CREATE FUNCTION CountCom2;
    
    • 1
    • 2

    4.删除存储函数。

    DROP FUNCTION CountCom2;
    
    • 1
  • 相关阅读:
    Python使用turtle绘图:pos();undo();home()
    多篇《Nature》和《Science》关于马约拉纳费米子的研究论文近日被撤稿
    ASP.NET Web 应用 Docker踩坑历程——续
    (一)RabbitMQ实战——rabbitmq的核心组件及其工作原理介绍
    〖Python网络爬虫实战㉕〗- Ajax数据爬取之Ajax 案例实战
    C++可视化和图表库
    C2025 基础进阶——模拟与枚举
    IAR 下的雅特力AT32F415CBT7工程创建与设置
    python特殊函数之__call__函数的作用
    安装指定版本docker和docker-compose
  • 原文地址:https://blog.csdn.net/m0_62122789/article/details/134445504