MySQL高级

视图

创建视图

CREATE view v_eptu
as 
select id,empname,dpname,dpid from emp e LEFT JOIN dept d on e.epno=d.dpid

视图创建好以后就已一个表格的形式存在

查看视图内容

SELECT * FROM v_eptu

删除视图

drop view v_eptu

查看表格

show tables

存储过程-函数

创建存储函数

create procedure p_p1()
BEGIN
SELECT 'hello';
end

查看函数内容

call 函数名

查看函数的状态信息和有哪些函数

show PROCEDURE STATUS

删除函数

drop PROCEDURE 函数名

语法

存储过程是可以编程的,意味着可以使用变量,表达式,控制结构 , 来完成比较复杂的功能。

DECLARE,set

通过 DECLARE 可以定义一个局部变量,该变量的作用范围只能在 BEGIN…END 块中。

set 对里面的变量进行赋值

CREATE PROCEDURE p_p1()
BEGIN
DECLARE num int;
SET num=10;
SELECT num;
END

也可以通过select ... into 方式进行赋值操作 :

CREATE PROCEDURE pro_test5()

BEGIN

declare countnum int;

select count(*) into countnum from city;

select countnum;

END

if条件判断

if使用时必须要配合end if;
then后面不可以加  ;

CREATE PROCEDURE p_p3()
BEGIN
DECLARE height int default 130;
declare zhi VARCHAR(200);
if height>=180 then
set zhi='高';
elseif height>=165 then
set zhi='适中';
else 
set zhi='未成年';
end if;
SELECT zhi;
END

传递参数

IN : 该参数可以作为输入,也就是需要调用方传入值 , 默认
OUT: 该参数作为输出,也就是该参数可以作为返回值
INOUT: 既可以作为输入参数,也可以作为输出参数

CREATE PROCEDURE p_p4(in height int,out zhi varchar(200))
begin
    if height>=180 then
        set zhi='高挑';
    elseif height>=165 then
        set zhi='适中';
    else
        set zhi='未成年';
    end if;
end

call p_p4(177,@z)
select @z

变量名前加一个 @         叫做用户会话变量,代表整个会话过程他都是有作用的,这个类似于全局变量一样。

变量名前添加两个@  叫做 系统变量

case结构

case使用时要和end case;配合一起使用

create procedure p_p5(in months int)
    begin
        declare ji varchar(200);
        case
            when months>=1 and months<=3 THEN
                set ji='第一季度';
            when months<=6 and months>3 then 
                set ji='第二季度';
            when months<=9 and months>6 then
                set ji='第三季度';
            when months<=12 and months>9 then
                set ji='第四季度';
            when months!=1 and months!=12 then
                set ji='请输入正确的日期';
        end case;
        select concat('您输入的日期为:',months,'季度为:',ji) as content;
    end

call p_p5(0)

while循环

while使用时要和end while;配合一起使用

create procedure p_p6(in i int)
begin
    declare total int default 0;
  declare num int default 1;
        while num<=i do
            set total = total + num;
            set num = num + 1;
        end while;
  select total; 
end

call p_p6(100)

repeat结构

repeat满足条件就退出循环
有条件的循环控制语句, 当满足条件的时候退出循环 。
while 是满足条件才执行然后就要退出执行
repeat使用时要和end repeat;配合一起使用

create procedure p_p7(in i int,out d int)
    begin
        declare n int default 0;
        set d=0;
         repeat
            set d=d+n;
            set n=n+1;
            until n>i
         end repeat;
    end

call p_p7(100,@z)
select @z

loop语句,leave语句

LOOP 实现简单的循环,退出循环的条件需要使用其他的语句定义,通常可以使用 LEAVE 语句实现
用来从标注的流程构造中退出,通常和 BEGIN ... END 或者循环一起使用

create procedure p_p8(in n int)
    begin
     declare i int default 0;
     rro: loop
        if n<=0 then
            leave rro;
        end if;
        set i=i+n;
        set n=n-1;
     end loop rro;
     select i;
    end

游标/光标

游标是用来存储查询结果集的数据类型 , 在存储过程和函数中可以使用循环将光标存储的值展现出来。光标的使用包括光标的声明、OPEN、FETCH 和 CLOSE,其语法分别如下

声明光标:

DECLARE cursor_name CURSOR FOR select_statement ;

OPEN 光标:

OPEN cursor_name ;

FETCH 光标:

FETCH cursor_name INTO var_name [, var_name] ...

CLOSE 光标:

CLOSE cursor_name ;

-- 使用循环将游标中的数据循环出来
create procedure p_p10()
begin
    declare id int;
    declare empname varchar(200);
    declare epno int;
    declare e_hast int default 1;
--     定义游标
    declare e_you cursor for select * from emp;
--     退出之后让e_hast=0
    declare exit handler for not found set e_hast=0;
--     打开游标
        open e_you;
--         开启循环
            e:loop
                if e_hast=0 then
                    leave e;
                end if;
        fetch e_you into id,empname,epno;
            select concat('id:',id,'姓名:',empname,'部门号:',epno);
        fetch e_you into id,empname,epno;
            select concat('员工编号:','姓名:',empname,'部门标号:',epno);
--             展示时两种形式交替展现
            end loop e;
        close e_you;
end
call p_p10
drop procedure p_p10

存储函数

CREATE FUNCTION function_name([param type ... ])

RETURNS type // type代表返回值的类型;

BEGIN

...

END;

案例 :

-- 函数 根据部门的编号查看部门中的人数
create function h_h1(n int)
    returns int
    begin
        declare h int default 0;
         select count(*) into h from emp where epno=n;
        return h;
    end;

-- 调用
select h_h1(1)

mybatis调用存储过程

接口:

Map getPro(Map map);

接口:

Map getPro(Map map);

xml文件:

<select id="getPro" resultType="map" statementType="CALLABLE" parameterType="map">

{call pro_getdes(#{height,jdbcType=INTEGER,mode=IN},#{describtion,jdbcType=VARCHAR,mode=OUT})}

</select>

测试类:

@RunWith(SpringRunner.class)

@SpringBootTest(classes = OrderDemo.class)

public class SpringTest {

@Resource

private TorderMapper torderMapper;

@Test

public void aaa(){

System.out.println("ddd");

Map m=new HashMap();

m.put("height",150);

m.put("describtion",null);

torderMapper.getPro(m);

System.out.println(m);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值