从0基础学习MySQL数据库(四)

MySQL数据库技术

十三、变量

1.分类

系统变量:全局变量和会话变量

自定义变量:用户变量和局部变量

2.系统变量

由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;

3.自定义变量

由用户定义的变量,不是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中学到的方法

1.存储过程和函数的好处

  • 提高代码的重用性
  • 简化了sql操作
  • 减少了编译次数,提高开发效率[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YzApFMkd-1608454319982)(C:\Users\24582\AppData\Roaming\Typora\typora-user-images\image-20201220143015161.png)]

2.存储过程

一组预先编译好的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;
创建带有in模式参数的存储过程

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');
创建带有out模式参数的存储过程

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;
创建带有inout模式参数的存储过程
-- 案例:传入两个数值,输出返回这两个数据的翻倍值
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;

3.查看存储过程信息

show create procedure myp6;

-- 注意点:存储过程没用修改操作,要么只能重新创建方式

4.练习

-- 创建存储过程实现传入一个日期,格式化成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语句的集合,理解错批处理语句

1.与存储过程的区别

函数和存储过程功能可以相同,一样的,主要看研究他们的区别:

存储过程:可以没有返回值,也可以有多个返回值,适合做批量插入、批量更新上;

函数:有且仅有一个返回值,适合做处理数据后的返回结果(一个)

2.创建方法

create function 函数名(参数列表) returns 返回类型
begin
	函数体
end

-- 注意:
	--:参数列表包含两个部分:参数名,参数类型
	-- 函数体:肯定会有return 语句,没有会报错
	
-- 调用语法
select 函数名(参数列表);

3.案例操作

-- 案例:返回学生表的学生个数
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');

4.查看函数

show create function 函数名称;

5.删除函数

drop function 函数名;
-- 和存储过程一样都没有修改过程

猜你喜欢

转载自blog.csdn.net/zjdzka/article/details/111448074