1. 程式人生 > 其它 >MySQL資料庫之——高階SQL語句(三)正則表示式和儲存過程

MySQL資料庫之——高階SQL語句(三)正則表示式和儲存過程

一、正則表示式(REGEXP)

1、正則表示式匹配符

字元 解釋 舉例
^ 匹配文字的開始字元 ' ^aa' 匹配以aa開頭的字串
$ 匹配文字的結束字元 ' aa$' 匹配以aa結尾的字串
. 匹配任何單個字元 ' a.b'匹配任何a和b之間有一個字元的字串
* 匹配零個或多個在它前面的字元 ' ab*c' 匹配c前面有任意個b
+ 匹配前面的字元1次或多次 ' ab +' 匹配以a開頭,後面至少一個b的字串
字串 匹配包含指定的字串 'aa' 匹配含有aa 的字串
a1 | a2 匹配a1 或a2 'aa | bb' 匹配aa或者bb
[...] 匹配字元集合中的任意一個字元 '[abc]' 匹配a或者b或者c
[^...] 匹配不在括號中的任何字元 '[^ab]'匹配不包含a或者b的字串
{2} 匹配前面的字串n次 'a{2}'匹配含有2個a的字串
{a,b} 匹配前面的字串至少n次,至多m次 'f{1,3}'匹配f最少1次,最多3次

2、語法

SELECT 選項 FROM 表名 WHERE 選項 REGEXP (模式)

select * from test1 where name regexp 'cy';
select * from test1 where age regexp '1$';
select * from test1 where
age regexp '20|23'; select * from test1 where name regexp '^n|^k';

三、儲存過程

1、概述

儲存過程是一組為了完成特定功能的SQL語句集合

儲存過程在使用過程中是將常用或者複雜的工作預先使用 SQL 語句寫好並用一個指定的名稱儲存起來,這個過程經編譯和優化後儲存在資料庫伺服器中,當需要使用時,只需要呼叫即可

儲存過程在執行上比傳統SQL速度更快、執行效率更高。

2、優點

執行一次後,會將生成的二進位制程式碼駐留緩衝區,提高執行效率

SQL語句加上控制語句的集合,靈活性高

在伺服器端儲存,客戶端呼叫時,降低網路負載

可多次重複被呼叫,可隨時修改,不影響客戶端呼叫

可完成所有的資料庫操作,也可控制資料庫的資訊訪問許可權

3、建立、呼叫、檢視和刪除儲存過程

3.1 建立儲存過程

DELIMITER ##                                            #將語句的結束符號從分號;臨時改為兩個$$ (可以是自定義)
CREATE PROCEDURE proc()                                         #建立儲存過程,過程名為Proc, 不帶引數
-> BEGIN                                     #過程體以關鍵字BEGIN開始
-> SELECT * FROM test5;                                              #過程體語句(自己根據需求進行編寫)
-> END ##                                        #過程體以關鍵字END結束
DELIMITER ;                                     #將語句的結束符號恢復為分號
mysql> delimiter ##
mysql> create procedure proc()
    -> begin
    -> insert into test5 values (4,'lucy',23,'');
    -> insert into test5 values (5,'jack',21,'');
    -> insert into test5 values (6,'nancy',22,'');
    -> select * from test5;
    -> end ##

3.2 呼叫儲存過程

CALL proc;

3.3 檢視儲存過程

SHOW CREATE PROCEDURE [資料庫.] 儲存過程名;         #檢視某個儲存過程的具體資訊(如果在指定庫中,庫名可以省略)
SHOW CREATE PROCEDURE bbc.proc;                 #未省略庫名
SHOW CREATE PROCEDURE proc;                 #省略庫名
 
SHOW PROCEDURE STATUS [LIKE '%proc%'] \G                #豎列檢視
方法一:
show create procedure proc;
show create procedure proc\G;
方法二:
show procedure status like '%proc%';
show procedure status like '%proc%'\G;

3.4 儲存過程的引數

IN 輸入引數

  • 表示呼叫者向過程傳入值(傳入值可以使字面量或變數)

OUT 輸出引數

  • 表示過程向呼叫者傳出值(可以返回多個值)(傳出值只能是變數)

INOUT 輸入輸出引數

  • 即表示呼叫者向過程傳入值,又表示過程向呼叫者傳出值(值只能是變數)
mysql> delimiter $$
mysql> create procedure proc1(in iage int)
    -> begin
    -> select * from test5 where age > iage ;
    -> end $$
Query OK, 0 rows affected (0.00 sec)
 
mysql> delimiter ;
mysql> call proc1(21);
//因為out是向呼叫者輸出引數,不接收輸入的引數,所以儲存過程裡的num為null
mysql> delimiter ##
mysql> create procedure proc2(out num int)
    -> begin
    -> select num;
    -> set num=6;
    -> select num;
    -> end ##
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> set @num=1;
Query OK, 0 rows affected (0.00 sec)
 
mysql> call proc2(@num);
+------+
| num  |
+------+
| NULL |
+------+
1 row in set (0.00 sec)
 
+------+
| num  |
+------+
|    6 |
+------+
1 row in set (0.00 sec)
 
Query OK, 0 rows affected (0.00 sec)
 
mysql> select @num;
+------+
| @num |
+------+
|    6 |
+------+
1 row in set (0.00 sec)  

呼叫了proc2儲存過程,輸出引數,改變了num變數的值

mysql> delimiter ##
mysql> create procedure proc3 (inout num int)
    -> begin
    -> select num;
    -> set num=6;
    -> select num;
    -> end ##
Query OK, 0 rows affected (0.00 sec)
 
mysql> delimiter ;
mysql> set @num=1;
Query OK, 0 rows affected (0.00 sec)
 
mysql> call proc3(@num);
+------+
| num  |
+------+
|    1 |
+------+
1 row in set (0.00 sec)
 
+------+
| num  |
+------+
|    6 |
+------+
1 row in set (0.00 sec)
 
Query OK, 0 rows affected (0.00 sec)
 
mysql> select @num;
+------+
| @num |
+------+
|    6 |
+------+
1 row in set (0.00 sec)

呼叫了proc3儲存過程,接受了輸入的引數,也輸出引數,改變了變數

3.5 刪除儲存過程

儲存過程內容的修改方法是通過刪除原有儲存過程之後以相同名稱建立新的儲存過程

DROP PROCEDURE IF EXISTS proc1;

4、儲存過程的控制語句

4.1 條件控制語句 if-then-else ... end if

mysql> delimiter ##                                #修改預設結束符為##
mysql> create procedure proc1(in iage int)         #建立儲存過程proc1,引數為iage,資料型別為int
    -> begin                                       #過程體以關鍵詞begin開始
    -> declare var int;                            #定義變數var為int型別
    -> set var=iage*2;                             #設定變數var等於傳入引數的2倍
    -> if var >=20 then                            #如果var大於等於20,則執行下面的過程體
    -> update test5 set age=age+1;                 #設定test5中的age+1
    -> else                                        #如果變數var不大於10,則執行下面過程體
    -> update test5 set age=age-1;                 #設定表test5中的age-1
    -> end if;                                     #結束if語句
    -> end ##                                      #結束建立儲存過程
Query OK, 0 rows affected (0.00 sec)
 
mysql> delimiter ;                                 #重新修改預設結束符為原來的;
mysql> call proc1(10);                             #呼叫proc1的儲存過程,並傳入引數10
Query OK, 6 rows affected (0.00 sec)

4.2 迴圈語句 while ... end while

mysql> delimiter ##                       #修改預設結束符為##
mysql> create procedure proc4()           #建立儲存過程為proc4
    -> begin                              #過程體以關鍵字begin開始
    -> declare var int;                   #定義變數var為int型別
    -> set var=0;                         #設定var=0
    -> while var <10 do                   #使用while迴圈,var要小於10
    -> insert into test2(id) values(var); #滿足條件則進行新增資料,內容為變數var
    -> set var=var+1;                     #變數var每次迴圈後加1
    -> end while;                         #結束while迴圈
    -> end ##                             #結束建立儲存過程
Query OK, 0 rows affected (0.00 sec)
 
mysql> delimiter ;                        #重新修改預設結束符為原來的;
mysql> call proc4;                        #呼叫proc4儲存過程
Query OK, 1 row affected (0.01 sec)