在MySQL数据库中使用PHP语句可以直接得到想要的结果
存储过程中定义局部变量: declare语句
declare 变量名 类型(长度) default 默认值;
#num1 num2值互换#
delimiter // CREATE PROCEDURE exchange ( INOUT num1 INT (5), INOUT num2 INT (5) ) BEGIN DECLARE tmp INT (5) DEFAULT 0 ; SET tmp = num1 ; SET num1 = num2 ; SET num2 = tmp ; END ;// SET @a = 100 ,@b = 200 ;// SELECT @a ,@b ;// CALL exchange (@a ,@b) ;// SELECT @a ,@b ;//
【if】 #根据学生编号和学生成绩判断学生成绩等级90分-A 80分-B 70分-C 60分-D 60分以下-E#
select 字段列表 into 变量列表 from 表 where 条件 将某条记录中的字段列表中的值存入到变量列表中,变量列表中的变量一定是提前定义的。
格式:
If 条件 then
执行代码
Else if 条件 then
执行代码
.....
Else
执行代码
End if;
delimiter // CREATE PROCEDURE marks_level_if ( IN stu_no INT (4), IN cla_no INT (4), OUT _level CHAR (4) ) BEGIN DECLARE _mark INT (4) DEFAULT 0 ; SELECT mark INTO _mark FROM marks WHERE sid = stu_no AND cid = cla_no ;
IF _mark >= 90 THEN SET _level = "A" ;
ELSEIF _mark >= 80 THEN SET _level = "B" ;
ELSEIF _mark >= 70 THEN SET _level = "C" ;
ELSEIF _mark >= 60 THEN SET _level = "D" ;
ELSE SET _level = "E" ;
ENDIF ; END ;// SET @result = "" ;// CALL marks_level_if (1, 1 ,@result) ;// SELECT @result ;//
【case】 #根据学生编号和学生成绩判断学生成绩等级90分-A 80分-B 70分-C 60分-D 60分以下-E#
CASE 变量
WHEN 值1 THEN 代码1
WHEN 值2 THEN 代码2 ...
ELSE 代码n
END CASE
Or:
CASE
WHEN 条件1 THEN 代码1
WHEN 条件2 THEN 代码2 ...
ELSE 代码n
END CASE;
delimiter // CREATE PROCEDURE marks_level_case ( IN stu_no INT (4), IN cla_no INT (4), OUT _level CHAR (4) ) BEGIN DECLARE _mark INT (4) DEFAULT 0 ; SELECT mark INTO _mark FROM marks WHERE sid = stu_no AND cid = cla_no ;
CASE
WHEN _mark >= 90 THEN SET _level = "A" ; WHEN _mark >= 80 THEN SET _level = "B" ; WHEN _mark >= 70 THEN SET _level = "C" ; WHEN _mark >= 60 THEN SET _level = "D" ; ELSE SET _level = "E" ; END CASE ; END ;// SET @result = "" ;// CALL marks_level_case (1, 2 ,@result) ;// SELECT @result ;//
【while】 #1-10累加的和#
while循环结构
格式:
while 条件 do
代码
end while;
delimiter // CREATE PROCEDURE marks_level_while (IN num INT(5), INOUT sum INT(5)) BEGIN WHILE num > 0 DO SET sum = sum + num ; SET num = num - 1 ; ENDWHILE ; END ;// SET @result = 0 ;// CALL marks_level_while (10 ,@result) ;// SELECT @result ;//
【repeat】 #1-10累加的和#
repeat
循环体
until 条件
end repeat;
delimiter // CREATE PROCEDURE marks_level_repeat (IN num INT(5), INOUT sum INT(5)) BEGIN REPEAT
SET sum = sum + num ; SET num = num - 1 ; UNTIL num = 0 END REPEAT; END ;// SET @result = 0 ;// CALL marks_level_repeat (10 ,@result) ;// SELECT @result ;//
【loop】 #1-10累加的和#
ITERATE 循环体名字: 继续循环
Leave 循环体名字: 退出循环
循环名字:Loop
if 条件 then
leave 循环体名字
else
iterate 循环体名字
end if;
if 条件 then
leave 循环体名字
else
iterate 循环体名字
end if;
end loop;
delimiter // CREATE PROCEDURE marks_level_loop (IN num INT(5), INOUT sum INT(5)) BEGIN lp : LOOP IF num > 0 THEN SET sum = sum + num ; END IF ; SET num = num - 1 ; IF num <= 0 THEN LEAVE lp ; ELSE ITERATE lp ; END IF ; END LOOP; END ;// SET @result = 0 ;// CALL marks_level_loop (10 ,@result) ;// SELECT @result ;//
【cursor】 #根据学生编号和学生成绩判断学生成绩等级 90分发500 80分发400 70分发300#
游标: mysql中用来存放查询结果记录的一种数据集合。
设置了错误句柄:
declare continue/exit handler for sqlsate '错误' set 语句
监视错误句柄的操作 设置监视句柄监视的错误码 执行了错误操作后,执行的语句
游标的定义:将查询结果存入游标中
declare 游标名 cursor for select语句。
打开游标
open 游标名
从游标中取出数据:变量列表要和游标中的查询字段数据和类型一一对应。
fetch 游标名 into 变量列表
获取数据时,如果游标中没有了数据,报出02000的错误,然后执行错误句柄。
关闭游标:
close 游标名
/* 存储过程游标控制结构 */ delimiter // CREATE PROCEDURE marks_level_cursor () BEGIN DECLARE stu_no INT (4) DEFAULT 0 ; DECLARE cla_mark INT (4) DEFAULT 0 ; DECLARE tag INT (4) DEFAULT 0 ; DECLARE moneys INT (4) DEFAULT 0 ; DECLARE cur CURSOR FOR SELECT s.sid, m.mark FROM students s LEFT JOIN marks m ON s.sid = m.sid ; DECLARE EXIT HANDLER FOR SQLSTATE "02000" SET tag = 1 ; OPEN cur ; WHILE ! tag DO FETCH cur INTO stu_no, cla_mark ; IF cla_mark >= 90 THEN SET moneys = 500 ;
ELSEIF cla_mark >= 80 THEN SET moneys = 400 ;
ELSEIF cla_mark >= 70 THEN SET moneys = 300 ;
ELSE SET moneys = 100 ; ENDIF ;
UPDATE students SET moneys = moneys WHERE sid = stu_no ; ENDWHILE ;
CLOSE cur ; END ;// CALL marks_level_cursor () ;// SELECT * FROM students ;//
触发器:可以自动执行的mysql程序逻辑,用户对表执行了某个操作后,系统自动调用的程序逻辑。
插入,删除,修改操作后,系统自动调用.
mysql中只支持单触发器:一个表的一个操作上只能有一个函数。
触发器和其他视图,存储过程不同,他只能依附在表机构中,没有独立的文件。
格式:
create trigger 触发器名()
before|after
insert|update|delete
on 表名
for each row 每一条记录都要调用触发器
begin
触发器代码。
end;
触发触发器时间:
before:操作之前
after:操作之后
触发行为: 就是在什么操作上创建触发器
insert
update
delete
insert table student("sex") value("men")
关键字:
old: 老数据
news: 新数据
插入: 只有新数据,没有老数据。 news.sex
修改:被修改的记录时老数据,即将替换的数据,是new数据
删除:只有老数据,没有新数据(老数据:即将删测那条记录)
【trigger】 #插入内容前修改插入内容 插入"南京"时 自动插入"NJ_南京"#
delimiter // CREATE TRIGGER insert_students_trigger BEFORE INSERT ON students FOR EACH ROW BEGIN IF new.addr = "山东" THEN SET new.addr = "SD_山东" ; ELSEIF new.addr = "上海" THEN SET new.addr = "SH_上海" ; ELSEIF new.addr = "南京" THEN SET new.addr = "NJ_南京" ; END IF ; END ;//
【trigger】 #删除学生信息时,把相关成绩删除#
delimiter // CREATE TRIGGER delect_students_trigger BEFORE DELETE ON marks FOR EACH ROW BEGIN DECLARE stu_no INT (4) DEFAULT 0 ; SELECT sid INTO stu_no FROM students WHERE sid = old.sid; IF stu_no THEN DELETE FROM marks WHERE sid = stu_no ; ENDIF; END ;//