搜尋
首頁資料庫mysql教程MySQL學習之聊聊流程控制與遊標
MySQL學習之聊聊流程控制與遊標Feb 23, 2022 pm 08:07 PM
mysql流程控制遊標

這篇文章進行MySQL的學習,聊聊MySQL中的流程控制和遊標,希望對大家有幫助。

MySQL學習之聊聊流程控制與遊標

學習或了解程式語言的都知道,任何程式語言都不可能只透過一兩句語句程式碼完成。

流程控制語句的作用就是在程式運作過程中控制語句的執行順序,是我們完成複雜操作不可或缺的一部分。

只要是執行的程序,流程就分為三大類:

  • #順序結構:程式從上往下依序執行
  • #分支結構:程式依條件進行選擇執行,從兩條或多條路徑中選擇一條執行
  • #循環結構:程式滿足某一條件下,重複執行一組語句

針對於MySQL 的流程控制語句主要有3 個類別。注意:只能用於儲存程式。

  • 條件判斷語句:IF 語句與CASE 語句
  • 循環語句:LOOP、WHILE 與REPEAT 語句
  • 跳轉語句:ITERATE 和LEAVE 語句

#準備工作:

建立資料庫以及兩張表,並插入資料:

create database dbtest16;
use dbtest16;

create table employees 
as 
select * from atguigudb.employees;
create table departments
as
select * from atguigudb.departments;

select * from employees;
select * from departments;

MySQL學習之聊聊流程控制與遊標

MySQL學習之聊聊流程控制與遊標


#分支結構

分支,即二選一。在SQL中分支結構主要有兩種展現形式:

  • IF
  • CASE

IF語句

  • IF語句的語法結構是:
IF 表达式1 THEN 操作1
[ELSEIF 表达式2 THEN 操作2]……
[ELSE 操作N]
END IF

根據表達式的結果為TRUE或FALSE執行對應的語句。這裡「[]」中的內容是可選的。

  • 特點:① 不同的表達式對應不同的運算② 使用在begin end中

舉例一:單判斷

delimiter //
create procedure test_if()
begin
		# 声明局部变量
		declare stu_name varchar(15);
		if stu_name is null
							then select 'stu_name is null';
		end if;
end//
delimiter ;
call test_if();

MySQL學習之聊聊流程控制與遊標

範例二:二選一

delimiter //
create procedure test_if2()
begin
		declare email varchar(25);
		
		if email is null
					then select 'email is null';
		else
					select 'email is not null';
		end if;
end//
delimiter ;
call test_if2();

MySQL學習之聊聊流程控制與遊標

範例三:多選一

delimiter //
create procedure test_if3()
begin
		declare age int default 20;
		
		if age > 40
					then select '中老年';
		elseif age > 18
					then select '青壮年';
		elseif age > 10
					then select '青少年';
		else 
					select '孩童';
		end if;
end//
delimiter ;
call test_if3();

MySQL學習之聊聊流程控制與遊標

場景範例一:聲明預存程序“update_salary_by_eid1”,定義IN參數emp_id,輸入員工編號。判斷該員工薪資如果低於8,000元且入職時間超過5年,就漲薪500元;否則就不變。

delimiter //
create procedure update_salary_by_eid1(in emp_id int)
begin
  # 声明变量 
	declare sal double;  # 记录员工工资
	declare hiredate date;  # 记录入职日期
	# 查询赋值
	select salary,hire_date into sal,hiredate from employees 
	where employee_id = emp_id;
	# 判断条件并修改
	if sal < 8000 and datediff(now(),hiredate)/365 > 5 
				then update employees set salary = salary + 500 where employee_id = emp_id;
	end if;
end//
delimiter;

set @emp_id = 104;
# 更新前104号员工工资情况:
select salary,employee_id from employees where employee_id = @emp_id;
# 更新工资:
call update_salary_by_eid1(@emp_id);
# 再次查询104号员工工资情况:
select salary,employee_id from employees where employee_id = @emp_id;

MySQL學習之聊聊流程控制與遊標

MySQL學習之聊聊流程控制與遊標

情境範例二:聲明儲存程序“update_salary_by_eid2”,定義IN參數emp_id,輸入員工編號。判斷該員工薪資如果低於9,000元且入職時間超過5年,就漲薪500元;否則就漲薪100元。

delimiter //
create procedure update_salary_by_eid2(in emp_id int)
begin

  # 声明变量 

	declare sal double;  # 记录员工工资
	declare hiredate date;  # 记录入职日期
	# 查询赋值
	select salary,hire_date into sal,hiredate from employees 
	where employee_id = emp_id;
	# 判断条件并修改
	if sal < 9000 and datediff(now(),hiredate)/365 > 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;
# 以103,104员工为例
# 更新前员工工资情况:
select salary,employee_id from employees where employee_id in (103,104);
# 更新工资:
call update_salary_by_eid2(103);
call update_salary_by_eid2(104);
# 再次查询员工工资情况:
select salary,employee_id from employees where employee_id in (103,104);

MySQL學習之聊聊流程控制與遊標

MySQL學習之聊聊流程控制與遊標

場景範例三:聲明儲存程序“update_salary_by_eid3”,定義IN參數emp_id,輸入員工編號。判斷該員工薪資如果低於9000元,就更新薪資為9000元; 薪資如果大於等於9000元且低於10000的,但是獎金比例為NULL的,就更新獎金比例為0.01;其他的漲薪100元。

delimiter //
create procedure update_salary_by_eid3(in emp_id int)
begin
  # 声明变量 
	declare sal double;  # 记录员工工资
	declare emp_commission_pct double;  # 记录奖金比例
	# 查询赋值
	select salary,commission_pct into sal,emp_commission_pct from employees 
	where employee_id = emp_id;
	# 判断条件并修改
	if sal < 9000
			then update employees set salary = 9000 where employee_id = emp_id;
	elseif sal < 10000 and emp_commission_pct 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;

# 以102,103,104员工为例
# 更新前员工工资情况:
select salary,employee_id,commission_pct from employees where employee_id in (102,103,104);
# 更新工资:
call update_salary_by_eid3(102);
call update_salary_by_eid3(103);
call update_salary_by_eid3(104);
# 再次查询员工工资情况:
select salary,employee_id,commission_pct from employees where employee_id in (102,103,104);

MySQL學習之聊聊流程控制與遊標

1MySQL學習之聊聊流程控制與遊標

CASE語句

  • CASE 語句的語法結構1:
#情况一:类似于switch
CASE 表达式
WHEN 值1 THEN 结果1或语句1(如果是语句,需要加分号) 
WHEN 值2 THEN 结果2或语句2(如果是语句,需要加分号)
...
ELSE 结果n或语句n(如果是语句,需要加分号)
END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)
  • CASE 語句的語法結構2:
#情况二:类似于多重if
CASE 
WHEN 条件1 THEN 结果1或语句1(如果是语句,需要加分号) 
WHEN 条件2 THEN 结果2或语句2(如果是语句,需要加分号)
...
ELSE 结果n或语句n(如果是语句,需要加分号)
END [case](如果是放在begin end中需要加上case,如果放在select后面不需要)

範例一:case ... when ... then ...

delimiter //
create procedure test_case()
begin
		declare var int default 2;
		
		case var
			    when 1 then select &#39;var = 1&#39;;
					when 2 then select &#39;var = 2&#39;;
					when 3 then select &#39;var = 3&#39;;
					else select &#39;other&#39;;
		end case;
end //
delimiter ;
call test_case();

1MySQL學習之聊聊流程控制與遊標

範例二:case when ... then ...

#
delimiter //
create procedure test_case2()
begin
		declare var1 int default 10;
		
		case  when var1 >= 100 then select &#39;三位数&#39;;
					when var1 >=10 then select &#39;两位数&#39;;
					else select &#39;个位数&#39;;
		end case;
end //
delimiter ;
call test_case2();

1MySQL學習之聊聊流程控制與遊標

情境範例一:-- 聲明預存程序“update_salary_by_eid4”,定義IN參數emp_id,輸入員工編號。 -- 判斷該員工薪資如果低於9000元,就更新薪資為9000元; -- 薪資大於等於9000元且低於10000的,但是獎金比例為NULL的,就更新獎金比例為0.01; -- 其他的漲薪100元。

delimiter //
create procedure update_salary_by_eid4(in emp_id int)
begin
  # 声明变量 
	declare sal double;  # 记录员工工资
	declare emp_commission_pct double;  # 记录奖金比例
	# 查询赋值
	select salary,commission_pct into sal,emp_commission_pct from employees 
	where employee_id = emp_id;
	# 判断条件并修改
	case
	when sal < 9000
			then update employees set salary = 9000 where employee_id = emp_id;
	when sal < 10000 and emp_commission_pct 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;
# 以103,104,105员工为例
# 更新前员工工资情况:
select salary,employee_id,commission_pct from employees where employee_id in (103,104,105);
# 更新工资:
call update_salary_by_eid3(103);
call update_salary_by_eid3(104);
call update_salary_by_eid3(105);
# 再次查询员工工资情况:
select salary,employee_id,commission_pct from employees where employee_id in (103,104,105);

1MySQL學習之聊聊流程控制與遊標

1MySQL學習之聊聊流程控制與遊標

场景举例二:-- 声明存储过程update_salary_by_eid5,定义IN参数emp_id,输入员工编号。 -- 判断该员工的入职年限,如果是0年,薪资涨50; -- 如果是1年,薪资涨100; -- 如果是2年,薪资涨200; -- 如果是3年,薪资涨300; -- 如果是4年,薪资涨400; -- 其他的涨薪500。

delimiter //
create procedure update_salary_by_eid5(in emp_id int)
begin
  # 声明变量 
	declare sal double;  # 记录员工工资
	declare hire_year double;  # 记录入职日期
	# 查询赋值
	select salary,round(datediff(now(),hire_date)/365) into sal,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;
# 以107员工为例
# 更新前员工工资情况:
select salary,employee_id,hire_date from employees where employee_id = 107;
# 更新工资:
call update_salary_by_eid5(107);
# 再次查询员工工资情况:
select salary,employee_id,hire_date from employees where employee_id = 107;

1MySQL學習之聊聊流程控制與遊標

1MySQL學習之聊聊流程控制與遊標

# 针对场景二,此种写法略显不足,重复的书写相同的更新语句,
# 其实观察下来也就金额不同,可以有改进改进如下:
delimiter //
create procedure update_salary_by_eid6(in emp_id int)
begin
  # 声明变量 
	declare sal double;  # 记录员工工资
	declare hire_year double;  # 记录入职日期
	declare add_sal double; # 保存更新的金额
	# 查询赋值
	select salary,round(datediff(now(),hire_date)/365) into sal,hire_year from employees 
	where employee_id = emp_id;
	# 判断条件并修改
	case hire_year
			when 0 then set add_sal = 50;
			when 1 then set add_sal = 100;
			when 2 then set add_sal = 200;
			when 3 then set add_sal = 300;
			when 4 then set add_sal = 400;
			else set add_sal = 500;
	end case;
	# 根据当前add_sal值修改
	update employees set salary = salary + add_sal where employee_id = emp_id;
end//
delimiter;
# 以108员工为例
# 更新前员工工资情况:
select salary,employee_id,hire_date from employees where employee_id = 108;
# 更新工资:
call update_salary_by_eid5(108);
# 再次查询员工工资情况:
select salary,employee_id,hire_date from employees where employee_id = 108;

1MySQL學習之聊聊流程控制與遊標

1MySQL學習之聊聊流程控制與遊標

循环结构

有时候我们需要重复的执行某条语句,而借助循环结构可以很好地实现。在MySQL中我们可以有三种方式实现循环:

  • LOOP
  • WHILE
  • REPEAT

凡是循环结构都遵循的四要素:

  • 1.初始化条件
  • 2.循环条件
  • 3.循环体
  • 4.迭代条件

LOOP语句

LOOP循环语句用来重复执行某些语句。LOOP内的语句一直重复执行直到循环被退出(使用LEAVE子句),跳出循环过程。

LOOP语句的基本格式如下:

[loop_label:] LOOP
	循环执行的语句
END LOOP [loop_label]

其中,loop_label表示LOOP语句的标注名称,该参数可以省略。

举例一:

delimiter //
create procedure test_loop()
begin
		# 声明变量
		declare num int default 1;
		
		soberw:loop
				# 重新赋值
				set num = num + 1;
				if num >= 10 
						then leave soberw;
				end if;
		end loop soberw;
		
		# 查看num
		select num;
end //
delimiter ;

call test_loop();

MySQL學習之聊聊流程控制與遊標

举例二: -- 当市场环境变好时,公司为了奖励大家,决定给大家涨工资。 -- 声明存储过程“update_salary_loop()”,声明OUT参数num,输出循环次数。 -- 存储过程中实现循环给大家涨薪,薪资涨为原来的1.1倍。 -- 直到全公司的平均薪资达到12000结束。 -- 并统计循环次数。

delimiter //
create procedure update_salary_loop(out num int)
begin
    # 声明变量
		# 记录保存平均薪资
		declare avg_sal double default 0;
		# 记录循环次数
		declare count int default 0;
		# 获取当前平均薪资
		select avg(salary) into avg_sal from employees;
		
		soberw:loop
				# 结束条件
				if avg_sal >= 12000 
								then leave soberw;
						end if;
				# 更新工资
				update employees set salary = salary * 1.1;
				# 保证当前平均薪资为最新
				select avg(salary) into avg_sal from employees;
				# 记录次数
				set count = count + 1;
		end loop soberw;
		# 返回num
		set num = count;
end //
delimiter ;

call update_salary_loop(@num);
select @num;
select avg(salary) from employees;

2MySQL學習之聊聊流程控制與遊標

2MySQL學習之聊聊流程控制與遊標

WHILE语句

WHILE语句创建一个带条件判断的循环过程。WHILE在执行语句执行时,先对指定的表达式进行判断,如果为真,就执行循环内的语句,否则退出循环。WHILE语句的基本格式如下:

[while_label:] WHILE 循环条件  DO
	循环体
END WHILE [while_label];

while_label为WHILE语句的标注名称;如果循环条件结果为真,WHILE语句内的语句或语句群被执行,直至循环条件为假,退出循环。

举例一:WHILE语句示例,i值小于10时,将重复执行循环过程

delimiter //
create procedure test_while()
begin
    # 初始化条件
		declare i int default 1;
		#循环条件
		while i < 10 do
				# 循环体略
				#迭代条件
				set i = i + 1;
		end while;
		select i;
end//
delimiter ;

call test_while();

2MySQL學習之聊聊流程控制與遊標

举例二: -- 市场环境不好时,公司为了渡过难关,决定暂时降低大家的薪资。 -- 声明存储过程“update_salary_while()”,声明OUT参数num,输出循环次数。 -- 存储过程中实现循环给大家降薪,薪资降为原来的90%。 -- 直到全公司的平均薪资达到5000结束。 -- 并统计循环次数。

delimiter //
create procedure update_salary_while(out num int)
begin
    # 声明变量
		# 记录保存平均薪资
		declare avg_sal double default 0;
		# 记录循环次数
		declare count int default 0;
		# 获取当前平均薪资 初始化条件
		select avg(salary) into avg_sal from employees;
		
		#循环条件
		soberw:while avg_sal > 5000 do
				# 循环体		
				# 更新工资
				update employees set salary = salary * 0.9;
				# 记录次数
				set count = count + 1;
				
				# 迭代条件
				# 保证当前平均薪资为最新
				select avg(salary) into avg_sal from employees;
				
		end while soberw;
		# 返回num
		set num = count;
end //
delimiter ;

call update_salary_while(@num);
select @num;
select avg(salary) from employees;

2MySQL學習之聊聊流程控制與遊標

2MySQL學習之聊聊流程控制與遊標

REPEAT语句

REPEAT语句创建一个带条件判断的循环过程。与WHILE循环不同的是,REPEAT 循环首先会执行一次循环,然后在 UNTIL 中进行表达式的判断,如果满足条件就退出,即 END REPEAT;如果条件不满足,则会就继续执行循环,直到满足退出条件为止。

REPEAT语句的基本格式如下:

[repeat_label:] REPEAT
    循环体的语句
UNTIL 结束循环的条件表达式
END REPEAT [repeat_label]

repeat_label为REPEAT语句的标注名称,该参数可以省略;REPEAT语句内的语句或语句群被重复,直至expr_condition为真。

举例一:

DELIMITER //

CREATE PROCEDURE test_repeat()
BEGIN	
	DECLARE i INT DEFAULT 0;
	
	REPEAT 
		SET i = i + 1;
	UNTIL i >= 10
	END REPEAT;
	
	SELECT i;
END //

DELIMITER ;

call test_repeat();

2MySQL學習之聊聊流程控制與遊標

举例二: -- 当市场环境变好时,公司为了奖励大家,决定给大家涨工资。 -- 声明存储过程“update_salary_repeat()”,声明OUT参数num,输出循环次数。 -- 存储过程中实现循环给大家涨薪,薪资涨为原来的1.15倍。 -- 直到全公司的平均薪资达到13000结束。 -- 并统计循环次数。

delimiter //
create procedure update_salary_repeat(out num int)
begin
		# 声明变量
		# 记录保存平均薪资
		declare avg_sal double default 0;
		# 记录循环次数
		declare count int default 0;
		# 获取当前平均薪资 初始化条件
		select avg(salary) into avg_sal from employees;
		
		#循环条件
		soberw:repeat  
				# 循环体		
				# 更新工资
				update employees set salary = salary * 1.15;
				# 记录次数
				set count = count + 1;
				
				# 迭代条件
				# 保证当前平均薪资为最新
				select avg(salary) into avg_sal from employees;
				
		until avg_sal >= 13000
		end repeat soberw;
		# 返回num
		set num = count;
end //
delimiter ;

call update_salary_repeat(@num);
select @num;
select avg(salary) from employees;

2MySQL學習之聊聊流程控制與遊標

2MySQL學習之聊聊流程控制與遊標

对比三种循环结构:

1、这三种循环都可以省略名称,但如果循环中添加了循环控制语句(LEAVE或ITERATE)则必须添加名称。 2、 LOOP:一般用于实现简单的"死"循环 WHILE:先判断后执行 REPEAT:先执行后判断,无条件至少执行一次

跳转语句

跳转语句可以协助我们更好的控制循环。

LEAVE语句

LEAVE语句:可以用在循环语句内,或者以 BEGIN 和 END 包裹起来的程序体内,表示跳出循环或者跳出程序体的操作。如果你有面向过程的编程语言的使用经验,你可以把 LEAVE 理解为 break

基本格式如下:

LEAVE 标记名

其中,label参数表示循环的标志。LEAVE和BEGIN ... END或循环一起被使用。

举例1:创建存储过程 “leave_begin()”,声明INT类型的IN参数num。 给BEGIN...END加标记名,并在BEGIN...END中使用IF语句判断num参数的值。

  • 如果num
  • 如果num=1,则查询“employees”表的平均薪资;
  • 如果num=2,则查询“employees”表的最低薪资;
  • 如果num>2,则查询“employees”表的最高薪资。

IF语句结束后查询“employees”表的总人数。

delimiter //
create procedure leave_begin(in num int)
soberw:begin
		if num <= 0 
				then leave soberw;
		elseif num = 1
				then select avg(salary) from employees;
		elseif num = 2
				then select min(salary) from employees;
		elseif num > 2
				then select max(salary) from employees;
		end if;
		select count(1) from employees;
end//
delimiter ;

call leave_begin(2);
call leave_begin(-1);

2MySQL學習之聊聊流程控制與遊標

MySQL學習之聊聊流程控制與遊標

举例2: -- 当市场环境不好时,公司为了渡过难关,决定暂时降低大家的薪资。 -- 声明存储过程“leave_while()”,声明OUT参数num,输出循环次数, -- 存储过程中使用WHILE循环给大家降低薪资为原来薪资的90%, -- 直到全公司的平均薪资小于等于10000, -- 并统计循环次数。

delimiter//
create procedure leave_while(out num int)
begin
		declare avg_sal double;
		declare count int default 0;
		
		select avg(salary) into avg_sal from employees;
		soberw:while true do
		
				if(avg_sal <= 10000) 
						then leave soberw;
				end if;
				
				update employees set salary = salary * 0.9;
				select avg(salary) into avg_sal from employees;
				set count = count + 1;
				
		end while soberw;
		
		set num = count;
end//
delimiter;

call leave_while(@num);
select @num;
select avg(salary) from employees;

3MySQL學習之聊聊流程控制與遊標

3MySQL學習之聊聊流程控制與遊標

ITERATE语句

ITERATE语句:只能用在循环语句(LOOP、REPEAT和WHILE语句)内,表示重新开始循环,将执行顺序转到语句段开头处。如果你有面向过程的编程语言的使用经验,你可以把 ITERATE 理解为 continue,意思为“再次循环”。

语句基本格式如下:

ITERATE label

label参数表示循环的标志。ITERATE语句必须跟在循环标志前面。

举例一:定义局部变量num,初始值为0。循环结构中执行num + 1操作。 -- 如果num 15,则退出循环结构;

delimiter //
create procedure test_iterate()
begin
		declare num int default 0;
		soberw:loop
				set num = num + 1;
				if num < 10
				   then iterate soberw;
			  end if;
				if num >15
					then leave soberw;
			  end if;
		end loop soberw;
		
		select num;
end//
delimiter ;

call test_iterate();

3MySQL學習之聊聊流程控制與遊標

游标

虽然我们也可以通过筛选条件 WHERE 和 HAVING,或者是限定返回记录的关键字 LIMIT 返回一条记录,但是,却无法在结果集中像指针一样,向前定位一条记录、向后定位一条记录,或者是随意定位到某一条记录,并对记录的数据进行处理。

这个时候,就可以用到游标。游标,提供了一种灵活的操作方式,让我们能够对结果集中的每一条记录进行定位,并对指向的记录中的数据进行操作的数据结构。游标让 SQL 这种面向集合的语言有了面向过程开发的能力。

在 SQL 中,游标是一种临时的数据库对象,可以指向存储在数据库表中的数据行指针。这里游标充当了指针的作用,我们可以通过操作游标来对数据行进行操作。

MySQL中游标可以在存储过程和函数中使用。

游标使用的步骤:

  • 1)声明游标   DECLARE cursor_name CURSOR FOR select_statement;
  • 2)打开游标   OPEN cursor_name
  • 3)使用游标(从游标中获取数据)  FETCH cursor_name INTO var_name [, var_name] ...
  • 4)关闭游标   CLOSE cursor_name

注意:游标的查询结果集中的字段数,必须跟 INTO 后面的变量数一致,否则,在存储过程执行的时候,MySQL 会提示错误。

有 OPEN 就会有 CLOSE,也就是打开和关闭游标。当我们使用完游标后需要关闭掉该游标。因为游标会占用系统资源,如果不及时关闭,游标会一直保持到存储过程结束,影响系统运行的效率。而关闭游标的操作,会释放游标占用的系统资源。

举例: -- 创建存储过程“get_count_by_limit_total_salary()”, -- 声明IN参数 limit_total_salary,DOUBLE类型; -- 声明OUT参数total_count,INT类型。 -- 函数的功能可以实现累加薪资最高的几个员工的薪资值, -- 直到薪资总和达到limit_total_salary参数的值, -- 返回累加的人数给total_count。

delimiter //
create procedure get_count_by_limit_total_salary(in limit_total_salary double,out total_count int)
begin
    # 保存薪资和
		declare sum_sal double default 0;
		# 保存累加人数
		declare count int default 0;
		# 定义单个工资
		declare emp_salary double default 0;
		# 定义游标
		declare cursor_sal cursor for select salary from employees order by salary desc;
		# 打开游标
		open cursor_sal;
		# 使用游标
		while sum_sal < limit_total_salary do
		   fetch cursor_sal into emp_salary;
			set sum_sal = sum_sal + emp_salary;
			set count = count + 1;
		end while;
		#关闭游标
		close cursor_sal;
		# 给total_count赋值
		set total_count = count;
end//
delimiter ;

set @limit_total_salary = 200000;
call get_count_by_limit_total_salary(@limit_total_salary,@total_count);
select @total_count;

3MySQL學習之聊聊流程控制與遊標

【相关推荐:mysql视频教程

以上是MySQL學習之聊聊流程控制與遊標的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:掘金社区。如有侵權,請聯絡admin@php.cn刪除
图文详解mysql架构原理图文详解mysql架构原理May 17, 2022 pm 05:54 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

mysql的msi与zip版本有什么区别mysql的msi与zip版本有什么区别May 16, 2022 pm 04:33 PM

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

mysql怎么去掉第一个字符mysql怎么去掉第一个字符May 19, 2022 am 10:21 AM

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

mysql怎么替换换行符mysql怎么替换换行符Apr 18, 2022 pm 03:14 PM

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

mysql怎么将varchar转换为int类型mysql怎么将varchar转换为int类型May 12, 2022 pm 04:51 PM

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

MySQL复制技术之异步复制和半同步复制MySQL复制技术之异步复制和半同步复制Apr 25, 2022 pm 07:21 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

mysql怎么判断是否是数字类型mysql怎么判断是否是数字类型May 16, 2022 am 10:09 AM

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

带你把MySQL索引吃透了带你把MySQL索引吃透了Apr 22, 2022 am 11:48 AM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了mysql高级篇的一些问题,包括了索引是什么、索引底层实现等等问题,下面一起来看一下,希望对大家有帮助。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版