因为在日常工作学习中经常忘记mysql的一些语句、关键字、操作等内容,所以最近抽取时间写了以下关于mysql相关内容。相当于一本字典吧
重置mysql密码
数据类型
运算符
常用函数
数据完整性
数据库的基本操作
对表本身的操作
对表中数据的操作
子查询
多表连接
索引
视图
预处理SQL语句
自定义函数与存储过程
本文
在MySQL中编程
- MySQL快查
- 变量
- 会话变量
- 用户会话变量的使用过程
- 用户会话变量的定义与赋值
- 局部变量
- 局部变量的定义与赋值
- 局部变量的使用
- 注释
- 条件语句
- if语句
- case语句
- 循环语句
- leave & iterate
- while循环语句
- loop循环语句
- repeat循环语句
在MySQL中,客户端成功连接到服务器后,都会产生与之对应的会话。在会话期间,MySQL服务实例会在MySQL服务器内存中生成与该会话对应的会话系统变量,这些变量的初始值是全局系统变量的拷贝。当然,用户也可以自定义变量。自定义的变量分两种:一种是以@开头的用户会话变量,另一种就是局部变量
会话变量会话变量有系统会话变量和用户会话变量。
两者的共同之处:
- 变量名大小写不敏感
两者的区别:
- 用户会话变量一般以一个“@”开头;系统会话变量以两个“@”开头。
- 系统会话变量无须定义就可直接使用;用户会话变量需要先定义。
# 例如保存MySQL版本的系统会话变量 select @@version; +-------------------------+ | @@version | +-------------------------+ | 8.0.26-0ubuntu0.20.04.3 | +-------------------------+ 1 row in set (0.01 sec)用户会话变量的使用过程
一个用户会话变量创建成功后,就可以作为表达式或者表达式的组成因素用于其他SQL语句中。MySQL客户机在自己的会话中的会话变量其他客户机不能访问,该客户机也不能访问其他客户机的会话变量。客户机断开连接后会话变量会自动释放,即会话结束。
用户会话变量的定义与赋值SET @user_variable1 = expression1[, @user_variable2 = expression2, ...]; # 方式一 SELECT expression1 into @user_variable1[, expression2 into @user_variable2, ...]; #方式二 # 定义用户会话变量 # @user_varable 变量名 # expression 表达式 # 例 # 简单的定义变量并赋值 set @name = '老王'; select @name := '老王'; # 从表people中id为1的记录取出name字段的值赋值给用户会话变量@name set @name = (select name from people where id = 1); select name from people where id = 1 into @name; # 简单地查看变量值 select @name;局部变量
局部变量是指在其定义的某个局部程序范围内有效的变量。
局部变量的定义与赋值DECLARE variable type [default default_value];局部变量的使用
局部变量必须定义在函数、触发器、存储过程等存储程序中,局部变量的作用范围仅仅局限于存储程序中。
delimiter // create procedure pro_test(in p_id char(10), out p_name char(10)) begin declare local_name char(10) default 'null'; # 定义一个局部变量,默认值为‘null’ select name into local_name from people where id = p_id; select local_name; set p_name = local_name; end // delimiter ; # 使用 set @test_name = 'null'; call pro_test(2, @test_name); +------------+ | local_name | +------------+ | 潘子 | +------------+ 1 row in set (0.00 sec) # 查看一下@test_name select @test_name; +------------+ | @test_name | +------------+ | 潘子 | +------------+ 1 row in set (0.00 sec)注释
MySQL的三种注释:
- # 井号注释 单行注释
- -- 双连字符注释 单行注释
- /…/ 正斜杠星号注释 多行注释
IF 条件 then ... [ELSEIF 条件 then] ... [ELSE] ... END IF # 例 set @a = 1; set @b = 2; set @c = ''; delimiter // create procedure pro_test2(in a int, in b int, out c char(10)) begin if @a > @b then set @c = 'a比较大'; else set @c = 'b比较大'; end if; end // delimiter ; call pro_test2(@a, @b, @c); Query OK, 0 rows affected (0.00 sec) select @c; +------------+ | @c | +------------+ | b比较大 | +------------+ 1 row in set (0.00 sec)case语句
CASE case_value
WHEN when_value THEN ...
[WHEN when_value THEN ...]
...
[ELSE statement_list]
END CASE
或者
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list] ...
[ELSE statement_list]
END CASE
# 类似于一些编程语言中的switch语句
# 例
# 使用第一种case
DELIMITER //
CREATE PROCEDURE p()
BEGIN
DECLARE v INT DEFAULT 1;
CASE v
WHEN 1 THEN SELECT 'OK';
WHEN 2 THEN SELECT v;
WHEN 3 THEN SELECT 0;
ELSE
BEGIN
END;
END CASE;
END//
DELIMITER ;
# 使用第二张case
DELIMITER //
CREATE PROCEDURE p()
BEGIN
DECLARE v INT DEFAULT 1;
CASE
WHEN v = 1 THEN SELECT 'OK';
WHEN v = 2 THEN SELECT v;
WHEN v = 3 THEN SELECT 0;
ELSE
BEGIN
END;
END CASE;
END//
DELIMITER ;
# 两者执行的输出结果一样
call p;
+----+
| OK |
+----+
| OK |
+----+
1 row in set (0.00 sec)
case
循环语句 leave & iterate学过编程语言应该都知道编程语言中的循环会有两个关键字——break和continue。这里的leave好比编程语言中的break;iterate好比continue。
while循环语句[begin_label:] WHILE search_condition DO
statement_list
END WHILE [end_label]
# 例
DELIMITER //
CREATE PROCEDURE dowhile()
BEGIN
DECLARE v1 INT DEFAULT 5;
WHILE v1 > 0 DO
SELECT concat('Hello MySQL', v1); # 输出
SET v1 = v1 - 1;
END WHILE;
END//
DELIMITER ;
# 输出结果
CALL dowhile;
+---------------------------+
| concat('Hello MySQL', v1) |
+---------------------------+
| Hello MySQL5 |
+---------------------------+
1 row in set (0.00 sec)
+---------------------------+
| concat('Hello MySQL', v1) |
+---------------------------+
| Hello MySQL4 |
+---------------------------+
1 row in set (0.00 sec)
+---------------------------+
| concat('Hello MySQL', v1) |
+---------------------------+
| Hello MySQL3 |
+---------------------------+
1 row in set (0.00 sec)
+---------------------------+
| concat('Hello MySQL', v1) |
+---------------------------+
| Hello MySQL2 |
+---------------------------+
1 row in set (0.00 sec)
+---------------------------+
| concat('Hello MySQL', v1) |
+---------------------------+
| Hello MySQL1 |
+---------------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
while
loop循环语句[begin_label:] LOOP
statement_list
END LOOP [end_label]
# 例
DELIMITER //
CREATE PROCEDURE doiterate(p1 INT)
BEGIN
label1: LOOP
SET p1 = p1 + 1;
IF p1 < 10 THEN
ITERATE label1; # 结束本次循环并回到label1处继续之后的内容
END IF;
LEAVE label1;
END LOOP label1;
SET @x = p1;
END//
DELIMITER ;
# 结果
call doiterate(0);
Query OK, 0 rows affected (0.00 sec)
mysql> select @x;
+------+
| @x |
+------+
| 10 |
+------+
1 row in set (0.00 sec)
repeat循环语句
[begin_label:] REPEAT
statement_list
UNTIL search_condition
END REPEAT [end_label]



