|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
MySQL的低成本来自于其简单性吗?它的普及性是由于其低成本吗?其实,在MySQL的最“好”与最“不好”的功能之间没有明显的分界线,但它们组合在一起就形成了一副让我们欣赏的作品。从MySQL5.0入手下手,撑持了一个全新的SQL句法:<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">PREPAREstmt_nameFROMpreparable_stmt;<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">EXECUTEstmt_name[USING@var_name[,@var_name]...];<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">{DEALLOCATE|DROP}PREPAREstmt_name;<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">经由过程它,我们就能够完成相似MSSQL的sp_executesql实行静态SQL语句!<Pstyle="TEXT-INDENT:2em">同时也能够避免注进式打击!<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">为了有一个理性的熟悉,<Pstyle="TEXT-INDENT:2em">上面先给几个小例子:<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">mysql>PREPAREstmt1FROMSELECTSQRT(POW(?,2)+POW(?,2))AShypotenuse;<Pstyle="TEXT-INDENT:2em">mysql>SET@a=3;<Pstyle="TEXT-INDENT:2em">mysql>SET@b=4;<Pstyle="TEXT-INDENT:2em">mysql>EXECUTEstmt1USING@a,@b;<Pstyle="TEXT-INDENT:2em">+------------+<Pstyle="TEXT-INDENT:2em">|hypotenuse|<Pstyle="TEXT-INDENT:2em">+------------+<Pstyle="TEXT-INDENT:2em">|5|<Pstyle="TEXT-INDENT:2em">+------------+<Pstyle="TEXT-INDENT:2em">mysql>DEALLOCATEPREPAREstmt1;<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">mysql>SET@s=SELECTSQRT(POW(?,2)+POW(?,2))AShypotenuse;<Pstyle="TEXT-INDENT:2em">mysql>PREPAREstmt2FROM@s;<Pstyle="TEXT-INDENT:2em">mysql>SET@a=6;<Pstyle="TEXT-INDENT:2em">mysql>SET@b=8;<Pstyle="TEXT-INDENT:2em">mysql>EXECUTEstmt2USING@a,@b;<Pstyle="TEXT-INDENT:2em">+------------+<Pstyle="TEXT-INDENT:2em">|hypotenuse|<Pstyle="TEXT-INDENT:2em">+------------+<Pstyle="TEXT-INDENT:2em">|10|<Pstyle="TEXT-INDENT:2em">+------------+<Pstyle="TEXT-INDENT:2em">mysql>DEALLOCATEPREPAREstmt2;<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">假如你的MySQL版本是5.0.7大概更高的,你还能够在LIMIT子句中利用它,示比方下:mysql>SET@a=1;mysql>PREPARESTMTFROM"SELECT*FROMtblLIMIT?";<Pstyle="TEXT-INDENT:2em">mysql>EXECUTESTMTUSING@a;<Pstyle="TEXT-INDENT:2em">mysql>SET@skip=1;SET@numrows=5;<Pstyle="TEXT-INDENT:2em">mysql>PREPARESTMTFROM"SELECT*FROMtblLIMIT?,?";<Pstyle="TEXT-INDENT:2em">mysql>EXECUTESTMTUSING@skip,@numrows;利用PREPARE的几个注重点:<Pstyle="TEXT-INDENT:2em">A:PREPAREstmt_nameFROMpreparable_stmt;<Pstyle="TEXT-INDENT:2em">预界说一个语句,并将它赋给stmt_name,stmt_name是不辨别巨细写的。<Pstyle="TEXT-INDENT:2em">B:即便preparable_stmt语句中的?所代表的是一个字符串,你也不必要将?用引号包括起来。<Pstyle="TEXT-INDENT:2em">C:假如新的PREPARE语句利用了一个已存在的stmt_name,那末原本的将被当即开释!即便这个新的PREPARE语句由于毛病而不克不及被准确实行。<Pstyle="TEXT-INDENT:2em">D:PREPAREstmt_name的感化域是以后客户端毗连会话可见。<Pstyle="TEXT-INDENT:2em">E:要开释一个预界说语句的资本,可使用DEALLOCATEPREPARE句法。<Pstyle="TEXT-INDENT:2em">F:EXECUTEstmt_name句法中,假如stmt_name不存在,将会激发一个毛病。<Pstyle="TEXT-INDENT:2em">G:假如在停止客户端毗连会话时,没有显式地挪用DEALLOCATEPREPARE句法开释资本,服务器端会本人动开释它。<Pstyle="TEXT-INDENT:2em">H:在预界说语句中,CREATETABLE,DELETE,DO,INSERT,REPLACE,SELECT,SET,UPDATE,和年夜部分的SHOW句法被撑持。G:PREPARE语句不成以用于存储历程,自界说函数!但从MySQL5.0.13入手下手,它能够被用于存储历程,仍不撑持在函数中利用!上面给个示例:CREATEPROCEDURE`p1`(INidINTUNSIGNED,INnameVARCHAR(11))BEGINlable_exit:BEGINSET@SqlCmd=SELECT*FROMtA;IFidISNOTNULLTHENSET@SqlCmd=CONCAT(@SqlCmd,WHEREid=?);PREPAREstmtFROM@SqlCmd;SET@a=id;EXECUTEstmtUSING@a;LEAVElable_exit;ENDIF;IFnameISNOTNULLTHENSET@SqlCmd=CONCAT(@SqlCmd,WHEREnameLIKE?);PREPAREstmtFROM@SqlCmd;SET@a=CONCAT(name,%);EXECUTEstmtUSING@a;LEAVElable_exit;ENDIF;ENDlable_exit;END;CALL`p1`(1,NULL);CALL`p1`(NULL,QQ);DROPPROCEDURE`p1`;
如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。 |
|