MySQL快查-在MySQL中编程

MySQL快查

因为在日常工作学习中经常忘记mysql的一些语句、关键字、操作等内容,所以最近抽取时间写了以下关于mysql相关内容。相当于一本字典吧


重置mysql密码
数据类型
运算符
常用函数
数据完整性
数据库的基本操作
对表本身的操作
对表中数据的操作
子查询
多表连接
索引
视图
预处理SQL语句
自定义函数与存储过程
本文


变量

在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)

case

循环语句

leave & iterate

学过编程语言应该都知道编程语言中的循环会有两个关键字——breakcontinue。这里的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]

猜你喜欢

转载自blog.csdn.net/weixin_45345384/article/details/120893212