【MySQL】MySQL函數、自定義函數、存儲過程

Mysql運算符和函數

字符函數



刪除指定字符串

刪除前指定字符串


刪除後續的


刪除前後的


字符串替換


截取字符串,mysql中字符從1開始


查詢包含%的字串


_下劃線代表任意一個字符

數值運算符和函數



日期時間函數



日期格式化

SELECT DATE_FORMAT('2014-3-2','%m/%d/%Y');

信息函數


聚合函數


加密函數


自定義函數(UDF,user-defined function)

CREATE FUNCTION function_name

RETURNS

{STRING | INTEGER | REAL | DECIMAL}

Routine_body

 

關於函數體

1.      函數體由合法的SQL語句組成;

2.      函數體可以是簡單的SELECT或INSERT語句;

3.      函數體如果爲複合結構則使用BEGIN … END 語句;

4.      複合結構可以包含聲明,循環,控制結構;

 

例1:創建不帶參數的自定義函數(格式化當前日期)

CREATE FUNCTION f1()

RETURNS VARCHAR(30)

RETURN DATE_FORMAT(NOW(),'%Y年%m月%d日 %H點:%i分:%s秒');


例2: 創建帶有參數的函數(求兩個數的平均值)

CREATE FUNCTION f2(num1 SMALLINTUNSIGNED,num2 SMALLINT UNSIGNED)

RETURNS FLOAT(10,2) UNSIGNED

RETURN (num1+num2)/2;


例3:創建具有複合結構函數體的自定義函數(向數據表插入一條數據)複合結構的函數體要包含在BEGIN END 中間

Tip : DELIMITER // 設置mysql的結束符,這裏設置爲兩條斜線結束。

 

CREATE FUNCTION addpname(pname VARCHAR(20))

RETURNS INT UNSIGNED

BEGIN

INSERT province(pname) VALUES(pname);

RETURN LAST_INSERT_ID();

END

//


刪除函數

DROP FUNCTION [IFEXISTS] function_name

 

存儲過程

 

SQL命令 –》MySQL引擎分析-》語法正確-》執行可識別命令-》執行結果-》客戶端

 

存儲過程是SQL語句與控制語句的預編譯集合(只在第一次編譯),以一個名稱存儲並作爲一個單元處理。

1.      增強了SQL語句的功能和靈活性

2.      實現了較快的速度。

3.      減少了網絡流量。

 

創建存儲過程

CREATE

[DEFINED = {user| CURRENT_USER}]

PROCEDUREsp_name([proc_parameter[,…]])

[characteristic …]routine_body

Proc_parameter:

[IN | OUT |INOUT] param_name type

 

參數

IN,表示該參數的值必須在調用存儲過程時指定。

OUT,表示該參數的值可以被存儲過程改變,並且可以返回。

INOUT,表示該參數調用時指定,並且可以被改變和返回。

過程體

         過程體由合法的SQL語句構成。

         過程體可以是任意SQL語句。

         過程體如果爲複合結構則使用BEGIN…END 語句。

         複合結構可以包含聲明,循環,控制結構。

 

例1:創建不帶參數的存儲過程

CREATE PROCEDURE sql()

SELECT VERSION();


例2:帶有IN 類型參數的存儲過程

CREATE PROCEDUREremoveById(IN p_id INT UNSIGNED)

BEGIN

DELETE FROMprovince WHERE id = p_id;

END

//

刪除存儲過程

DROP PROCEDUREprocedure_name

 

例3:創建帶有IN 和OUT 類型的參數的存儲過程

這個存儲過程可以刪除指定id的數據並且返回剩下的總數

CREATE PROCEDUREremoveUserAndReturnUserNums(

IN p_id INTUNSIGNED ,OUT userNums INT UNSIGNED)

BEGIN

DELETE FROMcounty WHERE id=p_id;

SELECT count(id)FROM county INTO userNums;

END

//


1.    用戶變量:以"@"開始,形式爲"@變量名"
用戶變量跟mysql客戶端是綁定的,設置的變量,只對當前用戶使用的客戶端生

2.    全局變量:定義時,以如下兩種形式出現,set GLOBAL 變量名  或者  set @@global.變量名
對所有客戶端生效。只有具有super權限纔可以設置全局變量

3.    會話變量:只對連接的客戶端有效。

4.    局部變量:作用範圍在beginend語句塊之間。在該語句塊裏設置的變量
declare
語句專門用於定義局部變量。set語句是設置不同類型的變量,包括會話變量和全局變量


例4:創建帶有多個OUT類型參數的存儲過程

 

ROW_COUNT(); 增加或刪除的數量表示最後一次操作的數量

 

刪除一個表的數據,並返回刪除了幾條,還剩下幾條數據。

CREATE PROCEDURE removeUserByAgeAndReturnInfos(

IN p_age SMALLINT,

OUT deleteUsers SMALLINT UNSIGNED,

OUT userCounts SMALLINT UNSIGNED)

BEGIN

DELETE FROM  user WHEREage=p_age;

SELECT ROW_COUNT() INTO deleteUsers;

SELECT COUNT(id) FROM user INTO userCounts;

END

//


存儲過程與自定義函數的區別

1.      存儲過程實現的功能要複雜一些;而函數的針對性更強。

2.      存儲過程可以返回多個值;函數只能有一個返回值。

3.      存儲過程一般獨立的來執行;而函數可以作爲其他SQL語句的組成部分來出現。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章