• ADADADADAD

    MySQL之视图、存储过程、触发器、函数、事务、动态执行SQL[ mysql数据库 ]

    mysql数据库 时间:2024-12-25 09:56:45

    作者:文/会员上传

    简介:

    视图
    视图是一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】,用户使用时只需使用【名称】即可获取结果集,并可以将其当作表来使用。
    创建视图:
    create

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。

    视图

    视图是一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】,用户使用时只需使用【名称】即可获取结果集,并可以将其当作表来使用。


    创建视图:

    createviewv1asselect*fromstudentwhereid>100;

    今后可以直接通过:

    select*fromv1;#直接访问学生ID大于100的信息

    删除视图:

    dropviewv1;

    修改视图:

    alterviewv1asselectid,namefromstudentwhereid<10andname=dandan;

    注意:使用视图时,将其当作表进行操作即可,由于视图是虚拟表,所以使用其对真实表进行创建、更新和删除操作,仅能做查询用。


    触发器

    对某个表进行【增/删/改】操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行【增/删/改】前后的行为。


    创建触发器:

    delimiter//createtriggertg_before_insert_studentbeforeinsertonstudentforeachrowbeginifnew.name=='alex'theninsertintostudent_back(name)values('alex_back');end//delimiter;

    也可以用 after insert 表示插入之后执行触发器中语句,还有其他操作:before update、after update、before delete 、after delete

    注意:NEW表示即将插入的数据行,OLD表示即将删除的数据行


    删除触发器:drop tgigger tg_before_insert_student


    触发器无法由用户直接调用,而知由于对表的【增/删/改】操作被动引发的。


    存储过程


    存储过程是一个SQL语句集合,当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行。

    --创建存储过程delimiter//createprocedurep1()BEGINselect*fromt1;END//delimiter;--执行存储过程callp1()

    对于存储过程,可以接受参数,其参数类型有三类:

    in 只用于传入参数

    out 用于返回值

    inout 即可以传入又可以当作返回值


    有参数的存储过程:

    --创建存储过程delimiter\\createprocedurep1(ini1int,ini2int,inouti3int,outr1int)BEGINDECLAREtemp1int;DECLAREtemp2intdefault0;settemp1=1;setr1=i1+i2+temp1+temp2;seti3=i3+100;end\\delimiter;--执行存储过程set@t1=4;set@t2=0;CALLp1(1,2,@t1,@t2);SELECT@t1,@t2;

    结果集加返回值:

    delimiter//createprocedurep2(inn1int,inoutn3int,outn2int,)begindeclaretemp1int;declaretemp2intdefault0;select*fromv1;setn2=n1+100;setn3=n3+n1+100;end//delimiter;

    事务型存储过程:

    delimiter\\createPROCEDUREp1(OUTp_return_codetinyint)BEGINDECLAREexithandlerforsqlexceptionBEGIN--ERRORsetp_return_code=1;rollback;END;DECLAREexithandlerforsqlwarningBEGIN--WARNINGsetp_return_code=2;rollback;END;STARTTRANSACTION;DELETEfromtb1;insertintotb2(name)values('seven');COMMIT;--SUCCESSsetp_return_code=0;END\\delimiter;

    游标:

    delimiter//createprocedurep3()begindeclaressidint;--自定义变量1declaressnamevarchar(50);--自定义变量2DECLAREdoneINTDEFAULTFALSE;DECLAREmy_cursorCURSORFORselectsid,snamefromstudent;DECLARECONTINUEHANDLERFORNOTFOUNDSETdone=TRUE;openmy_cursor;xxoo:LOOPfetchmy_cursorintossid,ssname;ifdonethenleavexxoo;ENDIF;insertintoteacher(tname)values(ssname);endloopxxoo;closemy_cursor;end//delimter;

    动态执行SQL:

    delimiter\\CREATEPROCEDUREp4(innidint)BEGINPREPAREprodFROM'select*fromstudentwheresid>?';EXECUTEprodUSING@nid;DEALLOCATEprepareprod;END\\delimiter;

    删除存储过程:drop procedure proc_name;

    执行存储过程:

    --无参数callproc_name()--有参数,全incallproc_name(1,2)--有参数,有in,out,inoutset@t1=0;set@t2=3;callproc_name(1,2,@t1,@t2)

    函数

    MySql中的函数分为:内置函数、自定义函数

    内置函数参考:

    http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/functions.html#encryption-functions

    自定义函数:

    delimiter\\createfunctionf1(i1int,i2int)returnsintBEGINdeclarenumint;setnum=i1+i2;return(num);END\\delimiter;