天天看点

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

视图

视图是一个虚拟表(非真实存在),其本质是【根据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 &gt; 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&lt;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 &gt; ?'</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