MySQL快查
因为在日常工作学习中经常忘记mysql的一些语句、关键字、操作等内容,所以最近抽取时间写了以下关于mysql相关内容。相当于一本字典吧
重置mysql密码
数据类型
运算符
常用函数
数据完整性
数据库的基本操作
对表本身的操作
对表中数据的操作
子查询
多表连接
索引
视图
预处理SQL语句
自定义函数与存储过程
本文
在MySQL中编程
变量
在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语句
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)
循环语句
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)
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]