天天看點

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