MySQL命令的执行流程,如下图:
如果我们将上述过程简化一下,省略掉其中的语法分析和编译这2个环节,MySQL的执行效率就可以提高。
本文介绍的存储过程可以实现上述任务。。。
存储过程是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理。
存储过程存储在数据库内,可以由应用程序调用执行;允许用户声明变量,以及进行流程控制;
存储过程可以接收输入类型的参数,也可以接收输出类型的参数;可以存在多个返回值!
存储过程的效率比单一的SQL语句的效率高。如果我们写了2个SQL语句,MySQL引擎对这2个SQL语句逐一的进行语法分析,
逐一的进行编译,最后,逐一的执行。如果采用存储过程,第一次调用的时候会进行语法分析和编译,以后客户端再进行
调用的时候,直接调用第一次编译的结果就可以了,省略了语法分析和编译这2个环节,效率自然就提高了。
存储过程的优点,如下图:
存储过程语法结构解析
创建存储过程语法,如下图:
[DEFINER={user|CURRENT_USER}] DEFINER是创建者,若省略了这句话,默认的创建者是当前登录到MySQL客户端的用户。
sp_name指的是存储过程的名字。存储过程可以带0个,1个,或多个参数。
参数的前面可以有3个可选的选项,如下图:
存储过程的特性,如下图:
关于过程体的几点说明,如下图:
创建不带参数的存储过程
mysql> CREATE PROCEDURE sp1() SELECT VERSION();#创建不带参数的存储过程
Query OK, 0 rows affected (0.07 sec)
调用存储过程,如下图:
mysql> CALL sp1();#调用存储过程
+-----------+
| VERSION() |
+-----------+
| 5.5.37 |
+-----------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.02 sec)
mysql> CALL sp1;#如果存储过程不带参数,调用时可以省略小括号。
+-----------+
| VERSION() |
+-----------+
| 5.5.37 |
+-----------+
1 row in set (0.00 sec)
创建带有IN类型参数的存储过程
mysql> CREATE TABLE users(
-> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
-> username VARCHAR(20) NOT NULL,
-> password VARCHAR(32) NOT NULL,
-> age TINYINT(3) UNSIGNED NOT NULL,
-> sex TINYINT NOT NULL
-> );
Query OK, 0 rows affected (0.16 sec)
mysql> DESC users;
+----------+----------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------------------+------+-----+---------+----------------+