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;