1. 程式人生 > >MySQL資料庫總結(13)儲存過程與函式

MySQL資料庫總結(13)儲存過程與函式

儲存過程:procedure

簡介

我們常用的操作資料庫語言SQL語句在執行的時候需要先編譯,然後執行

儲存過程是一組為了完成特定功能的SQL語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給定引數(如果該儲存過程帶有引數)來呼叫執行它。

一個儲存過程是一個可程式設計的函式,它在資料庫中建立並儲存。它可以有SQL語句和一些特殊的控制結構組成。當希望在不同的應用程式或平臺上執行相同的函式,或者封裝特定功能時,儲存過程是非常有用的。資料庫中的儲存過程可以看做是對程式設計中面向物件方法的模擬。它允許控制資料的訪問方式。

  • 儲存過程通常有以下優點:

    • (1).儲存過程增強了SQL語言的功能和靈活性。儲存過程可以用流控制語句編寫,有很強的靈活性,可以完成複雜的判斷和較複雜的運算。

    • (2).儲存過程被建立後,可以在程式中被多次呼叫,而不必重新編寫該儲存過程的SQL語句。而且資料庫專業人員可以隨時對儲存過程進行修改,對應用程式原始碼毫無影響。

    • (3).儲存過程能實現較快的執行速度。如果某一操作包含大量的Transaction-SQL程式碼或分別被多次執行,那麼儲存過程要比批處理的執行速度快很多。因為儲存過程是預編譯的。在首次執行一個儲存過程時查詢,優化器對其進行分析優化,並且給出最終被儲存在系統表中的執行計劃。而批處理的Transaction-SQL語句在每次執行時都要進行編譯和優化,速度相對要慢一些

    • (4).儲存過程能過減少網路流量。針對同一個資料庫物件的操作(如查詢、修改),如果這一操作所涉及的Transaction-SQL語句被組織程儲存過程,那麼當在客戶計算機上呼叫該儲存過程時,網路中傳送的只是該呼叫語句,從而大大減少了網路流量並降低了網路負載。

    • (5).儲存過程可被作為一種安全機制來充分利用。系統管理員通過執行某一儲存過程的許可權進行限制,能夠實現對相應的資料的訪問許可權的限制,避免了非授權使用者對資料的訪問,保證了資料的安全。

概念類似於函式,就是把一段程式碼封裝起來
當要執行這一段程式碼的時候,可以通過呼叫該儲存過程來實現
在封裝的語句體裡面,可以用if/else,case,while等控制結構

檢視現有的儲存過程

Show procedure status;

Show procedure status \G 橫著顯示

刪除儲存過程

Drop procedure 儲存過程的名字

呼叫儲存過程

call 儲存過程名字();

//第1個儲存過程,體會”封裝sql”
 Create procedure p1()
Begin
   Select * from g;
End$

//第2個儲存過程,體會”引數與控制結構”
Create procedure p2(n int)
Begin
    Select * from g where num > n;
End$

Create procedure p3(n int,j char(1))
Begin
    If j = ’hthen
Select * from g where num > n;
Else
Select * from g where num < n;
End if;
End$

//呼叫:
Call p3(10,’h’)$




//計算1---n的和
Create procedure p4(n smallint)
Begin
  Declare i int;
  Declare s int
  Set i = 1;
  Set s = 0;
Where  i <= n do
   Set s = s + i;
   Set i = i + 1;
End while;
End$

在mysql中,儲存過程和函式的區別,

1、名稱不同,函式的識別符號為FUNCTION,過程為:PROCEDURE

2、儲存過程的返回值,可以有多個值,函式的返回值,只有一個值

3、函式可以在select語句中直接使用,而過程不能,例如:假設已有函式fun_getAVG() 返回number型別絕對值。那麼select fun_getAVG(col_a) from table 這樣是可以的

————————————————————–

函式

字串相關函式

1 ASCII(String)

返回字串第一個字母的ASCII碼:

SELECT ASCII('A');
SELECT ASCII('AB');
//這兩條語句都是輸出65!

2 BIN(long)

返回整數的二進位制形式的字串

SELECT BIN(15);
 // 輸出1111

3 CHAR(int…)
將每個整型轉換成對應的字元

SELECT CHAR(65,66,67,68,69);
//輸出ABCDE
SELECT CHAR('65','66','67','68','69');
//引數為字串時,會被轉換成整型,然後再轉換成對應字元。

4 CHAR_LENGTH(String)

返回字串的長度!’中國’這個字串長度為2。’ab’長度為2!不分中英文!

SELECT CHAR_LENGTH('a中b國c');
  //輸出5

5 CHARACTER_LENGTH(String)

  與CHAR_LENGTH()完全相同!

6 CONCAT(String…)
將多個字串連線成一個字串

SELECT CONCAT('My', 'SQL');
  //輸出MySQL

7 CONCAT_WS(separator, String…)
使用第一個引數字串,把其他引數字串連線。

SELECT CONCAT_WS('-', 'A','B','C');
  //輸出A-B-C

8 CONV(int n, int radix1, int radix2)

把n從radix1進位制轉換成radix2進位制。

SELECT CONV('F', 16, 10);
  //一個引數F是一個數值,第二個引數16說明F16進位制數值,第三個引數10說明要把F轉換成10進位制,所以輸出15

9 ELT(N, str1, str2, str3…)

N是一個整數,若N為1,則返回str1,若N為2,則返回str2,以此類推

SELECT ELT(3, 'a', 'b', 'c', 'd', 'e');
  //輸出c

10 EXPORT_SET(int bits, String on, String off, Strring separator, int length)

bits是一個整數,把bits轉換成二進位制,其中1用on替換,0用off轉換,使用separator來連線每個二進位制位,length是指定從左到右顯示幾位。如果沒有指定length,那麼會在右邊補足到64位。

SELECT EXPORT_SET(13, 'a', 'b', '-', 4);
//輸出a-b-a-a,因為13的二進位制是1011,其中1用a替換,而0用b替換。
SELECT EXPORT_SET(13, 'a', 'b', '-', 3);
//輸出a-b-a
SELECT EXPORT_SET(13, 'a', 'b', '-', 10);
//輸出a-b-a-a-b-b-b-b-b-b,因為13只有4位,而length為10,那麼會在右邊補足到10位,都是用0補,所以才會多出來6個b。

流程控制函式

1 CASE value WHEN v1 THEN expr1 WHEN v2 THEN expr2 …. END
這種CASE WHEN THEN語句與Java中的switch語句基本相同:

SELECT CASE 3
WHEN 1 THEN 'a'
WHEN 2 THEN 'b'
WHEN 3 THEN 'c'
WHEN 4 THEN 'd'
END;

2 CASE WHEN condition THEN expr1 WHEN condition THEN expr2 … END
這種CASE WHEN THEN語句與Java中的多分支if/else if比較相似:

SELECT CASE
WHEN 1>2 THEN '1>2'
WHEN 1<2 THEN '1<2'
END;

3 IF(condition, expr1, expr1)
同時與Java中的if/else

SELECT
IF(1 > 0, '1>0', '1<0');

4 INNULL(expr1, expr2)
當expr1為NULL時,那麼函式返回expr2,否則返回expr1。

SELECT
IFNULL(NULL, 'hello');

SELECT
IFNULL('hello', 'world');

常用函式

1 時間日期相關函式

 CURRENT_DATE():輸出當前日期;
 CURRENT_TIME():輸出當前時間;
 CURRENT_TIMESTAMP():輸出當前日期和時間,即輸出當前時間戳;
 NOW():輸出當前日期和時間,與CURRENT_TIMESTAMP相同;

2 字串相關函式

 CONCAT(‘My’, ‘SQL’):輸出MySQL,即連線字串,引數可以是多個;
 CHAR_LENGTH(‘helloworld中’):輸出11,返回字串字元的個數;
 UCASE(‘hello’):輸出HELLO;
 LCASE(‘HELLO’):輸出hello;
 LEFT(‘helloworld’,5):輸出hello,輸出左邊5個字元;
 LENGTH(‘helloworld中’):輸出13,返回字串所佔位元組數。當然,如果client的字符集是gbk,那麼就輸出12了;
 STRCMP(‘zhan’, ‘zhao’):輸出-1,比較兩個字串的大小,如果前者大返回1,後者大返回-1,相等返回0;
 TRIM(’ hello ‘):輸出hello,去除左右邊空白;

3 數學運算相關函式

 ABS(-100):輸出100,求絕對值;
 BIN(15):輸出1111,即15的二進位制字串;
 FORMAT(1.23456, 3):輸出1.235,保留3位小數(四捨五入),如果整數部分大於3位會有逗號出現;
 HEX(15):輸出F,即出來16進製表示形式;
 MOD(10, 3):輸出1,即取餘運算;
 RAND():輸出0~1之間的隨機小數;