在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 ;//
#根据学生编号和学生成绩判断学生成绩等级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 ;//
#根据学生编号和学生成绩判断学生成绩等级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 ;//
#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 ;//
#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 ;//
#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 ;//
#根据学生编号和学生成绩判断学生成绩等级 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数据
删除:只有老数据,没有新数据(老数据:即将删测那条记录)
#插入内容前修改插入内容 插入"南京"时 自动插入"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 ;//
#删除学生信息时,把相关成绩删除#
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 ;//