数据库原理与应用 第 15 章 · 第二节
课程 › 第 15 章 › 第二节 注释定界符与语句块会话变量局部变量系统变量 版式
第 15 章 存储过程与函数 · 第二节

注释、定界符、语句块与变量

编写存储程序的基本约定,用户会话变量、局部变量和系统变量
本 节 知 识 点
  1. 04注释
  2. 05定界符与语句块
  3. 06变量与用户会话变量
  4. 07局部变量
  5. 08系统变量
04
第 15 章 · 第二节 · 课件第 9、10、11 页合并重做

注释

三种注释符,-- 后面要有空格。

15.2 MySQL 编程基础课件第 9、10、11 页合并

注释

注释的作用
  • 对代码的功能和实现方法做简要的说明,便于维护
  • 把暂时不用的语句注释掉,使它们暂时不执行
三类注释符
注释符说明
--单行注释,到行尾结束。后面必须跟一个空格
#单行注释,到行尾结束
/* … */多行注释,/* 开始,*/ 结束
-- 这是一行注释
USE teaching;
SELECT * FROM s;   # 读出学生表 s 中的所有记录
/* 程序代码的功能是:
   打开数据库 teaching */

写成 --x 时 MySQL 不把它当作注释,而是当作两个减号,执行时会出错。

重 点

注释不执行,给读代码的人看。调试时也常把暂时不用的语句注释掉。

05
第 15 章 · 第二节 · 课件第 12、13 页合并重做

定界符与语句块

建存储过程前先改定界符,BEGIN … END 把语句括在一起。

15.2 MySQL 编程基础课件第 12、13 页合并

定界符与语句块

定界符 DELIMITER
  • MySQL 客户端默认以分号作为语句的结束符,遇到分号就把前面的内容作为一条语句执行
  • 存储过程中有多条语句,各以分号结束。不改定界符,建过程的语句会在第一个分号处被截断
  • DELIMITER $$ 把结束符改为 $$,也可以改为 // 等。建完后用 DELIMITER ; 改回
语句块 BEGIN … END
  • 由若干条语句组成,在逻辑上作为一个整体
  • BEGIN 和 END 是关键字,中间是语句列表
  • 只能用在存储过程、函数等存储程序中,不能单独执行
DELIMITER $$
CREATE PROCEDURE s_count()
BEGIN
  SELECT COUNT(*) FROM s;
END $$
DELIMITER ;

语句块不是事务,块中某条语句出错时,前面已经执行的语句不会撤销。要做到全部执行或全部不执行,要用第 9 章的事务。

试一试客户端在哪里截断语句

定界符

实 验

实验 1-4 不改定界符

实 验

实验 1-5 用 DELIMITER 改定界符

06
第 15 章 · 第二节 · 课件第 14、15、16、17 页合并重做

变量与用户会话变量

加一个 @,不用定义,连接断开就释放。

15.2 MySQL 编程基础课件第 14、15、16、17 页合并

变量与用户会话变量

变量有三个要素:变量名、变量值和数据类型。按生存期和作用范围,MySQL 中有用户会话变量、局部变量和系统变量三种。
用户会话变量
  • 变量名前加一个 @,例如 @a
  • 属于建立它的那个连接,其他连接看不到
  • 从连接建立时开始存在,连接断开后释放
  • 不用事先定义,也不写数据类型,没有赋值时为 NULL
两种赋值方法
SET @a = 100, @b := 200;
SELECT @c := 300;
SELECT COUNT(*) INTO @n FROM s;
  • SET 中用 = 或 := 都可以
  • SELECT 中要用 :=,MySQL 8.0 会给出警告,推荐用 SET 或 SELECT … INTO

SELECT 中的 = 是比较运算符,SELECT @a = 100 不会给 @a 赋值。

试一试三种变量

变量

实 验

实验 1-1 注释与用户会话变量

实 验

实验 1-2 SELECT 中的 = 与 :=

07
第 15 章 · 第二节 · 课件第 18 页

局部变量

用 DECLARE 定义,只在所在的语句块中有效。

课件第 18 页

重 点

DECLARE 只能写在 BEGIN … END 中,并且要写在其他语句之前。局部变量名前不加 @。

实 验

实验 1-6 局部变量

08
第 15 章 · 第二节 · 课件第 19、20 页合并重做

系统变量

加两个 @,分全局变量和会话变量。

15.2 MySQL 编程基础课件第 19、20 页合并

系统变量

两种系统变量
种类说明
全局变量 GLOBAL影响服务器的整体操作,MySQL 启动时初始化
会话变量 SESSION每建立一个连接,MySQL 把全局变量的值复制一份,作为这个连接的会话变量
  • 系统变量由 MySQL 创建,名称前面加 @@
  • 不指明范围时,SELECT @@变量名 先找会话变量,再找全局变量
查看系统变量
SHOW GLOBAL VARIABLES;
SHOW SESSION VARIABLES;
SHOW VARIABLES LIKE 'character_set%';
SELECT @@GLOBAL.autocommit;
SELECT @@SESSION.autocommit;
SELECT @@version;

练一练

在 Workbench 中执行 SELECT @@sql_safe_updates 得到 1,查到的是哪一种变量?
  1. A用户会话变量
  2. B系统变量中的会话变量
  3. C局部变量
答案 B

@@ 表示系统变量。不指明范围时先找会话变量,Workbench 为每个连接打开了安全更新模式。

实 验

实验 1-3 系统变量

保山学院·人工智能教研室·曹鼎鼎