SQL存储过程和函数

变量

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

系统变量

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

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

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

查看系统变量:

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

设置系统变量:

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

用户定义变量

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

-- 赋值
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;

局部变量

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

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

-- 声明局部变量 - declare
-- 赋值
create procedure p2()
begin
	declare ecount int default 0;  --声明
	select count(*) into ecount from employee;  //赋值
	select ecount;
end;
call p2();

存储过程

存储过程是事先经过编译并存储在数据库中的一段 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.创建一个存储过程CountEmp,其作用是获取employee表中记录的条数。

CREATE PROCEDURE CountEmp()
BEGIN
	SELECT COUNT(*) as 'employee表记录数' FROM employee;
END;

CALL CountEmp();

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

CREATE PROCEDURE AvgSal()
BEGIN
	SELECT AVG(salary) '员工的平均工资' from works;
END;

CALL AvgSal();

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');

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

SHOW PROCEDURE STATUS LIKE 'CountCom1';
SHOW CREATE PROCEDURE CountCom1;

5.删除存储过程CountEmp。

DROP PROCEDURE CountEmp;

存储函数

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

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') '居住城市';

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') '该公司中员工的个数';

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

SHOW FUNCTION STATUS LIKE 'CountCom2';
SHOW CREATE FUNCTION CountCom2;

4.删除存储函数。

DROP FUNCTION CountCom2;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值