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