社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

MySQL入门系列:存储程序(一)之自定义变量简介

小孩子4919 • 6 年前 • 446 次点击  
阅读 29

MySQL入门系列:存储程序(一)之自定义变量简介

存储程序

有时候为了完成一个常用的功能需要执行许多条语句,每次都在客户端里一条一条的去输入这么多语句是很烦的,我们希望有一种批处理的形式,让我们以很简单的方式一次性的执行完这些语句,MySQL中的存储程序本质上封装了一些可执行的语句,然后给用户提供一种简单的调用方式来执行这些语句,根据调用方式的不同,我们可以把存储程序分为存储例程触发器事件这几种类型。其中,存储例程又可以被细分为存储函数存储过程。我们画个图表示一下:

![image_1c84n8aqm1snl1iql9eb1tpa6v19.png-29.4kB][1]

在正式介绍存储程序之前,我们需要先了解一下MySQL中的自定义变量和复合语句的概念。

自定义变量简介

变量是和常量相对的,一般的程序语言都提供对变量的支持,MySQL中对我们自定义的变量的命名有个要求,那就是变量名称前必须加一个@符号。我们自定义变量的值的类型可以是任意MySQL支持的类型,比方说我们来自定义一个变量:

mysql> SET @a = 1;
Query OK, 0 rows affected (0.00 sec)

mysql>
复制代码

我们自定义了一个名叫a的变量,并且把整数1赋值给这个变量。如果我们想查看这个变量的值的话,使用SELECT语句就好了,不过仍然需要在变量名称加一个@符号

mysql> SELECT @a;
+------+
| @a   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql>
复制代码

同一个变量也可以存储存储不同类型的值,比方说我们再把一个字符串值赋值给变量a

mysql> SET @a = '哈哈哈';
Query OK, 0 rows affected (0.00 sec)

mysql>
复制代码

除了把一个常量赋值给一个变量以外,我们还可以把一个变量赋值给另一个变量:

mysql> SET @b = @a;
Query OK, 0 rows affected (0.00 sec)

mysql> select @b;
+-----------+
| @b        |
+-----------+
| 哈哈哈    |
+-----------+
1 row in set (0.00 sec)

mysql>
复制代码

这样变量ab就有了相同的值'哇哈哈'

我们还可以将某个查询的结果赋值给一个变量,前提是这个查询的结果只有一个值

mysql> SET @a = (SELECT m1 FROM t1 LIMIT 1);
Query OK, 0 rows affected (0.00 sec)

mysql>
复制代码

还可以用另一种形式的语句来将查询的结果赋值给一个变量:

mysql> SELECT n1 FROM t1 LIMIT 1 INTO @b;
Query OK, 1 row affected (0.00 sec)

mysql>
复制代码

因为语句SELECT m1 FROM t1 LIMIT 1SELECT n1 FROM t1 LIMIT 1的查询结果都只有一个值,所以它们可以直接赋值给变量a或者b。我们查看一下这两个变量的值:

mysql> SELECT @a, @b;
+------+------+
| @a   | @b   |
+------+------+
|    1 | a    |
+------+------+
1 row in set (0.00 sec)

mysql>
复制代码

如果我们的查询结果是一条记录,该记录中有多个列的值的话,我们想把这几个值分别赋值到不同的变量中,只能使用INTO语句了:

mysql> SELECT m1, n1 FROM t1 LIMIT 1 INTO @a, @b;
Query OK, 1 row affected (0.00 sec)

mysql>
复制代码

这条查询语句只得到一条记录,我们把这条记录的m1列的值赋值到了变量a中,m2列的值赋值到了变量b中。

复合语句

MySQL客户端的交互界面处,当我们完成键盘输入并按下回车键时,MySQL客户端会检测我们输入的内容中是否包含;\g或者\G这三个符号之一,如果有的话,会把我们输入的内容发送到服务器。这样一来,如果我们想给服务器发送复合语句(也就是由一条或多条语句组成的语句)的话,就需要把这些语句写到一行中,比如这样:

mysql> SELECT * FROM t1 LIMIT 1;SELECT * FROM t2 LIMIT 1;SELECT * FROM t3 LIMIT 1;
+------+------+
| m1   | n1   |
+------+------+
|    1 | a    |
+------+------+
1 row in set (0.00 sec)

+------+------+
| m2   | n2   |
+------+------+
|    2 | b    |
+------+------+
1 row in set (0.00 sec)

+------+------+
| m3   | n3   |
+------+------+
|    3 | c    |
+------+------+
1 row in set (0.00 sec)

mysql>
复制代码

造成这一不便的原因在于,MySQL客户端检测输入结束用的符号和分隔各个语句的符号是一样的!其实我们也可以用delimiter命令来自定义MySQL的检测输入结束的符号,比如这样:

mysql> delimiter $
mysql> SELECT * FROM t1 LIMIT 1;
    -> SELECT * FROM t2 LIMIT 1;
    -> SELECT * FROM t3 LIMIT 1;
    -> $
+------+------+
| m1   | n1   |
+------+------+
|    1 | a    |
+------+------+
1 row in set (0.00 sec)

+------+------+
| m2   | n2   |
+------+------+
|    2 | b    |
+------+------+
1 row in set (0.00 sec)

+------+------+
| m3   | n3   |
+------+------+
|    3 | c    |
+------+------+
1 row in set (0.00 sec)

mysql>
复制代码

delimiter $命令意味着修改MySQL客户端检测输入结束的符号为$,所以虽然我们连续输入了3个以分号;结尾的查询语句并且按了回车键,输入的内容并没有被提交,直到敲下$符号并回车,MySQL客户端才会将我们输入的内容提交到服务器,此时我们输入的内容里已经有3个独立的查询语句了,所以返回了3个结果集。

我们可以使用任何符号来作为MySQL客户端检测输入结束的符号,也包括多个字符,比如这样:

mysql> delimiter EOF
mysql> SELECT * FROM t1 LIMIT 1;
    -> SELECT * FROM t2 LIMIT 1;
    -> SELECT * FROM t3 LIMIT 1;
    -> EOF
+------+------+
| m1   | n1   |
+------+------+
|    1 | a    |
+------+------+
1 row in set (0.00 sec)

+------+------+
| m2   | n2   |
+------+------+
|    2 | b    |
+------+------+
1 row in set (0.00 sec)

+------+------+
| m3   | n3   |
+------+------+
|    3 | c    |
+------+------+
1 row in set (0.00 sec)

mysql>
复制代码

我们这里采用了EOF作为MySQL客户端检测输入结束的符号,是不是很easy啊!当然,这个只是为了方便我们一次性输入多个语句,在输入完成之后最好还是改回我们常用的分号;吧:

mysql> delimiter ;
复制代码

小册

本系列专栏都是MySQL入门知识,想看进阶知识可以到小册中查看:MySQL是怎样运行的链接 。小册的内容主要是从小白的角度出发,用比较通俗的语言讲解关于MySQL进阶的一些核心概念,比如记录、索引、页面、表空间、查询优化、事务和锁等,总共的字数大约是三四十万字,配有上百幅原创插图。主要是想降低普通程序员学习MySQL进阶的难度,让学习曲线更平滑一点~

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/30172
 
446 次点击