[MySQL光速入門]018 流程控制

貓哥的技術部落格發表於2019-04-18

流程控制

所謂流程控制, 無非就是 分支迴圈

流程控制.png

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;
複製程式碼

image.png

再舉一個例子

成績大於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);
複製程式碼

image.png

再再舉一個例子

等公交, 車來了, 上車, 快來了, 繼續等, 其他情況, 走起

drop PROCEDURE if exists 等公交;
create procedure 等公交(in 狀態 char(10))begin 
    if 
        狀態 = '來了' then select '上公交';
        elseif 狀態 = '快來了' then select '等公交';
        else select '走起';
    end if;
end;
call 等公交('快來了');
複製程式碼

image.png

case

同樣是分支結構, case既可以處理固定的值, 也可以處理範圍

原來我們是用1代表男性, 2 代表女性, 現在我想在查詢的時候, 直接把1轉換成男性, 把2轉變成女性

原來的結果是這樣的...

image.png

下面開始寫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 ( );
複製程式碼

image.png

現在我們使用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();
複製程式碼

image.png

迴圈 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();
複製程式碼

image.png

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();
複製程式碼

image.png

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();
複製程式碼

image.png

女朋友不滿意, 還要你用三種迴圈輸出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

相當於 continuebreak

僅適用於迴圈(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();
複製程式碼

image.png

今天的小作業

使用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...

快速跳轉

相關文章