目录
变量
系统变量
#查看所有的系统变量
SHOW GLOBAL VARIABLES;
SHOW SESSION VARIABLES;
#查看满足条件的部分系统变量
SHOW GLOBAL VARIABLES LIKE '%char%';
#查看指定的某个系统变量的值
SELECT @@global.系统变量名;
#为某个系统变量赋值
方式一:
SET GLOBAL 系统变量名=值
方式二:
SET @@global.系统变量名=值
全局变量
会话变量
作用域:仅仅针对于当前会话(连接)有效
#查看所有的会话变量
SHOW VARIABLES;
SHOW SESSION VARIABLES;
#查看部分会话变量
SHOW SESSION VARIABLES LIKE '%char%';
#查看指定的某个会话变量
SELECT @@back_log;
SELECT @@session.tx_isolation;
#为某个会话变量赋值
方式一:
SET @@session.tx_isolation='read-uncommitted';
方式二:
SET SESSION tx_isolation='read-uncommitted';
自定义变量
用户变量
作用域:针对于当前会话
#声明并初始化
SET @用户变量名=值;
SET @用户变量名:=值;
SELECT @用户变量名:=值;#赋值
方式一:
SET @用户变量名=值;
SET @用户变量名:=值;
SELECT @用户变量名:=值;
方式二:
SELECT 字段 INTO 变量#使用
SELECT @用户变量名;
#案例
#声明并初始化
SET @name='join';
SET @name=100;
SET @count=1;
#赋值
SELECT COUNT(*) INTO @count
FROM employees;
#查看
SELECT @count;
局部变量
作用域:仅仅在定义它的begin end 中有效
应用在begin end 中的第一句话
#声明
DECLARE 变量名 类型;
DECLARE 变量名 类型 DEFAULT 值;#赋值
方式一:
SET @局部变量名=值;
SET @局部变量名:=值;
SELECT @局部变量名:=值;
方式二:
SELECT 字段 INTO 局部变量名
FROM 表;#使用
SELECT 局部变量名;
存储过程和函数
存储过程
含义:一组预先编译好的sql语句的集合,理解成批处理语句
作用:
1.提高代码重用性,提高效率
#创建
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
存储过程体
END参数列表:参数模式 参数名 参数类型
参数模式:
in:该参数可以作为输入,也就是该参数需要调用方法入值
out:该参数可以作为输出,可以作为返回值
inout:既可以作为输入又可以作为输出#调用
CALL 存储过程名(实参列表);
#创建存储过程实现,用户是否登录成功
DELIMITER $$
CREATE PROCEDURE abc(IN username VARCHAR(20),IN userpwd VARCHAR(20))
BEGIN
DECLARE result INT DEFAULT 0;
SELECT COUNT(*) INTO result
FROM users
WHERE users.`u_name`=username
AND users.`pwd`=userpwd;
SELECT IF(result>0,'成功','失败');
END $$
#调用
CALL abc('b','aaa');
#案例:传入a和b两个值,最终a和b都翻倍并返回
DELIMITER $$
CREATE PROCEDURE aaa(INOUT a INT ,INOUT b INT)
BEGIN
SET a=a*2;
SET b=b*2;
SELECT a,b;
END $$
SET @m=2;
SET @n=3;
CALL aaa(@m,@n);
删除
DROP PROCEDURE aaa;
一次只能删除一个存储过程
查看
SHOW CREATE PROCEDURE aaa;
函数
有且仅有一个返回,适合做处理数据后返回一个结果
CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN
函数体
END
注意:
1.参数列表包含:函数名、函数类型。
2.函数体肯定会有return语句
调用方法:
select 函数名(参数列表)
#无参有返回
#返回公司的员工个数
DELIMITER $$
CREATE FUNCTION abc() RETURNS INT
READS SQL DATA
BEGIN
DECLARE a INT DEFAULT 0;
SELECT COUNT(*) INTO a
FROM employees;
RETURN a;
END $$
SELECT abc();
SELECT last_name
FROM employees;
#有参有返回
#根据员工名,返回他的工资
DELIMITER $$
CREATE FUNCTION fff(e_name VARCHAR(20)) RETURNS DOUBLE
READS SQL DATA
BEGIN
SET @sql=0;
SELECT salary INTO @sql
FROM employees e
WHERE e.last_name=e_name;
RETURN @sql;
END $$
SELECT fff('hunold');
#查看函数
SHOW CREATE FUNCTION fff;
#删除函数
DROP FUNCTION fff;
循环结构
分类:while、loop、repeat
循环控制:
1.iterate 类似于continue
2.leave 类似于break
while
【标签:】while 循环条件 DO
循环体
END while【标签】;
#案例:根据次数插入到users表中多条记录,如果次数>20则停止
TRUNCATE TABLE users;
DELIMITER $$
CREATE PROCEDURE fmn(IN u_count INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:WHILE i<u_count DO
INSERT INTO users(u_name,pwd)
VALUES(CONCAT('aa',i),'0000');
IF i>=20 THEN LEAVE a;
END IF;
SET i=i+1;
END WHILE a;
END $$
CALL fmn(50);
SELECT * FROM users;
#案例:根据次数插入到users表中多条记录,直插入奇数
TRUNCATE TABLE users;
DROP PROCEDURE fmn;
DELIMITER $$
CREATE PROCEDURE fmn(IN u_count INT)
BEGIN
DECLARE i INT DEFAULT 0;
a:WHILE i<u_count DO
SET i=i+1;
IF MOD(i,2)=0 THEN ITERATE a;
END IF;
INSERT INTO users(u_name,pwd)
VALUES(CONCAT('bb',i),'0000');
END WHILE a;
END $$
CALL fmn(10);
SELECT * FROM users;
loop
语法:
【标签:】loop
循环体
END loop【标签】;
可以用来模拟简单的死循环
repeat
语法:
【标签:】repeat
循环体
UNTIL 结束循环的条件
END repeat【标签】;