变量

#变量 属性
/**
系统变量:
					全局变量:作用于系统 服务器每次启动将为所有的全局变量赋予初始值 针对于所有的会话(连接)有效 但不能跨重启
					
					会话变量:仅仅针对于当前的会话(连接)有效

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

*/

一、系统变量

# 一、系统变量
/*
说明:变量由系统提供 不是用户定义的 属于服务器层面 
使用语法
1.查看所有的系统变量 全局变量
SHOW  GLOBAL VARIABLES;

2.会话变量
SHOW SESSION VARIABLES

3.查看满足条件的部分系统变量 

SHOW GLOBAL| 【SESSION】 VARIABLES LIKE '%char%'

4.查看某个指定的某个系统变量的值
SELECT @@GLOBAL|[SESSION].系统变量名

5.为某个系统变量赋值
set GLOBAL| SESSION 系统变量名 =值 

SET autocommit =0;

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

注意:
如果是全局级别 则需要加global 
如果是会话级别 则需要加session 不写默认session
*/

#全局变量
SHOW GLOBAL VARIABLES;

#会话变量
SHOW VARIABLES;

#查看部分的会话变量
SHOW VARIABLES LIKE '%char%'

#查看某个指定的会话变量
SELECT @@transaction_isolation

#为某个变量赋值
set @@SESSION.transaction_isolation='read-uncommitted'

set transaction_isolation='read-committed'

自定义变量

# 自定义变量
/**
说明:变量是用户自定义的 不是由系统的
使用步骤
声明
赋值
使用(查看,运算,比较)
*/

#1.自定义用户变量
/**
作用域 :针对当前会话(连接)会话变量的作用域
应用在任何地方 也就是begin end 里面或begin end 外面 
*/
#赋值操作符 :=|:=
#①声明 初始化
SET @用户变量名 = 值| set @用户变量名:=值|SELECT @用户变量名:=值

#②赋值(更新用户变量值)
#方式一
SET @用户变量名 = 值| set @用户变量名:=值|SELECT @用户变量名:=值

#方式二
SELECT  INTO 
#得到的值必须是一个值
SELECT 字段 INTO @变量名 FROM 表 

#方式三 查看 
SELECT @变量名

#查看方式
SET @name ='66666'

SELECT @name
SELECT @name1
SELECT COUNT(*) INTO @name1 FROM stuinfo;

#自定义局部变量
/**
作用域:仅仅在定义它的begin end 中有效
应用于 begin END 中的第一句话 !!!!


*/

#① 声明
DECLARE 变量名 类型
DECLARE 变量名 类型 DEFAULT 值;

#② 赋值

#方式一
SET 局部变量名 = 值| set 局部变量名:=值|SELECT @局部变量名:=值

#方式二
SELECT  INTO 
#得到的值必须是一个值
SELECT 字段 INTO @局部变量名 FROM 表 

#使用
SELECT 局部变量名 


				作用域 								定义和使用的位置															
	
用户变量 				针对于当前会话      BEGIN END 外|BEGIN END 里面{会话中任何地方]

局部变量 				BEGIN END 里面				BEGIN END 中第一句话 

# 求两个变量之和
#用户变量写的
set @m =4;
SET @n=8;
SEt @sum =@n+@m
#查看
SELECT @sum;

#局部变量 要放到 BEGIN END 中
DECLARE i BIGINT; 
DECLARE j BIGINT ;

DECLARE sum1 INT = i+j;

存储过程

#存储过程和函数
/**
存储过程和函数 :类似于Java中的方法
好处:提高代码的重用性
			简化操作
			减少了编译次数并且减少了和数据库服务器的连接次数 提高了效率

*/
#存储过程
/**
含义:一组预先编译好的sql语句的集合 理解成批处理语句
类似java类 调用时会检查它是否编译 减少了编译次数

*/

#一、创建语法

CREATE PROCEDURE 存储过程名 (参数列表)
BEGIN

	方法体(一组合法的SQL语句)

END;
注意:
1.参数列表包含三部分
参数模式  参数名 参数类型
举例
IN stuname  VARCHAR(20)

1.参数模式
IN[进]:修饰参数 需要调用方传入值  
OUT[出]:该参数可以输出 也就是该参数可以作为返回值
INOUT[即可进又可出]:该参数既可以作为输入又可以作为输出 ,该参数即需要传入值 又可以返回值

2.如果存储过程体仅仅只有一句话 BEGIN END 可以省略
存储过程体中的每条SQL语句的结尾要求加分号
存储过程的结尾可以使用 DELIMITER 重新设置
语法:
DELIMITER 结束标记

DELIMITER $

#二、调用语法
CALL 存储过程名(实参列表);

# 1.空参列表
#案例:插入到admin表中五条记录

SELECT * FROM admin;
DESC admin

#定义一个结束的标识 DELIMITER $ 
DELIMITER $
CREATE PROCEDURE mymp()
BEGIN

	INSERT INTO admin ( username, `password` )
	VALUES
		( 'lily', '99991' ),
		( 'lily1', '99992' ),
		( 'lily2', '99993' ),
		( 'lily3', '99994' ),
		( 'lily4', '99995' );

END $;

#调用存储过程
CALL mymp();

#2.创建带in模式参数的存储过程
DESC beauty;
#案例1:创建存储过程实现 根据女神名 查询对应的男神信息

DELIMITER $
CREATE PROCEDURE my_girl ( IN girlname VARCHAR ( 20 ) ) BEGIN
SELECT
	bo.* 
FROM
	beauty be,
	boys bo 
WHERE
	bo.id = be.boyfriend_id 
	AND `name` = girlname;

END $;

SELECT * FROM beauty;

#调用my_girl 
CALL my_girl('周芷若');

#案例2:创建存储过程实现 用户是否登录成功
desc admin;

DELIMITER $
CREATE PROCEDURE myp3(IN username VARCHAR(20),IN password VARCHAR(20) )
BEGIN 
		#设置变量名
		DECLARE result VARCHAR(100) DEFAULT '';
	
		#当参数与字段重名时使用表名引用
	SELECT
		COUNT( * )  INTO result
	FROM
		admin 
	WHERE
		admin.`password` = `password` 
		AND admin.username= username;

		SELECT IF(result>0,'登录成功','登录失败') as '结果';
END $;

# 调用 
CALL myp3('john' , '8888');

#3.创建带out 模式的存储过程
#案例1:根据女神名 返回对应的男神名

DELIMITER $
CREATE PROCEDURE myp4(IN girlsName VARCHAR(20),OUT boyName VARCHAR(20))
BEGIN 
	SELECT
		bo.boyName INTO boyName
	FROM
		boys bo,
		beauty be 
	WHERE
		be.boyfriend_id = bo.id 
		AND
		be.`name` = girlsName;

END ;

#调用
SET @result ='';
#也可以直接放入  赋值
CALL myp4('小昭', @result);
#查询结果
SELECT @result;


#案例2:根据女神名 返回对应的男神名和男神魅力值
DESC boys

CREATE PROCEDURE myp5(IN girlsName VARCHAR(20),OUT boyName VARCHAR(20), OUT	 userCP INT)
BEGIN 
		
	SELECT
		bo.boyName ,
		bo.userCP  INTO boyName ,userCP
	FROM
		beauty be,
		boys bo 
	WHERE
		bo.id = be.boyfriend_id
		AND be.`name` =girlsName;
END;

#调用 
CALL myp5('周芷若',@bName,@cp);

SELECT @bName,@cp;

#4.创建带inout模式参数的存储过程
#案例1:传入a和b两个值 最终a和b都翻倍并返回

CREATE PROCEDURE myp6(INOUT a int ,INOUT b int )
BEGIN
		SET a=a*2;
		SET b=b*2;
END;

#调用 
#用户变量
SET @a =10;
SET @b=20;
#调用 
CALL myp6(@a ,@b);
#查看
SELECT @a,@b;

#删除存储过程
#语法 DROP PROCEDURE 存储过程名
DROP PROCEDURE str_to

#三 查看存储过程的信息
SHOW CREATE PROCEDURE  myp3;