变量
系统变量:
全局变量
作用域:服务器每次启动将为所有的全局变量赋予初始值,针对于所有会话(连接)有效,但是不能跨重启
会话变量
作用域:仅仅针对于当前会话(连接)有效
自定义变量:
用户变量
作用域:针对于当前会话(连接)有效
应用在任何地方,也就是begin end 里面或者外面
局部变量
作用域:仅仅在定义它的begin end 中有效
应用在begin end 中的第一句话
#一、系统变量
说明:变量由系统提供,不是用户定义,属于服务器层面
实用语法:
1.查看所有的关系变量
show global variables;#全局变量
show [session] variables;#会话变量
2.查看满足条件的部分变量
show global |[session] variables like ‘%char%’;
3.查看某个指定的系统变量的值
select @@global |[session].系统变量名;
4.为某个系统变量赋值
方式一:
set @@global |[session] 系统变量名 = 值;
方式二:
set global |[session] 系统变量名 = 值;
注意:
如果是全局级别,则需要加global,如果是会话级别,则需要加session,如果不加默认为session级别
#二、自定义变量
说明:变量使用户自定义的,不是由系统定义的;
使用步骤:
声明
赋值
使用(查看、比较、运算等)
#1.用户变量
#①声明并初始化 赋值的操作符: =或 :=
SET @用户变量名 = 值;
或 SET @用户变量名:=值;
或 SELECT @用户变量名:=值;
#②赋值(更新用户变量的值)
方式一:
SET @用户变量名 = 值;
或 SET @用户变量名:=值;
或 SELECT @用户变量名:=值;
方式二:通过SELECT INTO
SELECT 字段 INTO @变量名
FROM 表;
#③使用(查看用户变量的值)
SELECT @用户变量名;
#案例
SET @count = 1;
SELECT COUNT(*) INTO @count
FROM employees;
SELECT @count;
#2.局部变量
#①声明
DECLARE 变量名 类型;
DECLARE 变量名 类型 DEFAULT 值;
#②赋值
方式一:
SET 局部变量名 = 值;
或 SET 局部变量名:=值;
或 SELECT @局部变量名:=值;
方式二:通过SELECT INTO
SELECT 字段 INTO 局部变量名
FROM 表;
#③使用
SELECT 局部变量名;
#存储过程和函数
/*
存储过程和函数:类似于Java中的方法
好处:
1.提高代码的重要性
2.简化操作
存储过程:一组预先编译好的sql语句集合,理解成批处理语句
1.提高代码的重要性
2.简化操作
3.减少了编译次数并减少了和数据库服务器的连接次数,提高了效率
*/
#一、创建语法
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
存储过程体(一组合法的SQL语句)
END
注意:
1.参数列表包含三部分:
参数模式 参数名 参数类型
举例:
IN stuname VARCHAR(20)
参数模式
IN :该参数可以作为输入,也就是该参数需要调用方传入值
OUT:该参数可以作为输出,也就是该参数可以作为返回值
INOUT:该参数既可以作为输入又可以作为输出,也就是该参数既需要传入值,又可以返回值
2.如果存储过程体仅仅只有一句话,BEGIN END 可以省略
存储过程体中的每条SQL语句的结尾要求必须加分号。
存储过程的结尾可以使用DELIMITER重新设置:DELIMITER 结束标记
#二、调用语法
CALL 存储过程名(实参列表);
#1.空参列表
#案例:插入到admin表中五条记录
命令提示符界面
mysql -uroot -p密码
DELIMITER $
CREATE PROCEDURE p1()
BEGIN
INSERT INTO admin(username,`password`)
VALUES('join1',0000),
('join2',0000),
('join3',0000),
('join4',0000),
('join5',0000);
END $
#调用
CALL p1()$
#2.创建带有in模式参数的存储过程
#案例1 :创建存储过程实现 根据女神名,查询对应的男神信息
CREATE PROCEDURE p2(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 p2('柳岩')$
#案例2:创建存储过程实现,用户是否成功登陆
CREATE PROCEDURE p3(IN username VARCHAR(20),IN PASSWORD VARCHAR(20))
BEGIN
DECLARE result INT DEFAULT 0;
DECLARE COUNT(*) INTO result
FROM admin
WHERE admin.`username` = username
AND admin.`password`=PASSWORD;
SELECT result;
END $
#调用
CALL p3('张飞','8888') $
CREATE PROCEDURE p4(IN username VARCHAR(20),IN PASSWORD VARCHAR(20))
BEGIN
DECLARE result INT DEFAULT 0;
DECLARE COUNT(*) INTO result
FROM admin
WHERE admin.`username` = username
AND admin.`password`=PASSWORD;
SELECT IF(result,'成功','失败');
END $
#3.创建带out模式的存储过程
#案例1:根据女生名,返回对应的男神名
CREATE PROCEDURE p5(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20))
BEGIN
SELECT bo.boyName INTO boyName
FROM boys bo
INNER JOIN beauty b
ON bo.id = b.boyfriend_id
WHERE b.name = beautyName;
END $
#调用
SET @bName $
CALL p5('小昭',@bName) $
SELECT @bName $
#案例2:根据女生名,返回对应的男神名及其魅力值
CREATE PROCEDURE p6(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20),OUT userCP INT)
BEGIN
SELECT bo.boyName ,bo.userCP INTO boyName,userCP
FROM boys bo
INNER JOIN beauty b
ON bo.id = b.boyfriend_id
WHERE b.name = beautyName;
END $
#调用
SET @bName $
SET @usercp
CALL p6('小昭',@bName,@usercp) $
SELECT @bName @usercp $
#4.创建带有inout模式参数的存储过程
#案例1:传入a,b两个值,最终a,b都翻倍并返回
CREATE PROCEDURE p7(INOUT a INT,INOUT b INT)
BEGIN
SET a = a*2;
SET b = b*2;
END &
#调用
SET @m = 10 $
SET @n = 20 $
CALL p8(@m,@n) $
SELECT @m,@n
#二、删除存储过程
语法:DROP PROCEDURE 存储过程名
注意:每次删除存储过程仅仅一个
#三、查看存储过程的信息
SHOW CREATE PROCEDURE p1;