流程控制
所謂流程控制, 無非就是 分支 和 迴圈
if else
假設有一個教師表, 有
id
,name
,sex
,salary
四個欄位(ID,姓名,性別,工資),
根據不同的工資, 分別顯示不同的身份
輸入id, 如果工資大於5000, 輸出
土豪
, 如果小於1500, 輸出low 逼
,
如果1500到5000之間, 輸出
馬馬虎虎
, 如果沒有, 則顯示''查無此人''
drop table if exists teacher;
CREATE TABLE `teacher` (
`id` int(11) NOT NULL auto_increment primary key,
`salary` int(11) NOT NULL,
`sex` tinyint(1) NOT NULL comment '1 for male, 2 for female',
`name` char(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `teacher`
(`id`, `salary`, `sex`, `name`)
VALUES
(1, 1500, 1, '教師1');
INSERT INTO `teacher`
(`id`, `salary`, `sex`, `name`)
VALUES
(2, 5500, 2, '教師2');
INSERT INTO `teacher`
(`id`, `salary`, `sex`, `name`)
VALUES
(3, 6500, 2, '教師3');
INSERT INTO `teacher`
(`id`, `salary`, `sex`, `name`)
VALUES
(4, 7500, 1, '教師4');
INSERT INTO `teacher`
(`id`, `salary`, `sex`, `name`)
VALUES
(5, 8500, 2, '教師5');
複製程式碼
sql語句如下
drop PROCEDURE if exists find_teacher;
create PROCEDURE find_teacher(in tid int,out type varchar(10)) begin
declare teacher_salary int;
select salary into teacher_salary from teacher where id = tid;
IF teacher_salary > 5000 THEN
set type = '土豪';
ELSEif teacher_salary <= 5000 and teacher_salary >= 1500 then
set type = '馬馬虎虎';
elseif teacher_salary < 1500 then
set type = 'low 逼';
elseif teacher_salary is null then
set type = '查無此人!!!';
END IF;
end;
call find_teacher(6,@type);
select @type;
複製程式碼
再舉一個例子
成績大於90, 學霸, 60到90之間, 繼續努力, 小於60, 學渣
drop PROCEDURE if exists 評分;
create procedure 評分(in 分數 int)begin
if
分數 >= 90 then select '學霸';
elseif 分數 >= 60 and 分數 < 90 then select '繼續加油';
else select '學渣';
end if;
end;
call 評分(97);
複製程式碼
再再舉一個例子
等公交, 車來了, 上車, 快來了, 繼續等, 其他情況, 走起
drop PROCEDURE if exists 等公交;
create procedure 等公交(in 狀態 char(10))begin
if
狀態 = '來了' then select '上公交';
elseif 狀態 = '快來了' then select '等公交';
else select '走起';
end if;
end;
call 等公交('快來了');
複製程式碼
case
同樣是分支結構, case既可以處理固定的值, 也可以處理範圍
原來我們是用
1
代表男性,2
代表女性, 現在我想在查詢的時候, 直接把1
轉換成男性, 把2
轉變成女性
原來的結果是這樣的...
下面開始寫sql語句
DROP PROCEDURE IF EXISTS select_teacher;
CREATE PROCEDURE select_teacher ( ) BEGIN
SELECT id, salary,
CASE sex
WHEN 1 THEN '男性'
WHEN 2 THEN '女性'
END AS 'sex',
name FROM teacher;
END;
CALL select_teacher ( );
複製程式碼
現在我們使用case, 再來改寫一下之前的if else...
DROP PROCEDURE IF EXISTS select_teacher;
CREATE PROCEDURE select_teacher() BEGIN
SELECT id, salary,
CASE sex
WHEN 1 THEN '男性'
WHEN 2 THEN '女性'
END AS 'sex',
CASE
WHEN salary > 5000 THEN '土豪'
WHEN salary >= 1500 AND salary <= 5000 THEN '馬馬虎虎'
WHEN salary < 1500 THEN 'low 逼'
END AS `type`
FROM teacher;
END;
CALL select_teacher();
複製程式碼
迴圈 loop, while, repeat
下面, 我們使用三種迴圈, 分別輸出10遍"我愛你"
loop
drop PROCEDURE if exists love;
create PROCEDURE love() begin
declare num int default 0;
myloop:loop
set num = num + 1;
if num > 10 then
leave myloop;
end if;
select num;
select '我愛你';
end loop;
end;
call love();
複製程式碼
while
drop PROCEDURE if exists love;
create PROCEDURE love() begin
declare num int default 0;
while num < 10 do
set num = num + 1;
select num;
select '我愛你';
end while;
end;
call love();
複製程式碼
repeat
drop PROCEDURE if exists love;
create PROCEDURE love() begin
declare num int default 0;
repeat
set num = num + 1;
select num;
select '我愛你';
until num > 9 end repeat;
end;
call love();
複製程式碼
女朋友不滿意, 還要你用三種迴圈輸出10遍我錯了
while do
drop procedure if exists 我錯了;
create procedure 我錯了() begin
declare 計數 int default 0;
while
計數< 10
do
select 計數;
select '我錯了...';
set 計數 = 計數 + 1;
end while;
end;
call 我錯了();
複製程式碼
loop
drop procedure if exists 我錯了;
create procedure 我錯了() begin
declare 計數 int default 0;
hello:loop
select 計數;
select '我錯了...';
set 計數 = 計數 + 1;
if 計數 >= 10 then leave hello;
end if;
end loop;
end;
call 我錯了();
複製程式碼
repeat until
drop procedure if exists 我錯了;
create procedure 我錯了() begin
declare 計數 int default 0;
repeat
select 計數;
select '我錯了...';
set 計數 = 計數 + 1;
until
計數 >= 10
end repeat;
end;
call 我錯了();
複製程式碼
iterate/leave
相當於 continue 和 break
僅適用於迴圈(loop
,repeat
,while
)
跳過和中斷
迴圈輸出1到11, 逢5過
drop PROCEDURE if exists test;
create PROCEDURE test() begin
declare x int default 0;
myloop:loop
set x = x + 1;
if x % 5 = 0 then ITERATE myloop; end if;
select x;
if x> 10 then leave myloop; end if;
end loop;
end;
call test();
複製程式碼
今天的小作業
使用
while
,repeat
,loop
三種方式, 計算從1加到100
提前告訴你, 結果是
5050
所謂從1加到100, 就是...
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 + 100
也可以試試從1加到1000...