系统变量:全局变量和会话变量
自定义变量:用户变量和局部变量
由MySQL系统给我们提供的,不是用户定义的,属于服务器层面的应用
-- 全局变量
-- 查看所有的全局变量
SHOW GLOBAL VARIABLES;
-- 查看部分全局变量
SHOW GLOBAL VARIABLES LIKE '%char%';
-- 查看指定的全局变量
SELECT @@global.autocommit;
-- 为某个指定的全局变量赋值
SET @@global.autocommit=0;
-- 全局变量的作用域
-- 针对所有的会话(连接),只有服务器重新启动将会把所有的全局变量赋默认值,如果想跨启动,只有修改MYSQL的配置文件,不建议修改
--会话变量
-- 作用域只针对当前会话(连接)是有效的,与全局变量的区别
-- 查看所有的会话变量
SHOW SESSION VARIABLES;-- session 可以省略,默认会话变量
-- 查看部分会话变量
SHOW SESSION VARIABLES LIKE '%char%';
-- 查看指定的会话变量
SELECT @@session.autocommit;
SELECT @@autocommit;
-- 为某个指定的会话变量赋值
SET @@session.autocommit=0;
由用户定义的变量,不是mysql系统提供的
先声明,再赋值,后使用
-- 语法:
set @用户变量名 = 值;
set @用户变量名 := 值;
select @用户变量名 := 值;
-- 声明并初始化用户变量
SET @name = '张三';
-- 赋值
-- 方式一:SET @用户变量名 = 值;
SET @name='李四';
-- 方式二: select 字段 into @name from 表
SELECT COUNT(*) INTO @name FROM student;
-- 使用用户变量 -查看
SELECT @name;
-- 局部变量
-- 作用域:仅仅在定义它的begin end中有效,应用在begin end中,而且必须放在第一句
-- 声明
declare 变量名 类型;
declare 变量名 类型 default 值:;
-- 赋值
-- 方式一:SET 局部变量名 = 值;
-- 方式二: select 字段 into 局部变量名 from 表
-- 查看
SELECT 局部变量名;
作用域 | 定义和使用位置 | 语法 | |
---|---|---|---|
用户变量 | 当前会话 | 会话中的任何地方 | 必须使用@符合,不用类型限定 |
局部变量 | begin end 中 | 只能在begin end中,且为第一句 | 一般不用加@符号,需要限定类型 |
类似于在java中学到的方法
一组预先编译好的sql语句的集合,理解错批处理语句
create procedure 存储过程名(参数列表)
begin
存储过程体(一组合法的sql语句)
end;
-- 注意:参数列表包含了三部分: 参数模式,参数名,参数类型
-- 参数模式: in/out/inout sname varchar(20);
-- in:输入值,调用传入的值
-- out:输出参数,可以最为返回值来用
-- inout:既需要传入值,又可以返回值
delimiter 设置结束标识符
delimiter $
call 存储过程名(实参列表)
编写一个存储过程,该过程可以向表中添加记录
-- 创建测试表
create table mytest(
id int primary key auto_increment,
sname varchar(50),
spwd varchar(50),
)
-- 创建存储过程
DELIMITER $
create procedure myp1()
begin
insert into mytest(sname,spwd) values('admin','123456'),('赵四','123789');
end;$
-- 调用存储过程
call myp1();
-- 删除存储过程
drop procedure myp1;
1.编写一个存储过程,需要输入学生名,查询该学生对应的班级名称
DELIMITER $
create procedure myp2(in myname varchar(30)) -- in可以不写,默认
begin
select c.cname,s.sname
from student s join class c on s.cno=c.cno and s.sname = myname;
end;$
CALL myp2('tom');
2.创建存储过程,实现用户登录功能(多个参数,用户名,密码)
DELIMITER $
create procedure myp3(in mname varchar(30),in mpass varchar(30))
begin
-- 声明局部变量,初始化
declare result varchar(20) default '';
select count(*) into result
from mytest m where m.sname=mname and m.spwd = mpass
select result;-- 登录成功返回1,失败返回0
end;$
CALL myp3('admin','123456');
1.通过学生编号,返回对应的班级名称;(输入参数,一个返回值)
DELIMITER $
CREATE PROCEDURE myp4(IN myid VARCHAR(20),OUT mclassname VARCHAR(20))
BEGIN
SELECT c.cname INTO mclassname
FROM student s,class c WHERE s.cno=c.cno AND s.sno=myid;
END;$
CALL myp4('1805',@cname) -- 用自定义变量接收
SELECT @cname;-- 查询自定义变量
2.通过学生编号,返回对应的班级名称,学生姓名;(输入参数,二个返回值)
DELIMITER $
CREATE PROCEDURE myp5(IN myid VARCHAR(20),OUT mclassname VARCHAR(20),msname varchar(20))
BEGIN
SELECT c.cname,s.sname INTO mclassname,msname
FROM student s,class c WHERE s.cno=c.cno AND s.sno=myid;
END;$
CALL myp5('1805',@cname,@sname)
SELECT @cname,@sname;
-- 案例:传入两个数值,输出返回这两个数据的翻倍值
DELIMITER $
create procedure myp6(inout num1 int,inout num2 int)
begin
set num1 = num1 * 2;
set num2 = num2 * 2;
end;$
-- 调用
SET @m=10;
SET @n=5;
CALL myp6(@m,@n)
SELECT @m,@n;
show create procedure myp6;
-- 注意点:存储过程没用修改操作,要么只能重新创建方式
-- 创建存储过程实现传入一个日期,格式化成xx年xx月xx日方式返回
DELIMITER $
CREATE PROCEDURE myp7(IN mDate DATETIME,OUT sDate VARCHAR(50))
BEGIN
SELECT DATE_FORMAT(mDate,'%Y年%m月%d日') INTO sDate;
END;$
-- 调用
CALL myp7(NOW(),@time); -- 输入当前时间
SELECT @time;
-- 创建分页的存储过程,传入起始索引和每页显示的大小,查询出数据并返回
DELIMITER $
CREATE PROCEDURE myp8(IN startindex INT, IN size INT)
BEGIN
SELECT * FROM student LIMIT startindex,size;
END;$
-- 调用
CALL myp8(0,3)
CALL myp8(3,3)
一组预先编译好的sql语句的集合,理解错批处理语句
函数和存储过程功能可以相同,一样的,主要看研究他们的区别:
存储过程:可以没有返回值,也可以有多个返回值,适合做批量插入、批量更新上;
函数:有且仅有一个返回值,适合做处理数据后的返回结果(一个)
create function 函数名(参数列表) returns 返回类型
begin
函数体
end
-- 注意:
--:参数列表包含两个部分:参数名,参数类型
-- 函数体:肯定会有return 语句,没有会报错
-- 调用语法
select 函数名(参数列表);
-- 案例:返回学生表的学生个数
DELIMITER $
CREATE FUNCTION myf1() RETURNS INT
BEGIN
DECLARE c INT DEFAULT 0;-- 定义局部变量
SELECT COUNT(*) INTO c FROM student;
RETURN c;
END;$
-- 调用
SELECT myf1();
-- 案例:根据学生名,返回学生成绩
DELIMITER $
CREATE FUNCTION myf2(myname VARCHAR(20)) RETURNS DOUBLE
BEGIN
SET @score = 0;
SELECT student.score INTO @score
FROM student WHERE student.sname=myname;
RETURN @score;
END;$
-- 调用
SELECT myf2('tom');
-- 案例:根据班级名称,返回该班级的平均成绩
DELIMITER $
CREATE FUNCTION myf3(classname VARCHAR(30)) RETURNS DOUBLE
BEGIN
SET @avgscore = 0;
SELECT AVG(s.score) INTO @avgscore
FROM student s,class c WHERE c.cno = s.cno AND c.cname=classname;
RETURN @avgscore;
END;$
-- 调用
SELECT myf3('classtwo');
show create function 函数名称;
drop function 函数名;
-- 和存储过程一样都没有修改过程