• MySQL中函数、游标、事件、视图


    MySQL中函数、游标、事件、视图基本应用举例(代码)

    MySQL中
    function用户自定义函数
    c,fun,fun是面向过程的实现方式
    只能传入参数,或不传入参数,不能传出参数,必有返回值
    函数中是不能有create table drop table之类的语句
    与sp一样,db中object
    begin end 相当于{}
    (1)输入任意姓名,输出 hello+姓名+!
    drop function if exists fun1;
    delimiter //
    create function fun1(a varchar(32))
    returns varchar(32)
    begin
        declare x varchar(32);
        set x=concat('hello',a,'!');
        return x;
    end //
    delimiter ;
    select fun1('张三');
                            -- (1)等同于(2)
    (2)输入任意姓名,输出 hello+姓名+!
    drop function if exists fun1;
    create function fun1(a varchar(32))
    returns varchar(32)
    return concat('hello',a,'!');      -- 因为只有一条语句,所以省略了 begin end
    select fun1('张三');

    (3)求和
    drop function if exists fun1;
    delimiter //
    create function fun1(a int,b int)
    returns int
    begin
       declare c int;
     -- set c=a+b;
       select a+b into c;
       return c;
      -- return a+b;
    end //
    delimiter ;
    select fun1(10,30);

    (4)select fun1('zhangfei');->stu(stuName) 实现输入姓名,插入到stu表的stuName字段,并返回stu表的记录条数
    drop function if exists fun1;
    delimiter //
    create function fun1(a varchar(32))
    returns int
    begin
       declare x int;
       insert into stu(stuName) select a;
       select count(1) into x from stu;
       return x;
    end //
    delimiter ;
    select fun1('zhangfei');

    (5)取输入字符串的前b个字符,并在其后加...输出,若输入字符串为空,则提示‘输入错误’,若输入字符串长度小于b,则直接输出字符串,若大于b,则截取前b个字符,并在其后加...输出
    drop function if exists fun1;
    delimiter //
    create function fun1(a varchar(32),b int)
    returns varchar(32)
    begin
       if isnull(a) || char_length(a)=0 then
       return '输入错误';
       elseif  char_length(a)<=b then
       return a;
        else 
        return concat(left(a,b),'...'); 
       end if;
    end //
    delimiter ;
    select fun1('abcdef',3);

    (6)输出a个*
    drop function if exists fun1;
    delimiter //
    create function fun1(a int)
    returns varchar(32)
    begin
       declare b int default 1; -- 1...5
       declare s varchar(32) default '';
       while b<=a
       do
       set s=concat(s,'*');
       set b=b+1;
       end while;
       return s;
    end //
    delimiter ;
    select fun1(5);

    -- cursor游标(光标)
    很少用,基本不用
    对以后用php从一个表内将数据一条条取出来放网页上去显示
    -- 什么是cursor
    4个步骤
    -- cursor,数据缓冲区
    1.声明coursor
    declare cur cursor for select stuID,stuName from stu oder by stuID;
    2.打开coursor
    open cur;
    cursor有一个指针,默认就指在第一条
    3.fetch
    declare a int;
    declare b varchar(32);
    declare c varchar(32);
    fetch cur into a,b,c;
    select a,b,c;

    fectch完数据,指针自动下移一行
    while

    close cur;

    cursor 放在sp中用
    drop procedure if exists sp1;
    delimiter //
    create procedure sp1()
    begin
       declare a int;
       declare b varchar(32);
       declare cur cursor for select stuID,stuName from aa order by stuID;
       open cur;
     -- fetch cur into a,b;
     -- fetch cur into a,b;         (有三条数据)
     -- fetch cur into a,b;
      -- select a,b;
      -- close cur;
        set @a=1;
        select count(1) into @b from stu;
        while @a<=@b
        do
        fetch cur into a,b;
        select a,b;
        set @a=@a+1;
         end while;
       close cur;
    end //   
    delimiter ;
    call sp1();


    -- event事件
    用的也较少 类似linux中的crontab (每天下午执行某事件) 一般用于定期执行某任务
    drop event if exists ev1;
    create event ev1
    on schedule every 1 minute        -- 每隔1分钟执行一次该事件
    do
      insert into aa select 5,'孙坚';

    alter event ev1 disable; 使其停止执行
    on schedule at now()     立即执行,就执行一次,事件不会保存下来

    drop event if exists ev1;
    delimiter //
    create event ev1
    on schedule at now() + interval 3 second -- 3秒后执行一次该事件,执行完后该事件消失
    do
    begin
      insert into aa select 5,'孙坚';
      insert inwo aa select 6,'e';
    end//
    delimiter ;

    alter event ev1 disable;
    alter event ev1 enable;

    -- view 视图
    -- 是一张虚拟表,
    select * from v1;
    -- data
    view->table
    -- 方便
    -- 安全
    stu(stuID,stuName,stuAge,stuAddr)
    stuID,stuName->v1 -- 看需求

    stu(stuID,stuName)
    courses(coursesID,coursesName)
    sc(stuID,coursesID,score)

    create view v1
    as 
      select stuName,coursesName,score
      from stu,courses,sc
      where sc.stuID=stu.stuID && sc.coursesID=courses.coursesID

    select * from v1;
    -- 比较复杂的查询做成view
    -- 视图只用于看,显示,select
    -- 当要进行数据修改插入什么的时候,直接修改基表

    create table stu
    (
        stuID int,
        stuName varchar(32),
        stuAge int,
        stuAddr varchar(32),
        primary key(stuID)
    )engine=innodb charset=utf8;
    -- stuName,stuAge
    drop view if exists v1;
    create view v1
    as
    select stuName,stuAge from stu;

    -- book(),author(),press
    create table author
    (
        authorID int, 
        authorName varchar(32)
    )engine=innodb charset=utf8;
    create table press

       pressID int,
       pressName varchar(32)
    )engine=innodb charset=utf8;
    create table book
    (
       bookID int,
       bookName varchar(32),
       authorID int,
       pressID int
    ) engine=innodb charset=utf8;

    drop view if exists v1;
    create view v1
    as
    select bookName,authorName,pressName
    from book,author,press
    where book.authorID=author.authorID && book.pressID=press.pressID;
    select * from v1;

    -- 根据需求,view只用来查数据
    -- 要insert,update,delete就直接操作基表,而不是操作view

     
     
    分类: MySQL
  • 相关阅读:
    小数据池以及深浅拷贝
    字典的初识,了解
    元组:认识,索引 切片
    列表的认识,嵌套,增删改查
    bool、字符串方法、for循环
    字符串格式化输出、while循环、运算符.
    Python的基础知识与历史应用
    git错误:error: failed to push some refs to 'https://...'
    golang中gin框架使用logrus
    golang中如何监控多个goroute协程是否执行完成
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3209619.html
Copyright © 2020-2023  润新知