視圖
視圖是一個虛拟表(非真實存在),其本質是【根據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