视图
视图是一个虚拟表(非真实存在),其本质是【根据SQL语句获取动态的数据集,并为其命名】,用户使用时只需使用【名称】即可获取结果集,并可以将其当作表来使用。
创建视图:
<code>create</code> <code>view</code> <code>v1 </code><code>as</code>
<code>select</code> <code>* </code><code>from</code> <code>student </code><code>where</code> <code>id > 100;</code>
今后可以直接通过:
<code>select</code> <code>* </code><code>from</code> <code>v1; #直接访问学生ID大于100的信息</code>
删除视图:
<code>drop</code> <code>view</code> <code>v1;</code>
修改视图:
<code>alter</code> <code>view</code> <code>v1 </code><code>as</code>
<code>select</code> <code>id,</code><code>name</code> <code>from</code> <code>student </code><code>where</code> <code>id<10 </code><code>and</code> <code>name</code><code>=dandan;</code>
注意:使用视图时,将其当作表进行操作即可,由于视图是虚拟表,所以使用其对真实表进行创建、更新和删除操作,仅能做查询用。
触发器
对某个表进行【增/删/改】操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行【增/删/改】前后的行为。
创建触发器:
<code>delimiter //</code>
<code>create</code> <code>trigger</code> <code>tg_before_insert_student before </code><code>insert</code> <code>on</code> <code>student </code><code>for</code> <code>each row</code>
<code>begin</code>
<code> </code><code>if new.</code><code>name</code><code>==</code><code>'alex'</code> <code>then</code>
<code> </code><code>insert</code> <code>into</code> <code>student_back (</code><code>name</code><code>) </code><code>values</code> <code>(</code><code>'alex_back'</code><code>);</code>
<code>end</code> <code>//</code>
<code>delimiter ;</code>
也可以用 after insert 表示插入之后执行触发器中语句,还有其他操作:before update、after update、before delete 、after delete
注意:NEW表示即将插入的数据行,OLD表示即将删除的数据行
删除触发器:drop tgigger tg_before_insert_student
触发器无法由用户直接调用,而知由于对表的【增/删/改】操作被动引发的。
存储过程
存储过程是一个SQL语句集合,当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行。
<code>-- 创建存储过程</code>
<code>create</code> <code>procedure</code> <code>p1()</code>
<code>BEGIN</code>
<code> </code><code>select</code> <code>* </code><code>from</code> <code>t1;</code>
<code>END</code><code>//</code>
<code>-- 执行存储过程</code>
<code>call p1()</code>
对于存储过程,可以接受参数,其参数类型有三类:
in 只用于传入参数
out 用于返回值
inout 即可以传入又可以当作返回值
有参数的存储过程:
<code>delimiter \\</code>
<code>create</code> <code>procedure</code> <code>p1(</code>
<code> </code><code>in</code> <code>i1 </code><code>int</code><code>,</code>
<code> </code><code>in</code> <code>i2 </code><code>int</code><code>,</code>
<code> </code><code>inout i3 </code><code>int</code><code>,</code>
<code> </code><code>out</code> <code>r1 </code><code>int</code>
<code>)</code>
<code> </code><code>DECLARE</code> <code>temp1 </code><code>int</code><code>;</code>
<code> </code><code>DECLARE</code> <code>temp2 </code><code>int</code> <code>default</code> <code>0;</code>
<code> </code>
<code> </code><code>set</code> <code>temp1 = 1;</code>
<code> </code><code>set</code> <code>r1 = i1 + i2 + temp1 + temp2;</code>
<code> </code><code>set</code> <code>i3 = i3 + 100;</code>
<code>end</code><code>\\</code>
<code>set</code> <code>@t1 =4;</code>
<code>set</code> <code>@t2 = 0;</code>
<code>CALL p1 (1, 2 ,@t1, @t2);</code>
<code>SELECT</code> <code>@t1,@t2;</code>
结果集加返回值:
<code> </code><code>create</code> <code>procedure</code> <code>p2(</code>
<code> </code><code>in</code> <code>n1 </code><code>int</code><code>,</code>
<code> </code><code>inout n3 </code><code>int</code><code>,</code>
<code> </code><code>out</code> <code>n2 </code><code>int</code><code>,</code>
<code> </code><code>)</code>
<code> </code><code>begin</code>
<code> </code><code>declare</code> <code>temp1 </code><code>int</code> <code>;</code>
<code> </code><code>declare</code> <code>temp2 </code><code>int</code> <code>default</code> <code>0;</code>
<code> </code><code>select</code> <code>* </code><code>from</code> <code>v1;</code>
<code> </code><code>set</code> <code>n2 = n1 + 100;</code>
<code> </code><code>set</code> <code>n3 = n3 + n1 + 100;</code>
<code> </code><code>end</code> <code>//</code>
<code> </code><code>delimiter ;</code>
事务型存储过程:
<code> </code><code>create</code> <code>PROCEDURE</code> <code>p1(</code>
<code> </code><code>OUT</code> <code>p_return_code tinyint</code>
<code> </code><code>)</code>
<code> </code><code>BEGIN</code>
<code> </code><code>DECLARE</code> <code>exit handler </code><code>for</code> <code>sqlexception </code>
<code> </code><code>BEGIN</code>
<code> </code><code>-- ERROR </code>
<code> </code><code>set</code> <code>p_return_code = 1; </code>
<code> </code><code>rollback</code><code>; </code>
<code> </code><code>END</code><code>; </code>
<code> </code>
<code> </code><code>DECLARE</code> <code>exit handler </code><code>for</code> <code>sqlwarning </code>
<code> </code><code>-- WARNING </code>
<code> </code><code>set</code> <code>p_return_code = 2; </code>
<code> </code><code>START </code><code>TRANSACTION</code><code>; </code>
<code> </code><code>DELETE</code> <code>from</code> <code>tb1;</code>
<code> </code><code>insert</code> <code>into</code> <code>tb2(</code><code>name</code><code>)</code><code>values</code><code>(</code><code>'seven'</code><code>);</code>
<code> </code><code>COMMIT</code><code>; </code>
<code> </code><code>-- SUCCESS </code>
<code> </code><code>set</code> <code>p_return_code = 0; </code>
<code> </code><code>END</code><code>\\</code>
游标:
<code> </code><code>create</code> <code>procedure</code> <code>p3()</code>
<code> </code><code>begin</code>
<code> </code><code>declare</code> <code>ssid </code><code>int</code><code>; </code><code>-- 自定义变量1 </code>
<code> </code><code>declare</code> <code>ssname </code><code>varchar</code><code>(50); </code><code>-- 自定义变量2 </code>
<code> </code><code>DECLARE</code> <code>done </code><code>INT</code> <code>DEFAULT</code> <code>FALSE</code><code>;</code>
<code> </code><code>DECLARE</code> <code>my_cursor </code><code>CURSOR</code> <code>FOR</code> <code>select</code> <code>sid,sname </code><code>from</code> <code>student;</code>
<code> </code><code>DECLARE</code> <code>CONTINUE</code> <code>HANDLER </code><code>FOR</code> <code>NOT</code> <code>FOUND </code><code>SET</code> <code>done = </code><code>TRUE</code><code>;</code>
<code> </code>
<code> </code><code>open</code> <code>my_cursor;</code>
<code> </code><code>xxoo: LOOP</code>
<code> </code><code>fetch</code> <code>my_cursor </code><code>into</code> <code>ssid,ssname;</code>
<code> </code><code>if done </code><code>then</code>
<code> </code><code>leave xxoo;</code>
<code> </code><code>END</code> <code>IF;</code>
<code> </code><code>insert</code> <code>into</code> <code>teacher(tname) </code><code>values</code><code>(ssname);</code>
<code> </code><code>end</code> <code>loop xxoo;</code>
<code> </code><code>close</code> <code>my_cursor;</code>
<code> </code><code>end</code> <code>//</code>
<code> </code><code>delimter ;</code>
动态执行SQL:
<code> </code><code>CREATE</code> <code>PROCEDURE</code> <code>p4 (</code>
<code> </code><code>in</code> <code>nid </code><code>int</code>
<code> </code><code>BEGIN</code>
<code> </code><code>PREPARE</code> <code>prod </code><code>FROM</code> <code>'select * from student where sid > ?'</code><code>;</code>
<code> </code><code>EXECUTE</code> <code>prod USING @nid;</code>
<code> </code><code>DEALLOCATE</code> <code>prepare</code> <code>prod; </code>
<code> </code><code>END</code><code>\\</code>
删除存储过程:drop procedure proc_name;
执行存储过程:
<code>-- 无参数</code>
<code>call proc_name()</code>
<code>-- 有参数,全in</code>
<code>call proc_name(1,2)</code>
<code>-- 有参数,有in,out,inout</code>
<code>set</code> <code>@t1=0;</code>
<code>set</code> <code>@t2=3;</code>
<code>call proc_name(1,2,@t1,@t2)</code>
函数
MySql中的函数分为:内置函数、自定义函数
内置函数参考:
http://doc.mysql.cn/mysql5/refman-5.1-zh.html-chapter/functions.html#encryption-functions
自定义函数:
<code>create</code> <code>function</code> <code>f1(</code>
<code> </code><code>i1 </code><code>int</code><code>,</code>
<code> </code><code>i2 </code><code>int</code><code>)</code>
<code>returns</code> <code>int</code>
<code> </code><code>declare</code> <code>num </code><code>int</code><code>;</code>
<code> </code><code>set</code> <code>num = i1 + i2;</code>
<code> </code><code>return</code><code>(num);</code>
<code>END</code> <code>\\</code>
本文转自 AltBoy 51CTO博客,原文链接:http://blog.51cto.com/altboy/1934258