mysql的学习笔记(阶段三)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: -- mysql存储过程 delimiter $$ CREATE PROCEDURE proc01 () BEGIN SELECT emp_name, emp_salary FROM emp; END $$ delimiter;-- 调用存储过程CALL proc01 ();-- 很类似调用函数(实际上就是将sql封装为函数)-- 使用变量


-- mysql存储过程
    delimiter $$
    CREATE PROCEDURE proc01 () 
    BEGIN
    SELECT
      emp_name,
      emp_salary 
    FROM
      emp;
    END $$
    delimiter;-- 调用存储过程
CALL proc01 ();-- 很类似调用函数(实际上就是将sql封装为函数)
--  使用变量
delimiter $$
create procedure prooc02()
begin
  declare var_name01 varchar(20) default 'aaa'; -- 声明变量(局部变量)
  set var_name01 = '张三'; -- 给变量赋值
  select var_name01; --  输出变量的值
end $$
delimiter ;
call prooc02();
--  可以使用 select .. into 为变量赋值
select emp_name into var_name from emp where dept_no = 0001; -- 将此写入存储过程代码中
--  定义一个用户变量
-- @var_name
delimiter $$
create procedure proc04()
begin
  set @var_name01 = '北京';
  select @var_name01;
end $$
delimiter;
call proc04();
-- 看看用户变量是否可以在外部使用
select @var_name01;
-- 系统变量(mysql提前定义的,不能用户自己定义)
 -- 系统变量-全局
 -- @@global.var_name;
-- 查看所有的全局变量
show global variables;
select @@global.auto_increment_increment; -- 查看指定的全局变量
--  修改全局变量
select @@global_sort_buffer_size = 30000;
-- 会话变量
show session variables;
set session sort_buffer_size = 50000; -- 修改
set @@session.sort_buffer_size = 60000;
-- 并不是所有的会话变量可以修改
-- 封装有参数的存储过程
-- 采用in进行传参
delimiter $$
create procedure  proc06(in param_empno int)
begin 
  select * from emp where id = param_empno;
end $$
delimiter;
call proc06(2);
drop procedure proc06;
-- out传参(一般用在需要返回值的时候)
delimiter $$
create procedure proc08(in in_empno int ,out out_ename varchar(50))
begin
  select ename into out_ename from emp where empno = in_empno;
end$$
delimiter;
call proc08(1001,@o_ename);
select @o_ename; -- 查询返回的名字
-- inout 从外部传入的传入的参数可以在函数内部进行修改,然后修改完之后还可以自动传出来
delimiter $$
create procedure proc10(inout num int)
begin
  set num = num*10;
end $$
delimiter;
set @inout_num = 2;
call proc10(@inout_num);
select @inout_num;
-- 一个存储的判断过程
delimiter $$
create procedure proc_12_if(in score int)
begin
  if score < 60 
    then 
    select "不及格";
    elseif score >=60 and score < 90
    then 
      select "及格";
    elseif score >=80 and score <90
    then 
      select '良好';
    elseif score >=90 and score<=100
    then 
      select "优秀";
    else 
    select "成绩错误";
    end if;
end $$
delimiter;
set @score = 65;
call proc_12_if(@score)
drop procedure if exists proc_13_if;
delimiter $$
create procedure proc_13_if(in ename varchar(20))
begin
  declare var_sal decimal(7,2);
  declare result varchar(20);
  select emp_salary into var_sal from emp where emp_name = ename;
  if var_sal <3000
  then 
    set result = "试用薪资";
  else
    set result = "转正薪资";
  end if;
  select result;
end $$
delimiter;
call proc_13_if("王五");
--  case 的用法
delimiter $$
create procedure proc14_case(in pay_type int)
begin
  case pay_type
  when 1 then select '微信支付';
  when 2 then select '支付宝支付';
  when 3 then select "银行卡支付";
  else select "其它";
  end case;
end $$;
delimiter;
call proc14_case(2);
-- 循环
-- 创建一个测试表
create table jgdabc
(
  uid int primary key,
  username varchar(50),
  password varchar(50)
);
--  向表中添加指定条数据
delimiter $$
create procedure proc16_while(in insertCount int )
begin
declare i int default 1;
  while i <=insertCount do 
  insert into jgdabc(uid,username,password)values(i,concat('user-',i),'123456');
    set i = i+1;
  end while;
end $$
delimiter;
 -- 如果要用到leave跳出,那么必须使用lable
delimiter $$
create procedure proc16_while(in insertCount int )
begin
declare i int default 1;
  lable : while i <=insertCount do 
  insert into jgdabc(uid,username,password)values(i,concat('user-',i),'123456');
    set i = i+1;
    if i =5 then
    leave lable;
    end if;
  end while lable;
end $$
delimiter;
 -- iterate 相当于continue
call proc16_while(10);
delimiter $$
create procedure proc16_while(in insertCount int )
begin
declare i int default 1;
  lable : while i <=insertCount do 
  insert into jgdabc(uid,username,password)values(i,concat('user-',i),'123456');
    set i = i+1;
    if i =5 then
    iterate lable; --  死循环
    end if;
  end while lable;
end $$
delimiter;
delimiter $$
create procedure proc16_while(in insertCount int )
begin
declare i int default 1;
  lable : while i <=insertCount do 
    set i = i+1;
    if i =5 then
    iterate lable; --  死循环
    end if;
    insert into jgdabc(uid,username,password)values(i,concat('user-',i),'123456');
  end while lable;
  select "循环结束";
end $$
delimiter;
--  interate 跳出本层循环,继续下一次循环
-- repeat --- until
-- 相当于do -- while()
delimiter $$
create procedure proc16_while(in insertCount int )
begin
declare i int default 1;
    label:repeat
    insert into jgdabc(uid,username,password)values(i,concat('user-',i),'123456');
     set i = i+1;
    until i >insertcount
    end repeat label;
     select "循环结束";
end $$
delimiter;
--  loop
delimiter $$
create procedure proc19_loop(in insertCount int)
begin
  declare i in default 1;
  label : loop
  insert into user(uid,username,password) values(i,concat('user-',i),'123456');
  set i = i+1;
  if i>insertCount
   then 
    leave label;
  end if;
  end loop label;
  end $$
  delimiter;
  call proc19_loop(10);
  -- cursor(游标)用来存储查询的结果集
  -- 声明游标
  declare cursor_name cursor for select_statemant  -- 语法
  -- 打开游标
  open cursor_name
  -- 取值语法
  fetch cursor_name into var_name 
  -- 关闭游标
  close cursor_name
  -- 操作游标
  -- 需求,输入一个部门名,查询员工的编号,名字,薪资,将查询的结果集添加到游标
  delimiter $$
  create procedure proc19_cursor(in in_dname varchar(50))
  begin
  --  定义局部变量
  declare var_empno int;
  declare var_ename varchar(50);
  declare var_sal   decimal(7,2);
  -- 声明游标
  declare my_cyrsor cursor for
  select empno,ename,salary
  from dept a,emp b
  where a.deptno = b.deptno and a.dname = in_dname;
  -- 打开游标
  open my_cursor;
  label:loop
  -- 通过游标获取值(fetch一次获取一行,所以写一个循环)
  fetch my_cursor into var_empno,var_name,var_sal; -- 这样一直向下获取,当获取不到的时候会自己中断,然后报一个异常。
  select var_empno,var_ename,var_sal;
  end loop label;
  -- 关闭游标
  close my_cursor;
  end $$;
  delimiter ;
  call proc19_cursor('销售部');
  -- 句柄
  -- handler 句柄
  user mysql;
  drop procedure if exists proc21_cursor_handler;
  delimiter $$
  create procedure proc21_cursor(in in_dname varchar(50))
  begin
  -- 定义局部变量
  declare var_empno int;
  declare var_ename varchar(50);
  declare var_sal decimal(7,2);
  --  定义标记值
  declare flag int default 1;
  --  声明游标
  declare my_cursor cursor for
    select empno,ename,sal
    from dept a, emp b
    where a,deptno = b.deptno and a.dname = in_name;
    --  定义句柄,定义异常的处理方法
    --  异常处理完之后,程序该怎么执行
    -- contunue 继续执行剩余代码
    -- exit 直接终止程序
    -- undo : 不支持
    --  触发条件:条件码....,条件名....
    -- 异常触发之后执行什么代码
    -- 设置flag的值
  declare continue handler for 1329 set flag =0;
  -- 判断标志位
  -- 如果flag地值为1就执行,反之,不执行
  open my_cursor;
  label:loop
    fetch my_cursor into var_empno,var_ename,var_sal;
    if flag =1 then
    select var_empno,var_ename,var_sal;
    else
    leave label;
    end if;
  end loop label;
  close my_cursor;
--  句柄就是mysql的异常处理


原文链接:https://blog.csdn.net/jgdabc/article/details/123398728

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
存储 关系型数据库 MySQL
Linux C/C++ 开发(学习笔记八):Mysql数据库图片存储
Linux C/C++ 开发(学习笔记八):Mysql数据库图片存储
50 0
|
3月前
|
关系型数据库 MySQL 数据库
Linux C/C++ 开发(学习笔记七):Mysql数据库C/C++编程实现 插入/读取/删除
Linux C/C++ 开发(学习笔记七):Mysql数据库C/C++编程实现 插入/读取/删除
51 0
|
2月前
|
关系型数据库 MySQL
MySQL学习笔记
MySQL学习笔记
|
2月前
|
安全 关系型数据库 MySQL
某教程学习笔记(一):09、MYSQL数据库漏洞
某教程学习笔记(一):09、MYSQL数据库漏洞
19 0
|
2月前
|
存储 关系型数据库 MySQL
《高性能Mysql》学习笔记(二)
《高性能Mysql》学习笔记(二)
136 0
|
2月前
|
存储 SQL 关系型数据库
《高性能Mysql》学习笔记(一)
《高性能Mysql》学习笔记(一)
94 0
|
3月前
|
关系型数据库 MySQL Linux
Linux C/C++ 开发(学习笔记六):MySQL安装与远程连接
Linux C/C++ 开发(学习笔记六):MySQL安装与远程连接
47 0
|
3月前
|
SQL 关系型数据库 MySQL
MySQL8.0安装(win10) ---SQL学习笔记
MySQL8.0安装(win10) ---SQL学习笔记
41 0
|
4月前
|
存储 SQL 关系型数据库
MYSQL实战-------丁奇(极客时间)学习笔记
MYSQL实战-------丁奇(极客时间)学习笔记
49 0
|
4月前
|
SQL 关系型数据库 MySQL
MySQL入门语法(视频学习笔记)二
什么是事务 要么都成功,要么都失败 1、SQL执行 A给B转账:A1000 —> 200 B200 2、SQL执行 B收到A钱:A800 —> B400 即将一组SQL放在一个批次中去执行! 事务原则(ACID原则) 原子性 原子性表示要么都成功,要么都失败,不能只发生其中一个动作