在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

mysql8.0流程控制介紹

馬哥Linux運(yùn)維 ? 來(lái)源:51cto博客 ? 2024-01-13 10:36 ? 次閱讀

流程控制介紹

解決復(fù)雜問(wèn)題不可能通過(guò)一個(gè)SQL語(yǔ)句完成,我們需要執(zhí)行多個(gè)SQL操作。流程控制語(yǔ)句的作用就是控制存儲(chǔ)過(guò)程中SQL語(yǔ)句的執(zhí)行順序,是我們完成復(fù)雜操作必不可少的一部分。只要是執(zhí)行的程序,流程就分為三大類(lèi): 順序結(jié)構(gòu):程序從上往下依次執(zhí)行 分支結(jié)構(gòu):程序按條件進(jìn)行選擇執(zhí)行,從兩條或多條路徑中選擇一條執(zhí)行 循環(huán)結(jié)構(gòu):程序滿(mǎn)足一定條件下,重復(fù)執(zhí)行一組語(yǔ)句針對(duì)于MySQL的流程控制語(yǔ)句主要有3類(lèi)。注意:只能用于存儲(chǔ)程序。 條件判斷語(yǔ)句:IF語(yǔ)句和CASE語(yǔ)句 循環(huán)語(yǔ)句:LOOP、WHILE和REPEAT語(yǔ)句 跳轉(zhuǎn)語(yǔ)句:ITERATE和LEAVE語(yǔ)句

分支結(jié)構(gòu)之IF

IF語(yǔ)句的語(yǔ)法結(jié)構(gòu)是:
IF 表達(dá)式1 THEN 操作1
[ELSEIF 表達(dá)式2 THEN 操作2]……
[ELSE 操作N]
END IF
根據(jù)表達(dá)式的結(jié)果為T(mén)RUE或FALSE執(zhí)行相應(yīng)的語(yǔ)句。這里“[]”中的內(nèi)容是可選的。


特點(diǎn):①不同的表達(dá)式對(duì)應(yīng)不同的操作②使用在begin end中


舉例1:
DELIMITER //
CREATE PROCEDURE test_if()
BEGIN  
  #情況1:
  #聲明局部變量
  #declare stu_name varchar(15);
  #if stu_name is null 
  #  then select 'stu_name is null';
  #end if;
  #情況2:二選一
  #declare email varchar(25) default 'aaa';
  #if email is null
  #  then select 'email is null';
  #else
  #  select 'email is not null';
  #end if;
  #情況3:多選一
  DECLARE age INT DEFAULT 20;
  IF age > 40
    THEN SELECT '中老年';
  ELSEIF age > 18
    THEN SELECT '青壯年';
  ELSEIF age > 8
    THEN SELECT '青少年';
  ELSE
    SELECT '嬰幼兒';
  END IF;
END //
DELIMITER ;


舉例2:聲明存儲(chǔ)過(guò)程“update_salary_by_eid1”,定義IN參數(shù)emp_id,輸入員工編號(hào)。判斷該員工薪資如果低于8000元并且入職時(shí)間超過(guò)5年,就漲薪500元;否則就不變。
DELIMITER //


CREATE PROCEDURE update_salary_by_eid1(IN emp_id INT)
BEGIN
  #聲明局部變量
  DECLARE emp_sal DOUBLE; #記錄員工的工資
  DECLARE hire_year DOUBLE; #記錄員工入職公司的年頭
  #賦值
  SELECT salary INTO emp_sal FROM employees WHERE employee_id = emp_id;
  SELECT DATEDIFF(CURDATE(),hire_date)/365 INTO hire_year FROM employees WHERE employee_id = emp_id;
  #判斷
  IF emp_sal < 8000 AND hire_year >= 5
    THEN UPDATE employees SET salary = salary + 500 WHERE employee_id = emp_id;
  END IF;
END //
DELIMITER ;
#調(diào)用存儲(chǔ)過(guò)程
CALL update_salary_by_eid1(104);


SELECT DATEDIFF(CURDATE(),hire_date)/365, employee_id,salary
FROM employees
WHERE salary < 8000 AND DATEDIFF(CURDATE(),hire_date)/365 >= 5;


DROP PROCEDURE update_salary_by_eid1;


舉例3:聲明存儲(chǔ)過(guò)程“update_salary_by_eid2”,定義IN參數(shù)emp_id,輸入員工編號(hào)。判斷該員工薪資如果低于9000元并且入職時(shí)間超過(guò)5年,就漲薪500元;否則就漲薪100元。
DELIMITER //
CREATE PROCEDURE update_salary_by_eid2(IN emp_id INT)
BEGIN
  #聲明局部變量
  DECLARE emp_sal DOUBLE; #記錄員工的工資
  DECLARE hire_year DOUBLE; #記錄員工入職公司的年頭
  #賦值
  SELECT salary INTO emp_sal FROM employees WHERE employee_id = emp_id;
  SELECT DATEDIFF(CURDATE(),hire_date)/365 INTO hire_year FROM employees WHERE employee_id = emp_id;
  #判斷
  IF emp_sal < 9000 AND hire_year >= 5
    THEN UPDATE employees SET salary = salary + 500 WHERE employee_id = emp_id;
  ELSE
    UPDATE employees SET salary = salary + 100 WHERE employee_id = emp_id;
  END IF;
END //
DELIMITER ;


#調(diào)用
CALL update_salary_by_eid2(103);
CALL update_salary_by_eid2(104);


SELECT * FROM employees WHERE employee_id IN (103,104);


#舉例4:聲明存儲(chǔ)過(guò)程“update_salary_by_eid3”,定義IN參數(shù)emp_id,輸入員工編號(hào)。
#判斷該員工薪資如果低于9000元,就更新薪資為9000元;薪資如果大于等于9000元且
#低于10000的,但是獎(jiǎng)金比例為NULL的,就更新獎(jiǎng)金比例為0.01;其他的漲薪100元。
DELIMITER //
CREATE PROCEDURE update_salary_by_eid3(IN emp_id INT)
BEGIN
  #聲明變量
  DECLARE emp_sal DOUBLE; #記錄員工工資
  DECLARE bonus DOUBLE; #記錄員工的獎(jiǎng)金率
  #賦值
  SELECT salary INTO emp_sal FROM employees WHERE employee_id = emp_id;
  SELECT commission_pct INTO bonus FROM employees WHERE employee_id = emp_id;
  #判斷
  IF emp_sal < 9000 
    THEN UPDATE employees SET salary = 9000 WHERE employee_id = emp_id;
  ELSEIF emp_sal < 10000 AND bonus IS NULL
    THEN UPDATE employees SET commission_pct = 0.01 WHERE employee_id = emp_id;
  ELSE 
    UPDATE employees SET salary = salary + 100 WHERE employee_id = emp_id;
  END IF;
END //
DELIMITER ;

分支結(jié)構(gòu)之CASE

CASE語(yǔ)句的語(yǔ)法結(jié)構(gòu)1:
#情況一:類(lèi)似于switch
CASE表達(dá)式
WHEN 值1 THEN 結(jié)果1或語(yǔ)句1(如果是語(yǔ)句,需要加分號(hào))
WHEN 值2 THEN 結(jié)果2或語(yǔ)句2(如果是語(yǔ)句,需要加分號(hào))
...
ELSE 結(jié)果n或語(yǔ)句n(如果是語(yǔ)句,需要加分號(hào))
END [case](如果是放在beginend中需要加上case,如果放在select后面不需要)


CASE語(yǔ)句的語(yǔ)法結(jié)構(gòu)2:
#情況二:類(lèi)似于多重if
CASE
WHEN 條件1 THEN 結(jié)果1或語(yǔ)句1(如果是語(yǔ)句,需要加分號(hào))
WHEN 條件2 THEN 結(jié)果2或語(yǔ)句2(如果是語(yǔ)句,需要加分號(hào))
...
ELSE 結(jié)果n或語(yǔ)句n(如果是語(yǔ)句,需要加分號(hào))
END [case](如果是放在beginend中需要加上case,如果放在select后面不需要)


#舉例1:基本使用
DELIMITER //
CREATE PROCEDURE test_case()
BEGIN
  #演示1:case ... when ...then ...
  /*
  declare var int default 2;
  case var
    when 1 then select 'var = 1';
    when 2 then select 'var = 2';
    when 3 then select 'var = 3';
    else select 'other value';
  end case;
  */
  #演示2:case when ... then ....
  DECLARE var1 INT DEFAULT 10;
  CASE 
  WHEN var1 >= 100 THEN SELECT '三位數(shù)';
  WHEN var1 >= 10 THEN SELECT '兩位數(shù)';
  ELSE SELECT '個(gè)數(shù)位';
  END CASE;
END //
DELIMITER ;


#舉例2:聲明存儲(chǔ)過(guò)程“update_salary_by_eid4”,定義IN參數(shù)emp_id,輸入員工編號(hào)。
#判斷該員工薪資如果低于9000元,就更新薪資為9000元;薪資大于等于9000元且低于10000的,
#但是獎(jiǎng)金比例為NULL的,就更新獎(jiǎng)金比例為0.01;其他的漲薪100元。
DELIMITER //
CREATE PROCEDURE update_salary_by_eid4(IN emp_id INT)
BEGIN
  #局部變量的聲明
  DECLARE emp_sal DOUBLE; #記錄員工的工資
  DECLARE bonus DOUBLE; #記錄員工的獎(jiǎng)金率
  #局部變量的賦值
  SELECT salary INTO emp_sal FROM employees WHERE employee_id = emp_id;
  SELECT commission_pct INTO bonus FROM employees WHERE employee_id = emp_id;
  CASE
  WHEN emp_sal < 9000 THEN UPDATE employees SET salary = 9000 WHERE employee_id = emp_id;
  WHEN emp_sal < 10000 AND bonus IS NULL THEN UPDATE employees SET commission_pct = 0.01 
                WHERE employee_id = emp_id;
  ELSE UPDATE employees SET salary = salary + 100 WHERE employee_id = emp_id;
  END CASE;
END //
DELIMITER ;


#舉例3:聲明存儲(chǔ)過(guò)程update_salary_by_eid5,定義IN參數(shù)emp_id,輸入員工編號(hào)。
#判斷該員工的入職年限,如果是0年,薪資漲50;如果是1年,薪資漲100;
#如果是2年,薪資漲200;如果是3年,薪資漲300;如果是4年,薪資漲400;其他的漲薪500。
DELIMITER //
CREATE PROCEDURE update_salary_by_eid5(IN emp_id INT)
BEGIN
  #聲明局部變量
  DECLARE hire_year INT; #記錄員工入職公司的總時(shí)間(單位:年)
  #賦值
  SELECT ROUND(DATEDIFF(CURDATE(),hire_date) / 365) INTO hire_year 
  FROM employees WHERE employee_id = emp_id;
  #判斷
  CASE hire_year
    WHEN 0 THEN UPDATE employees SET salary = salary + 50 WHERE employee_id = emp_id;
    WHEN 1 THEN UPDATE employees SET salary = salary + 100 WHERE employee_id = emp_id;
    WHEN 2 THEN UPDATE employees SET salary = salary + 200 WHERE employee_id = emp_id;
    WHEN 3 THEN UPDATE employees SET salary = salary + 300 WHERE employee_id = emp_id;
    WHEN 4 THEN UPDATE employees SET salary = salary + 400 WHERE employee_id = emp_id;
    ELSE UPDATE employees SET salary = salary + 500 WHERE employee_id = emp_id;
  END CASE;
END //
DELIMITER ;

循環(huán)結(jié)構(gòu)之LOOP

LOOP循環(huán)語(yǔ)句用來(lái)重復(fù)執(zhí)行某些語(yǔ)句。LOOP內(nèi)的語(yǔ)句一直重復(fù)執(zhí)行直到循環(huán)被退出(使用LEAVE子句),跳出循環(huán)過(guò)程。
LOOP語(yǔ)句的基本格式如下:
[loop_label:]LOOP
循環(huán)執(zhí)行的語(yǔ)句
END LOOP [loop_label]
其中,loop_label表示LOOP語(yǔ)句的標(biāo)注名稱(chēng),該參數(shù)可以省略。


#舉例1:
DELIMITER //
CREATE PROCEDURE test_loop()
BEGIN
  #聲明局部變量
  DECLARE num INT DEFAULT 1;
  loop_label:LOOP
    #重新賦值
    SET num = num + 1;
    #可以考慮某個(gè)代碼程序反復(fù)執(zhí)行。(略)
    IF num >= 10 THEN LEAVE loop_label;
    END IF;
  END LOOP loop_label;
  #查看num
  SELECT num;
END //
DELIMITER ;


#舉例2:當(dāng)市場(chǎng)環(huán)境變好時(shí),公司為了獎(jiǎng)勵(lì)大家,決定給大家漲工資。
#聲明存儲(chǔ)過(guò)程“update_salary_loop()”,聲明OUT參數(shù)num,輸出循環(huán)次數(shù)。
#存儲(chǔ)過(guò)程中實(shí)現(xiàn)循環(huán)給大家漲薪,薪資漲為原來(lái)的1.1倍。直到全公司的平
#均薪資達(dá)到12000結(jié)束。并統(tǒng)計(jì)循環(huán)次數(shù)。
DELIMITER //
CREATE PROCEDURE update_salary_loop(OUT num INT)
BEGIN
  #聲明變量
  DECLARE avg_sal DOUBLE ; #記錄員工的平均工資
  DECLARE loop_count INT DEFAULT 0;#記錄循環(huán)的次數(shù)
  #① 初始化條件
  #獲取員工的平均工資
  SELECT AVG(salary) INTO avg_sal FROM employees;
  loop_lab:LOOP
    #② 循環(huán)條件
    #結(jié)束循環(huán)的條件
    IF avg_sal >= 12000
      THEN LEAVE loop_lab;
    END IF;
    #③ 循環(huán)體
    #如果低于12000,更新員工的工資
    UPDATE employees SET salary = salary * 1.1;
    #④ 迭代條件
    #更新avg_sal變量的值
    SELECT AVG(salary) INTO avg_sal FROM employees;
    #記錄循環(huán)次數(shù)
    SET loop_count = loop_count + 1;
  END LOOP loop_lab;
  #給num賦值
  SET num = loop_count;  
END //
DELIMITER ;


SELECT AVG(salary) FROM employees;
CALL update_salary_loop(@num);
SELECT @num;

循環(huán)結(jié)構(gòu)之WHILE

WHILE語(yǔ)句創(chuàng)建一個(gè)帶條件判斷的循環(huán)過(guò)程。WHILE在執(zhí)行語(yǔ)句執(zhí)行時(shí),先對(duì)指定的表達(dá)式進(jìn)行判斷,如果為真,就執(zhí)行循環(huán)內(nèi)的語(yǔ)句,否則退出循環(huán)。
WHILE語(yǔ)句的基本格式如下:
[while_label:] WHILE 循環(huán)條件  DO
  循環(huán)體
END WHILE [while_label];
while_label為WHILE語(yǔ)句的標(biāo)注名稱(chēng);如果循環(huán)條件結(jié)果為真,WHILE語(yǔ)句內(nèi)的語(yǔ)句或語(yǔ)句群被執(zhí)行,直至循環(huán)條件為假,退出循環(huán)。


#舉例1:
DELIMITER //
CREATE PROCEDURE test_while()
BEGIN  
  #初始化條件
  DECLARE num INT DEFAULT 1;
  #循環(huán)條件
  WHILE num <= 10 DO
    #循環(huán)體(略)  
    #迭代條件
    SET num = num + 1;
  END WHILE;
  #查詢(xún)
  SELECT num;
END //
DELIMITER ;


#調(diào)用
CALL test_while();


#舉例2:市場(chǎng)環(huán)境不好時(shí),公司為了渡過(guò)難關(guān),決定暫時(shí)降低大家的薪資。
#聲明存儲(chǔ)過(guò)程“update_salary_while()”,聲明OUT參數(shù)num,輸出循環(huán)次數(shù)。
#存儲(chǔ)過(guò)程中實(shí)現(xiàn)循環(huán)給大家降薪,薪資降為原來(lái)的90%。直到全公司的平均薪資
#達(dá)到5000結(jié)束。并統(tǒng)計(jì)循環(huán)次數(shù)。
DELIMITER //
CREATE PROCEDURE update_salary_while(OUT num INT)
BEGIN
  #聲明變量
  DECLARE avg_sal DOUBLE ; #記錄平均工資
  DECLARE while_count INT DEFAULT 0; #記錄循環(huán)次數(shù)
  #賦值
  SELECT AVG(salary) INTO avg_sal FROM employees;
  WHILE avg_sal > 5000 DO
    UPDATE employees SET salary = salary * 0.9 ;
    SET while_count = while_count + 1;
    SELECT AVG(salary) INTO avg_sal FROM employees;
  END WHILE;
  #給num賦值
  SET num = while_count;    
END //
DELIMITER ;


#調(diào)用
CALL update_salary_while(@num);
SELECT @num;
SELECT AVG(salary) FROM employees;

循環(huán)結(jié)構(gòu)之REPEAT

REPEAT語(yǔ)句創(chuàng)建一個(gè)帶條件判斷的循環(huán)過(guò)程。與WHILE循環(huán)不同的是,REPEAT循環(huán)首先會(huì)執(zhí)行一次循環(huán),然后在UNTIL中進(jìn)行表達(dá)式的判斷
如果滿(mǎn)足條件就退出,即ENDREPEAT;如果條件不滿(mǎn)足,則會(huì)就繼續(xù)執(zhí)行循環(huán),直到滿(mǎn)足退出條件為止。
REPEAT語(yǔ)句的基本格式如下:
[repeat_label:] REPEAT
循環(huán)體的語(yǔ)句
UNTIL 結(jié)束循環(huán)的條件表達(dá)式
END REPEAT [repeat_label]
repeat_label為REPEAT語(yǔ)句的標(biāo)注名稱(chēng),該參數(shù)可以省略;REPEAT語(yǔ)句內(nèi)的語(yǔ)句或語(yǔ)句群被重復(fù),直至expr_condition為真。


#舉例1:
DELIMITER //
CREATE PROCEDURE test_repeat()
BEGIN
  #聲明變量
  DECLARE num INT DEFAULT 1;
  REPEAT
    SET num = num + 1;
    UNTIL num >= 10
  END REPEAT;
  #查看
  SELECT num;
END //
DELIMITER ;


#調(diào)用
CALL test_repeat();


#舉例2:當(dāng)市場(chǎng)環(huán)境變好時(shí),公司為了獎(jiǎng)勵(lì)大家,決定給大家漲工資。
#聲明存儲(chǔ)過(guò)程“update_salary_repeat()”,聲明OUT參數(shù)num,輸出循環(huán)次數(shù)。
#存儲(chǔ)過(guò)程中實(shí)現(xiàn)循環(huán)給大家漲薪,薪資漲為原來(lái)的1.15倍。直到全公司的平均
#薪資達(dá)到13000結(jié)束。并統(tǒng)計(jì)循環(huán)次數(shù)。
DELIMITER //
CREATE PROCEDURE update_salary_repeat(OUT num INT)
BEGIN
  #聲明變量
  DECLARE avg_sal DOUBLE ; #記錄平均工資
  DECLARE repeat_count INT DEFAULT 0; #記錄循環(huán)次數(shù)
  #賦值
  SELECT AVG(salary) INTO avg_sal FROM employees;
  REPEAT
    UPDATE employees SET salary = salary * 1.15;
    SET repeat_count = repeat_count + 1;
    SELECT AVG(salary) INTO avg_sal FROM employees;
    UNTIL avg_sal >= 13000
  END REPEAT;
  #給num賦值
  SET num = repeat_count;  
END //
DELIMITER ;


#調(diào)用
CALL update_salary_repeat(@num);
SELECT @num;
SELECT AVG(salary) FROM employees;

對(duì)比三種循環(huán)結(jié)構(gòu)

1、這三種循環(huán)都可以省略名稱(chēng),但如果循環(huán)中添加了循環(huán)控制語(yǔ)句(LEAVE或ITERATE)則必須添加名稱(chēng)。2、LOOP:一般用于實(shí)現(xiàn)簡(jiǎn)單的"死"循環(huán) WHILE:先判斷后執(zhí)行 REPEAT:先執(zhí)行后判斷,無(wú)條件至少執(zhí)行一次

跳轉(zhuǎn)語(yǔ)句之LEAVE

LEAVE語(yǔ)句:可以用在循環(huán)語(yǔ)句內(nèi),或者以BEGINEND包裹起來(lái)的程序體內(nèi),表示跳出循環(huán)或者跳出程序體的操作。
如果你有面向過(guò)程的編程語(yǔ)言的使用經(jīng)驗(yàn),你可以把LEAVE理解為break。
基本格式如下:
LEAVE 標(biāo)記名
其中,label參數(shù)表示循環(huán)的標(biāo)志。LEAVE和BEGIN...END或循環(huán)一起被使用。


舉例1:創(chuàng)建存儲(chǔ)過(guò)程“l(fā)eave_begin()”,聲明INT類(lèi)型的IN參數(shù)num。給BEGIN...END加標(biāo)記名,并在BEGIN...END中使用IF語(yǔ)句判斷num參數(shù)的值。
    如果num<=0,則使用LEAVE語(yǔ)句退出BEGIN...END;
    如果num=1,則查詢(xún)“employees”表的平均薪資;
    如果num=2,則查詢(xún)“employees”表的最低薪資;
    如果num>2,則查詢(xún)“employees”表的最高薪資。
IF語(yǔ)句結(jié)束后查詢(xún)“employees”表的總?cè)藬?shù)。
DELIMITER //
CREATE PROCEDURE leave_begin(IN num INT)
begin_label:BEGIN
  IF num <= 0
    THEN LEAVE begin_label;
  ELSEIF num = 1
    THEN SELECT AVG(salary) FROM employees;
  ELSEIF num = 2
    THEN SELECT MIN(salary) FROM employees;
  ELSE 
    SELECT MAX(salary) FROM employees;
  END IF;
  #查詢(xún)總?cè)藬?shù)
  SELECT COUNT(*) FROM employees;
END //
DELIMITER ;


#調(diào)用
CALL leave_begin(1);


#舉例2:當(dāng)市場(chǎng)環(huán)境不好時(shí),公司為了渡過(guò)難關(guān),決定暫時(shí)降低大家的薪資。
#聲明存儲(chǔ)過(guò)程“l(fā)eave_while()”,聲明OUT參數(shù)num,輸出循環(huán)次數(shù),存儲(chǔ)過(guò)程中使用WHILE
#循環(huán)給大家降低薪資為原來(lái)薪資的90%,直到全公司的平均薪資小于等于10000,并統(tǒng)計(jì)循環(huán)次數(shù)。
DELIMITER //
CREATE PROCEDURE leave_while(OUT num INT)
BEGIN 
  DECLARE avg_sal DOUBLE;#記錄平均工資
  DECLARE while_count INT DEFAULT 0; #記錄循環(huán)次數(shù)
  SELECT AVG(salary) INTO avg_sal FROM employees; #① 初始化條件
  while_label:WHILE TRUE DO  #② 循環(huán)條件
    #③ 循環(huán)體
    IF avg_sal <= 10000 THEN
      LEAVE while_label;
    END IF;
    UPDATE employees SET salary  = salary * 0.9;
    SET while_count = while_count + 1;
    #④ 迭代條件
    SELECT AVG(salary) INTO avg_sal FROM employees;
  END WHILE;
  #賦值
  SET num = while_count;
END //
DELIMITER ;


#調(diào)用
CALL leave_while(@num);
SELECT @num;


SELECT AVG(salary) FROM employees;

跳轉(zhuǎn)語(yǔ)句之ITERATE

ITERATE語(yǔ)句:只能用在循環(huán)語(yǔ)句(LOOP、REPEAT和WHILE語(yǔ)句)內(nèi),表示重新開(kāi)始循環(huán),將執(zhí)行順序轉(zhuǎn)到語(yǔ)句段開(kāi)頭處。
如果你有面向過(guò)程的編程語(yǔ)言的使用經(jīng)驗(yàn),你可以把ITERATE理解為continue,意思為“再次循環(huán)”。
語(yǔ)句基本格式如下:
ITERATE label
label參數(shù)表示循環(huán)的標(biāo)志。ITERATE語(yǔ)句必須跟在循環(huán)標(biāo)志前面。


舉例:定義局部變量num,初始值為0。循環(huán)結(jié)構(gòu)中執(zhí)行num+1操作。
    如果num<10,則繼續(xù)執(zhí)行循環(huán);
    如果num>15,則退出循環(huán)結(jié)構(gòu);
DELIMITER //
CREATE PROCEDURE test_iterate()
BEGIN
  DECLARE num INT DEFAULT 0;
  loop_label:LOOP
    #賦值
    SET num = num + 1;
    IF num  < 10
      THEN ITERATE loop_label;
    ELSEIF num > 15
      THEN LEAVE loop_label;
    END IF;
    SELECT '尚硅谷:讓天下沒(méi)有難學(xué)的技術(shù)';
  END LOOP;
END //
DELIMITER ;


CALL test_iterate();
SELECT * FROM employees;

練習(xí)

#1. 創(chuàng)建函數(shù)test_if_case(),實(shí)現(xiàn)傳入成績(jī),如果成績(jī)>90,返回A,如果成績(jī)>80,返回B,如果成績(jī)>60,返回C,否則返回D
#要求:分別使用if結(jié)構(gòu)和case結(jié)構(gòu)實(shí)現(xiàn)
#方式1:
DELIMITER //
CREATE FUNCTION test_if_case1(score DOUBLE)
RETURNS CHAR
BEGIN
    DECLARE ch CHAR;
    IF score>90
        THEN SET ch='A';
    ELSEIF score>80
        THEN SET ch='B';
    ELSEIF score>60
        THEN SET ch='C';
    ELSE SET ch='D';
    END IF;
    RETURN ch;
END //
DELIMITER ;


#調(diào)用
SELECT test_if_case1(87);


#方式2:
DELIMITER //
CREATE FUNCTION test_if_case2(score DOUBLE)
RETURNS CHAR
BEGIN
    DECLARE ch CHAR;
    CASE
    WHEN score>90 THEN SET ch='A';
    WHEN score>80 THEN SET ch='B';
    WHEN score>60 THEN SET ch='C';
    ELSE SET ch='D';
    END CASE;
    RETURN ch;
END //
DELIMITER ;


#調(diào)用
SELECT test_if_case2(67);


#2. 創(chuàng)建存儲(chǔ)過(guò)程test_if_pro(),傳入工資值,如果工資值<3000,則刪除工資為此值的員工,如果3000 <= 工資值 <= 5000,則修改此工資值的員工薪資漲1000,否則漲工資500
DELIMITER //
CREATE PROCEDURE test_if_pro(IN sal DOUBLE)
BEGIN
    IF sal<3000
        THEN DELETE FROM employees WHERE salary = sal;
    ELSEIF sal <= 5000
        THEN UPDATE employees SET salary = salary+1000 WHERE salary = sal;
    ELSE
        UPDATE employees SET salary = salary+500 WHERE salary = sal;
    END IF;
END //
DELIMITER ;


SELECT * FROM employees;


#調(diào)用
CALL test_if_pro(3100);


#3. 創(chuàng)建存儲(chǔ)過(guò)程insert_data(),傳入?yún)?shù)為 IN 的 INT 類(lèi)型變量 insert_count,實(shí)現(xiàn)向admin表中批量插
入insert_count條記錄
DELIMITER //
CREATE PROCEDURE insert_data(IN insert_count INT)
BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE i <= insert_count DO
        INSERT INTO admin(user_name,user_pwd) VALUES(CONCAT('Rose-',i),ROUND(RAND() * 100000));
        SET i=i+1;
    END WHILE;
END //
DELIMITER ;
#調(diào)用
CALL insert_data(100);


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 控制
    +關(guān)注

    關(guān)注

    4

    文章

    1011

    瀏覽量

    122666
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    809

    瀏覽量

    26569
  • IF
    IF
    +關(guān)注

    關(guān)注

    1

    文章

    50

    瀏覽量

    26874

原文標(biāo)題:mysql8.0流程控制一文拿捏

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    大數(shù)據(jù)MySQL8.0-117-MySQL的存儲(chǔ)過(guò)程-流程控制-循環(huán)語(yǔ)句-介紹

    MySQL大數(shù)據(jù)
    電子學(xué)習(xí)
    發(fā)布于 :2023年01月06日 11:24:53

    大數(shù)據(jù)MySQL8.0-119-MySQL的存儲(chǔ)過(guò)程-流程控制-循環(huán)語(yǔ)句-rep

    MySQL大數(shù)據(jù)
    電子學(xué)習(xí)
    發(fā)布于 :2023年01月06日 11:29:59

    MySQL8.0 新特性:Partial Update of LOB Column

    摘要: MySQL8.0對(duì)json進(jìn)行了比較完善的支持, 我們知道json具有比較特殊的存儲(chǔ)格式,通常存在多個(gè)key value鍵值對(duì),對(duì)于類(lèi)似更新操作通常不會(huì)更新整個(gè)json列,而是某些鍵值
    發(fā)表于 06-11 20:23

    流程控制判斷

    #hello,JS:02流程控制判斷
    發(fā)表于 05-18 12:37

    Python中的流程控制

    流程控制無(wú)非就是if else之類(lèi)的控制語(yǔ)句,今天我們來(lái)看一下Python中的流程控制會(huì)有什么不太一樣的地方。
    發(fā)表于 06-28 08:54

    mysql8.0中的無(wú)鎖重做日志源碼介紹

    的性能, 所以在InnoDB 8.0 改成了無(wú)鎖實(shí)現(xiàn)這個(gè)是官方的介紹:https://mysqlserverteam.com/mysql-8-0-new-lock-free-scalable-wal-design
    的頭像 發(fā)表于 02-17 10:52 ?2875次閱讀
    <b class='flag-5'>mysql8.0</b>中的無(wú)鎖重做日志源碼<b class='flag-5'>介紹</b>

    python運(yùn)算與流程控制循環(huán)代碼資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是python運(yùn)算與流程控制循環(huán)代碼資料免費(fèi)下載。
    發(fā)表于 03-16 08:00 ?0次下載

    騰訊云打造MySQL 8.0全新引擎,進(jìn)一步加速客戶(hù)產(chǎn)業(yè)升級(jí)

    據(jù)介紹,騰訊云數(shù)據(jù)庫(kù) MySQL 8.0的內(nèi)核可以百分百完全兼容主流MySQL分支。相比官方版本,無(wú)論是單機(jī)模式、異步模式還是同步模式下, MySQ
    的頭像 發(fā)表于 07-09 14:54 ?2358次閱讀

    MySQL 5.7與MySQL 8.0 性能對(duì)比

    背景 測(cè)試mysql5.7和mysql8.0分別在讀寫(xiě),選定,只寫(xiě)模式下不同并發(fā)時(shí)的性能(tps,qps) 最早 測(cè)試使用版本為mysql5.7.22和mysql8.0.15 sysb
    的頭像 發(fā)表于 11-03 09:26 ?1.7w次閱讀
    <b class='flag-5'>MySQL</b> 5.7與<b class='flag-5'>MySQL</b> <b class='flag-5'>8.0</b> 性能對(duì)比

    MySql環(huán)境一鍵安裝應(yīng)用程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是MySql環(huán)境一鍵安裝應(yīng)用程序免費(fèi)下載。創(chuàng)建Mysql所需環(huán)境支持8.0以上版本,暫無(wú)測(cè)試過(guò)8.0以下版本
    發(fā)表于 02-26 15:01 ?7次下載

    關(guān)于MySQL8.0版本選型的小技巧

    MySQL 8.0 第一個(gè)GA(General Availability)版本(正式、可用于生產(chǎn)的版本)于2018/4/19發(fā)布至今已有3年。8.0是一個(gè)全新的版本,增加了數(shù)百項(xiàng)功能新特性,重構(gòu)了
    的頭像 發(fā)表于 03-29 13:45 ?1135次閱讀
    關(guān)于<b class='flag-5'>MySQL8.0</b>版本選型的小技巧

    請(qǐng)問(wèn)mysql8.0不能在grant時(shí)創(chuàng)建用戶(hù)是什么原因?

    用習(xí)慣了MySQL5.7,當(dāng)在MySQL8.0里創(chuàng)建用戶(hù)時(shí),習(xí)慣性直接敲GRANT指令,結(jié)果報(bào)錯(cuò)了
    的頭像 發(fā)表于 08-11 10:16 ?2222次閱讀

    mysql8.0默認(rèn)字符集是什么

    MySQL 8.0 默認(rèn)字符集是 utf8mb4。 MySQL 8.0 是當(dāng)前最新的開(kāi)源關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由Oracle公司開(kāi)發(fā)和維護(hù)。MySQ
    的頭像 發(fā)表于 11-16 14:48 ?1818次閱讀

    GitHub底層數(shù)據(jù)庫(kù)無(wú)縫升級(jí)到MySQL 8.0的經(jīng)驗(yàn)

    GitHub 團(tuán)隊(duì)近日分享了他們將 GitHub.com 的底層數(shù)據(jù)庫(kù)無(wú)縫升級(jí)到 MySQL 8.0 的經(jīng)驗(yàn)。 據(jù)介紹,GitHub 使用 MySQL 來(lái)存儲(chǔ)大量關(guān)系數(shù)據(jù),因此在不影響
    的頭像 發(fā)表于 12-13 10:21 ?514次閱讀
    GitHub底層數(shù)據(jù)庫(kù)無(wú)縫升級(jí)到<b class='flag-5'>MySQL</b> <b class='flag-5'>8.0</b>的經(jīng)驗(yàn)
    主站蜘蛛池模板: 亚洲精品在线不卡| 四虎在线观看免费永久| 色男人在线| 成年女人毛片免费视频| 久久久久久久久女黄| 欧美三四级片| 欧美性一区二区三区五区| 亚洲第一永久在线观看| aaa在线观看视频高清视频| 永久免费的拍拍拍网站| 久久本道综合色狠狠五月| 色综合天天五月色| 免费的色视频| 久久青草国产免费观看| 久色乳综合思思在线视频| 91x视频| 狠狠狠色丁香婷婷综合久久五月 | 永久免费在线视频| 欧美另类v| 日本理论在线| 天天干视频在线| 妇女交性大片| 国产一级特黄的片子| 2021国产成人午夜精品| 色站视频| 天天爽夜夜爽精品视频一| 狠狠乱| 国产免费久久精品| semm亚洲欧美在线高清| 奇米影色777四色在线首页| 日日夜夜狠狠干| 亚洲天堂不卡| 中文在线天堂网www| 69日本xxxxxxxxx29| 免费两性的视频网站| 国产精品夜夜春夜夜| 色婷丁香| 久久久久九九精品影院| 四虎最新在线| 青青热久久国产久精品秒播| 亚欧成人乱码一区二区|