目录
存储过程和函数
存储过程和函数:类似于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 结束标记
例如 DELIMITER $ 也就是$=;
补充说明:
DELIMITER是分割符的意思,因为MySQL默认以”;”为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将”;”当做存储过程中的代码,不会执行这些代码,用完了之后要把分隔符还原。
一个例子:
DELIMITER $ //选择分界符
CREATE PROCEDURE test_pro3(IN birth1 DATETIME,IN birth2 DATETIME,OUT result INT)
BEGIN
SELECT DATEDIFF(birth1,birth2) INTO result;
END $
二、调用语法
CALL 存储过程名(实参列表);
三、删除存储过程
语法:DROP PROCEDURE 存储过程名
四、查看存储过程的信息
SHOW CREATE PROCEDURE 存储过程名
函数
与存储过程的区别:有且仅有一个返回,适合做处理数据后返回一个结果
一、创建语法
CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
BEGIN
函数体
END
注意:
1、参数列表 包含两部分
参数名 参数类型
2、函数体肯定会有RETURN语句,没有会报错
RETURN不放在最后也不会报错,但不建议
RETUNRN 值;
3、函数体中仅有一句话,则可以省略BEGIN END
4、使用DELIMITER语句设置结束标记
注意:若提示1418错误代码则输入
SET GLOBAL log_bin_trust_function_creators=TRUE;
信任子程序创建。
也可以这函数声明后加DETERMINISTIC
一个例子:
CREATE FUNCTION myf1() RETURNS INT
BEGIN
DECLARE c INT DEFAULT 0;
SELECT COUNT(*) INTO c
FROM employees;
RETURN c;
END $
二、调用语法
SELECT 函数名(参数列表);
三、查看函数
SHOW CREATE FUNCTION 函数名;
四、删除函数
DROP FUNCTION 函数名;
函数和存储过程都可以在mysql库中查到
流程控制结构
分类:
顺序结构:程序从上往下依次执行
分支结构:程序从两条或多条路径中选择一条去执行
循环结构:程序在满足一定条件的基础上,重复执行一段代码
一、分支结构
1、if函数 //前面学过
功能:实现简单的双分支
语法:
IF(表达式1,表达式2,表达式3)
执行顺序:
如果表达式1成立则返回2否则返回3
应用:在任何地方
2、case结构 //前面学过
情况1:类似于switch,一般用于等值判断
语法:
CASE 变量|表达式|字段
WHEN要判断的值 THEN 返回的值1或语句1
WHEN要判断的值 THEN 返回的值2或语句2
… ELSE 要返回的值n或语句n
END CASE;
情况2:类似多重IF,一般用于实现区间判断
语法:
CASE
WHEN要判断的条件1 THEN 返回的值1或语句1
WHEN要判断的条件2 THEN 返回的值2或语句2
… ELSE 要返回的值n或语句n
END CASE;
注意:若返回的是语句则每条独立的语句后要加上;
特点:
可以作为表达式,嵌套在其他语句中,可以放在任何地方,BEGIN END 中或外面
可以作为独立的语句去使用,只能放在BEGIN END中
如果满足WHEN则执行THEN后面的语句,并结束CASE
如果都不满足则执行ELSE
ELSE可以省略,但WHEN都不满足则返回NULL
3、if结构
功能:实现多重分支
语法:
IF 条件1 THEN 语句1;
ELSEIF 条件2 THEN 语句2;
…
【ELSE 语句n;】
END IF;
应用在BEGIN END中
二、循环结构(用在begin end中)
分类:
while、loop、repeat
循环控制(跳转语句):
iterate类似于continue
leave类似于break //用法:leave 标签;
1、WHILE
语法:
【标签:】WHILE 循环条件 DO
循环体;
END WHILE 【标签】; //标签也就是取名字
2、loop
【标签:】loop
循环体;
end loop【标签】;
可以用来模拟简单的死循环
3、repeat
语法:
【标签:】repeat
循环体;
until 结束循环的条件
end repeat【标签】;
若写出死循环可以使用以下办法:
显示所有线程
SHOW PROCESSLIST;
杀掉对应线程id KILL 线程id;
一个while的例子
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),’666′);
SET i=i+1;
END WHILE;END$