在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 ;//
