zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    ajax专题
    luogu P1346 电车 最短路
    luogu P1462 通往奥格瑞玛的道路 最短路
    luogu P1328 生活大爆炸版石头剪刀布
    luogu P1315 联合权值 枚举
    luogu P1156 垃圾陷阱 背包问题
    luogu P1217 回文质数 枚举
    luogu P3650 滑雪课程设计 枚举
    luogu1209 修理牛棚 贪心
    luogu P1223 排队接水 贪心
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3209619.html
Copyright © 2011-2022 走看看