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 = ’h’then
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說明F是16進位制數值,第三個引數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之間的隨機小數;