小白菜学Mysql笔记(五)---变量存储函数流程

mysql变量
	系统变量:
		全局变量
		会话变量
		
	自定义变量:
		用户变量
		局部变量
		
一.系统变量
变量由系统提供,不是用户定义,属于服务器层面
	使用的语法:
		global(全局)|[session](会话).
		1.查看所有的系统变量
		show  global|[session] variables;
		
		2.查看满足条件的部分系统变量
		show global|[session] variables like '%char%';
		
		3.查看指定的某个系统变量的值
		SELECT @@global|[session].系统变量名;
		
		4.为某个具体的系统变量赋值
		set global|[session].系统变量名 =;
		
		set @@global|[session].系统变量名 =; 
		注意:
		如果是全局级别,需要加global,如果是会话级别,session
	
	1.全局变量
	作用域:
	服务器每次启动将为所有的全局变量赋初始值
	针对于所有的会话(连接)有效,但不能跨重启
	
		查看所有的全局变量
		SHOW GLOBAL VARIABLES ;

		查看部分的全部变量
		SHOW GLOBAL VARIABLES LIKE '%char%';

		查看指定的全局变量的值
		SELECT @@global.autocommit;
		SELECT @@tx_isolation;

		为某个指定的全局变量赋值
		SET @@global.autocommit=0;
	
	2.会话变量
	作用域:
	仅仅针对于当前会话(连接)会话

		查看所有的会话变量
		SHOW [SESSION] VARIABLES;
		SHOW VARIABLES;

		查看部分的会话变量
		SHOW [SESSION] VARIABLES LIKE '%char%';

		查看指定的某个会话变量
		SELECT @@tx_isolation;
		SELECT @@session.tx_isolation;

		为某个会话变量赋值
		SET @@session.tx_isolation='read-uncommitted';

		SET SESSION tx_isolation='read-uncommitted';.自定义变量
变量是由用户自定义,不是由系统
使用步骤:
生命
赋值
使用(查看,比较,运算等)

	1.用户变量
	作用域:
	针对于当前会话(连接)有效,同于会话变量的作用域
	应用在任何地方,也就是begin end里面或外面
	
		赋值的操作符: =或:=
		①声明并初始化
		set @用户变量名=;set @用户变量名:=;SELECT @用户变量名:=;
		
		②赋值(更新用户变量的值)
		自动设定数值类型
		方式一:通过setselect
			set @用户变量名=;set @用户变量名:=;SELECT @用户变量名:=;
			
		方式二:通过select INTO
			SELECT 字段 into @用户变量名
			FROM;
		
		
		③使用,查看用户变量名
		SELECT @用户变量名;
	
	2.局部变量
	作用域:
	仅仅在定义它的begin end中有效
	应用于begin end 中的第一句话!!!
	
		①声明
		DECLARE 变量名 类型;
		DECLARE 变量名 类型 DEFAULT;
		
		②赋值
		方式一:通过setselect
			set 局部变量名=;set 局部变量名:=;SELECT @局部变量名:=;
			
		方式二:通过select INTO
			SELECT 字段 into 局部变量名
			FROM;
			
		③使用
		SELECT 局部变量名;
	
	
			作用域		定义和使用的位置	语法
用户变量	当前会话	会话中的任何地方	需加@,不用限定类型

局部变量	begin end中	要在第一句话		一般不用加@,需限定类型
	
	
	#声明两个变量并赋初值,求和,并打印
	1.用户变量
	set @m=1;
	set @n=2;
	set @sum =@m+@n;
	SELECT @sum;
	
	2.局部变量
	DECLARE m int DEFAULT 1;
	DECLARE n int DEFAULT 2;
	DECLARE sum int;
	set sum =m+n;
	SELECT sum;
	
	
存储过程和函数
好处:
1.提高代码的重用性
2.简化操作


			返回值		用处
存储过程	多个或0个	批量插入,更新
函数		仅仅一个	处理数据后返回一个结果



存储过程
	含义:一组预先编译好的sql语句的集合,理解成批处理语句
	减少了编译次数和减少了和数据服务器的连接次数

	一.创建语法
		CREATE PROCEDURE 存储过程名(参数列表)
		BEGIN
			存储过程体,一组合法的sql语句
		end
		
		注意:
		1.参数列表包含三部分:参数模式 参数名 参数类型
		如:in stuname varchar(20)
		
		参数模式:
		in		该参数可以作为输入,需要调用方传入值
		out 	该参数作为输出,可作为返回值
		inout	该参数作为输入,输出,既可以传入又可以返回
		
		2.如果存储过程体仅仅只有一句话,BEGIN end 可以省略
		存储过程体的每条sql语句的结尾要求必须加分号;
		存储过程体结尾可以使用 delimiter 重新设置
		delimiter 结束标记
		

	二.调用语法
		call 存储过程名(实参列表);
		
		1.空参列表
			插入到admin表中五条记录
			DELIMITER $
			CREATE PROCEDURE myp1()
			BEGIN
				INSERT INTO admin(username,PASSWORD)
				VALUES('john','1111'),
				('john','2222'),
				('john','3333'),
				('john','4444'),
				('john','5555');
			END $

			调用
			CALL myp1()$
			
		2.创建带in模式参数的存储过程
		
		#创建存储过程实现 根据女神名 查询对应的男神信息
			DELIMITER $

			CREATE PROCEDURE myp2(IN beautyname VARCHAR(20))
			BEGIN
				SELECT bo.*
				FROM boys bo
				RIGHT JOIN beauty b ON bo.id = b.boyfriend_id
				WHERE b.name = beautyname;
			END $;

			CALL myp2('柳岩');

			SET NAMES gbk;
			
			
		#创建存储过程,判断用户是否登录成功
			DELIMITER $;
			CREATE PROCEDURE myp3(IN username VARCHAR(20),IN PASSWORD VARCHAR(20))
			BEGIN 
				DECLARE result INT DEFAULT 0;#声明并初始化
				
				SELECT  COUNT(*) INTO result#赋值
				FROM admin a
				WHERE a.username = username
				AND a.password = PASSWORD;
				
				SELECT IF(result>0,'成功','失败') 结果;
			END $;

			CALL myp3('张飞','8888');
			CALL myp3('john','8888');
		
		2.创建带out模式的存储过程
		根据女神名,返回相应的男神名
			DELIMITER $

			CREATE PROCEDURE `myp6`(IN beautyname VARCHAR(20),OUT boyname VARCHAR(20))
			BEGIN
				SELECT bo.boyName INTO boyname
				FROM boys bo
				JOIN beauty b ON bo.id = b.boyfriend_id
				WHERE b.name = beautyname;
				
			END$;

			CALL myp5('小昭',@bname);
			SELECT @bname;
			
			#根据女神名,返回男神名和男神魅力
			DELIMITER $

			CREATE PROCEDURE myp6(IN beautyname VARCHAR(20),OUT boyname VARCHAR(20),OUT usercp INT)
			BEGIN
				SELECT bo.boyName,bo.userCP INTO boyname,usercp
				FROM boys bo
				JOIN beauty b ON bo.id = b.boyfriend_id
				WHERE b.name = beautyname;
				
			END $

			CALL myp6('柳岩',@boyname,@usercp);
			SELECT @boyname,@usercp;
		
		#3.创建带inout模式参数的存储过程
		#传入a和b两个值,最终a和b都翻倍并返回
			DELIMITER $

			CREATE PROCEDURE myp7(INOUT a INT,INOUT b INT)
			BEGIN
				SET a=a*2;
				SET b=b*2;
			END $

			SET @m=10;
			SET @n=20;
			CALL myp7(@m,@n);
			SELECT @m,@n;.删除存储过程

		语法:
		drop PROCEDURE 存储过程名;#一次只能删除一个.查看存储过程结构信息

		show CREATE PROCEDURE 存储过程名;.存储过程较少被修改

	1.创建存储过程实现传入用户名和密码,插入到admin表中
	CREATE PROCEDURE insert_admin(IN username VARCHAR(10),IN PASSWORD VARCHAR(10)) 
	BEGIN 
		INSERT INTO admin(admin.username,admin.password) 
		VALUES(username,PASSWORD); 
	END; 

	CALL insert_admin('bb','123456'); 
	SELECT * FROM admin;

	2.创建存储过程或函数实现传入女神编号,返回女神名称和女神电话
	DELIMITER $

	CREATE PROCEDURE sort_girl(IN girlid INT,OUT NAME VARCHAR(20),OUT phone VARCHAR(20))
	BEGIN
		SELECT b.name,b.phone INTO NAME,phone
		FROM beauty b
		WHERE b.id=girlid;
	END $


	CALL sort_girl(5,@n,@p);
	SELECT @n,@p;

	3.创建存储过程或函数传入实现两个女神生日,返回大小
	DELIMITER $

	CREATE PROCEDURE test_pro(IN birth1 DATETIME,IN birth2 DATETIME,OUT result INT)
	BEGIN
		SELECT DATEDIFF(birth1,birth2) INTO result;
	END $


	CALL test_pro('2019-8-1','2019-8-20',@r);
	SELECT @r;

	4.创建存储构成或函数传入一个日期,格式化成XXXX年xx月xx日返回
	DELIMITER $

	CREATE PROCEDURE date_switch(IN mydate DATETIME,OUT strdate VARCHAR(50))
	BEGIN
		SELECT DATE_FORMAT(mydate,'%y年%m月%d日') INTO strdate;
	END $

	SELECT DATE_FORMAT(NOW(),@s);

	5.创建存储过程或函数实现传入女神名称,返回女神 and 男神 格式的字符串
	DELIMITER $

	CREATE PROCEDURE test_pro2(IN beautyname VARCHAR(20),OUT str VARCHAR(50))
	BEGIN
		SELECT CONCAT(beautyname,'and',ifnull(boyname,'NULL')) INTO str
		FROM boys bo
		RIGHT JOIN beauty b ON b.boyfriend_id = bo.id
		WHERE b.name=beautyname;
	END $

	CALL test_pro2('柳岩',@s);
	SELECT @s;

	6.创建存储过程或函数,根据传入的条目数和起始索引,查询beauty表的记录

	DELIMITER $

	CREATE PROCEDURE test_pro3(IN startindex INT,IN size INT)
	BEGIN
		SELECT * 
		FROM beauty
		LIMIT startindex,size;
	END $

	CALL test_pro3(5,4);

函数:
只能有一个返回值

	1.函数创建语法
	CREATE FUNCTION 函数名(参数列表)
	RETURNS 返回类型
	BEGIN
		函数体
	end

	参数列表包括参数名 参数类型

	函数体:肯定有return语句 否则报错
	如果return没放在还是你话题最后不报错,但不建议

	函数体仅有一句话,可以省略begin end
	使用delimiter语句设置结束标记

	2.调用语法

	SELECT 函数名(参数列表)
	
	
1.无参有返回
返回公司的员工个数	
DELIMITER $
CREATE FUNCTION myf1() RETURNS INT
BEGIN
	DECLARE c INT DEFAULT 0;
	SELECT COUNT(*) INTO c
	FROM employees;
	RETURN c;
END $

SELECT myf1()$

2.有参有返回
根据员工名返回他的工资

DELIMITER $
CREATE FUNCTION myf2(empname VARCHAR(20)) RETURNS DOUBLE
BEGIN
	SET @sal=0;#定义用户变量
	
	SELECT Salary INTO @sal
	FROM employees e
	WHERE e.last_name=empname;
	
	RETURN @sal;
END $

SELECT myf2('Kochhar');

3.根据部门名,返回该部门的平均工资
DELIMITER $
CREATE FUNCTION myf3(depname VARCHAR(20)) RETURNS DOUBLE
BEGIN
	DECLARE sal DOUBLE;
	
	SELECT AVG(Salary) INTO sal
	FROM employees e
	JOIN departments d
	ON e.department_id = d.department_id
	WHERE d.department_name=depname;
	
	RETURN sal;
END $

SELECT myf3('IT');

	3.查看函数
	
	show create FUNCTION 函数名;
	
	4.删除函数
	
	DROP FUNCTION 函数名;
	
1.创建函数,实现传入两个float,返回两者之和

DELIMITER $
CREATE FUNCTION	test1(num1 FLOAT,num2 FLOAT) 
RETURNS FLOAT
BEGIN
	DECLARE SUM FLOAT;
	SET SUM=num1+num2;
	RETURN SUM;
END $

SELECT test1(1,2);
	
	
	
	
	
	
	
流程控制结构

顺序结构:程序从上往下依次执行
分支结构:程序从两条或多条路径中选择一条去执行
循环结构:程序满足一定条件的基础上,重复执行一段代码

	
一.分支结构

1.if函数
实现简单的双分支
语法:
SELECT IF(表达式1,表达式2,表达式3)
执行顺序:
如果表达式1成立,if函数返回表达式2.否则返回表达式3的值


2.CA SE结构
功能:
	1.实现等值判断,
	语法:
		CASE 变量|表达式|字段
		WHEN 要判断的值 THEN 返回值1或语句1;
		WHEN 要判断的值 THEN 返回值2或语句2;
		.....
		ELSE 要返回的值n或语句n;
		end CASE;
		
		
		
	2.实现区间判断
	语法:
		CASE 
		WHEN 要判断的条件1 THEN 返回值1或语句1;
		WHEN 要判断的条件2 THEN 返回值2或语句2;
		.....
		ELSE 要返回的值n或语句n;
		end CASE;
		
		
	特点:
	1.
	可以作为表达式,嵌套在其他语句中使用,可以放在任何地方,begin end中或begin end外
	可作为独立的语句去使用,只能放在begin end2.
	如果when中的值满足或条件陈丽,则执行对应的then后面的语句,并且结束ca se
	如果都不满足,则执行else中的语句或值

	3. else可以省略,如省略了,并且所有的when条件都不满足,则返回null
		
		
	创建存储过程,根据传入的成绩,来显示成绩,90-100:A 80-90:B 60-80:C 否则显示D

	DELIMITER $
	CREATE PROCEDURE test2(IN score INT) 
	BEGIN
		CASE
		WHEN score>=90 AND score<=100 THEN SELECT 'A';
		WHEN score>=80 THEN SELECT 'B';
		WHEN score>=60 THEN SELECT 'C';
		ELSE SELECT'D';
		END CASE;
	END $

	CALL test2(85);




3.IF结构
实现多重分支
语法:
IF 条件1 THEN 语句1;
ELSEif 条件2 THEN 语句2;
.....
[ELSE 语句n;]
end IF;

应用于begin end中


创建存储过程,根据传入的成绩,90-100:返回A 80-90返回B 60-80:返回C 否则显示D

DELIMITER $
CREATE FUNCTION test3(score INT)
RETURNS CHAR 
BEGIN
	
	IF score>=90 AND score<=100 THEN RETURN 'A';
	ELSEIF score>=80 THEN RETURN 'B';
	ELSEIF score>=60 THEN RETURN 'C';
	ELSE RETURN'D';
	END IF;
END $

SELECT test3(85);.循环结构

/*
分类:
WHILE,LOOP,repeat
循环控制:
iterate 类似于continue 结束本次循环,继续下一次
leave 类似于break 跳出,结束当前所在的循环
*/


	1.while
	先判断后执行
	加标签才可以用循环控制
	语法:
		[标记:]WHILE 循环条件 
		do 
			循环体;
		end WHILE [标签];

	2.LO OP
	没有条件的死循环
	语法:
		[标签:]LOOP
			循环体;
		end LOOP[标签];

	可以模拟简单的死循环


	3.repeat
	先执行后判断
	语法:
		[标签:]repeat
			循环体;
		UNTIL 结束循环的条件
		end repeat [标签];

1.批量插入,根据次数插入到admin表中多条记录,没添加循环控制语句
DELIMITER $
CREATE PROCEDURE pro_while1(IN insertcount INT)
BEGIN
	DECLARE i INT DEFAULT 1;
	WHILE i <= insertcount DO
		INSERT INTO admin(username,PASSWORD)
		VALUES (CONCAT('rose',i),'6666');
		SET i=i+1;
	END WHILE;
END $

SELECT *FROM admin;
CALL pro_while1(5);


批量插入,根据次数插入到admin表中多条记录,添加leave语句,如果次数>20则停滞
TRUNCATE TABLE admin;
DELIMITER $
CREATE PROCEDURE pro_while2(IN insertcount INT)
BEGIN
	DECLARE i INT DEFAULT 1;
	a:WHILE i <= insertcount DO
		INSERT INTO admin(username,PASSWORD)
		VALUES (CONCAT('xiaohua',i),'0000');
		IF i>=20 THEN LEAVE a;
		END IF;
		SET i=i+1;
	
	END WHILE a;
END $

SELECT *FROM admin;
CALL pro_while2(30);


批量插入,根据次数插入到admin表中多条记录,添加iterate 只插入偶数次

TRUNCATE TABLE admin;
DELIMITER $
CREATE PROCEDURE pro_while3(IN insertcount INT)
BEGIN
	DECLARE i INT DEFAULT 0;
	a:WHILE i <= insertcount DO
		SET i=i+1;
		IF MOD(i,2)!=0 THEN ITERATE a;
		END IF;
		INSERT INTO admin(username,PASSWORD)
		VALUES (CONCAT('xiaohua',i),'0000');
	
	END WHILE a;
END $

SELECT *FROM admin;
CALL pro_while3(30);
	
	
	
	
已知表,id自增长,content varchar(20),想该表插入指定个数,随机的字符串

CREATE TABLE stringcontent(
	id INT PRIMARY KEY AUTO_INCREMENT,
	content VARCHAR(20)
);

DELIMITER $
CREATE PROCEDURE test(IN insertcount INT)
BEGIN
	DECLARE i INT DEFAULT 1;
	DECLARE str VARCHAR(26) DEFAULT 'abcdefghijklmnopqrstuvwxyz';
	DECLARE startindex INT DEFAULT 1;
	DECLARE len INT DEFAULT 1;
	WHILE i<=insertcount DO
		SET len=FLOOR(RAND()*(20-startindex+1)+1);#产生1-(20-startindex+1)
		SET startindex=FLOOR(RAND()*26+1);#产生一个1-26的随机数
		INSERT INTO stringcontent(content)
		VALUES(SUBSTR(str,startindex,len));
		SET i=i+1;
	END WHILE;
END  $


CALL test(20);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值