From 9d1476b71408c5efcacbbdd608d7413b5001b496 Mon Sep 17 00:00:00 2001 From: pengshiyu <1940607002@qq.com> Date: Sun, 10 Apr 2022 16:46:36 +0800 Subject: [PATCH] fix --- blog/php-mysql/index.md | 6 ++ blog/php-mysql/sql-if-while.md | 114 ++++++++++++++++++++ blog/php-mysql/sql-transaction.md | 170 ++++++++++++++++++++++++++++++ blog/php-mysql/sql-variables.md | 136 ++++++++++++++++++++++++ 4 files changed, 426 insertions(+) create mode 100644 blog/php-mysql/sql-if-while.md create mode 100644 blog/php-mysql/sql-transaction.md create mode 100644 blog/php-mysql/sql-variables.md diff --git a/blog/php-mysql/index.md b/blog/php-mysql/index.md index e32b42d..83c961b 100644 --- a/blog/php-mysql/index.md +++ b/blog/php-mysql/index.md @@ -53,3 +53,9 @@ [外键 foreing key](blog/php-mysql/sql-foreing-key.md) [视图 view](blog/php-mysql/sql-view.md) + +[事务安全 transaction](blog/php-mysql/sql-transaction.md) + +[变量 variables](blog/php-mysql/sql-variables.md) + +[流程结构 if while](blog/php-mysql/sql-if-while.md) diff --git a/blog/php-mysql/sql-if-while.md b/blog/php-mysql/sql-if-while.md new file mode 100644 index 0000000..d6ced8e --- /dev/null +++ b/blog/php-mysql/sql-if-while.md @@ -0,0 +1,114 @@ +# 流程结构 + +## if分支 + +两种基本用法 + +1、用在select查询中 + +基本语法 + +```sql +if(条件, 结果为真, 结果为假); +``` + +```sql +mysql> select * from my_student; ++----+-----------+----------+------+--------+ +| id | name | class_id | age | gender | ++----+-----------+----------+------+--------+ +| 1 | 刘备 | 1 | 18 | 2 | +| 2 | 李四 | 1 | 19 | 1 | +| 3 | 王五 | NULL | 20 | 2 | +| 4 | 张飞 | NULL | 21 | 1 | +| 5 | 关羽 | NULL | 22 | 2 | +| 6 | 曹操 | 1 | 20 | NULL | +| 10 | 司马懿 | 6 | 26 | 1 | ++----+-----------+----------+------+--------+ + +mysql> select *, if(age > 20, '符合', '不符合') as result from my_student; ++----+-----------+----------+------+--------+-----------+ +| id | name | class_id | age | gender | result | ++----+-----------+----------+------+--------+-----------+ +| 1 | 刘备 | 1 | 18 | 2 | 不符合 | +| 2 | 李四 | 1 | 19 | 1 | 不符合 | +| 3 | 王五 | NULL | 20 | 2 | 不符合 | +| 4 | 张飞 | NULL | 21 | 1 | 符合 | +| 5 | 关羽 | NULL | 22 | 2 | 符合 | +| 6 | 曹操 | 1 | 20 | NULL | 不符合 | +| 10 | 司马懿 | 6 | 26 | 1 | 符合 | ++----+-----------+----------+------+--------+-----------+ +7 rows in set (0.00 sec) +``` + +2、用在复杂语句块中(函数、存储过程、触发器) + +基本语法 + +```sql +if 条件表达式 then + 满足条件要执行的语句; +end if; +``` + +3、复合语法 + +基本语法 + +```sql +if 条件表达式 then + 满足条件要执行的语句; +else + 不满足条件要执行的语句; +end if; + +-- 如果有其他分支,嵌套使用 +if 条件表达式 then + 满足条件要执行的语句; +else + 不满足条件要执行的语句; + if 条件表达式 then + 满足条件要执行的语句; + else + 不满足条件要执行的语句; + end if; +end if; +``` + +## while循环 + +基本语法 + +```sql +while 条件 do + 要循环执行的代码 +end while; +``` + +结构标识符: 为结构命名 + +基本语法 +```sql +标识名字: while 条件 do + 要循环执行的代码 +end while [标识名字]; +``` + +mysql中没有continue 和break + +- iterate 迭代 以下代码不执行,重新开始循环,相当于continue +- leave 离开 终止循环,相当于break + +```sql +标识名字: while 条件 do + if 条件判断 then + 循环控制 + iterate / leave 标识名字; + end if; + + 循环体 + +end while [标识名字]; +``` + +https://www.bilibili.com/video/BV1Vx411g7uJ?p=68&spm_id_from=pageDriver \ No newline at end of file diff --git a/blog/php-mysql/sql-transaction.md b/blog/php-mysql/sql-transaction.md new file mode 100644 index 0000000..8a6a9cd --- /dev/null +++ b/blog/php-mysql/sql-transaction.md @@ -0,0 +1,170 @@ +# 事务安全 transaction + +事务 transaction 访问可能更新数据库中各种数据项的一个程序执行单元unit + +事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成 + +## 事务基本原理 + +MySQL允许将事务统一进行管理(存储引擎innodb),将用户所做的操作,暂时保存起来,不直接放到数据表(更新),等到用户确认结果之后再进行操作 + +事务通常是自动提交,也可以手动提交 + +## 自动事务 + +当客户端发送一条SQL指令(写操作,增删改)给服务器的时候,服务器在执行后,不用等待用户反馈结果,会自动将结果同步到数据表 + +两个客户端,一个客户端执行SQL指令,另一个客户端查看执行结果 + +通过变量控制自动事务 + +```sql +mysql> show variables like 'autocommit'; ++---------------+-------+ +| Variable_name | Value | ++---------------+-------+ +| autocommit | ON | ++---------------+-------+ + +-- 关闭自动事务 +set autocommit = off; + +mysql> show variables like 'autocommit'; ++---------------+-------+ +| Variable_name | Value | ++---------------+-------+ +| autocommit | OFF | ++---------------+-------+ +``` + +关闭自动事务之后,一个客户端修改数据,另个一客户端看不到修改的结果 + +一旦关闭自动事务,就需要用户提供是否同步的命令 + +- commit 提交 (同步到数据表,事务会被清空) +- rollback 回滚 (清空之前的操作,不要了) + +```sql +-- 客户端A关闭自动事务后操作数据 +mysql> select * from my_class; ++----+--------+ +| id | name | ++----+--------+ +| 1 | 一班 | +| 3 | 三班 | ++----+--------+ +2 rows in set (0.01 sec) + +mysql> insert into my_class (name) values('四班'); +Query OK, 1 row affected (0.00 sec) + +mysql> select * from my_class; ++----+--------+ +| id | name | ++----+--------+ +| 1 | 一班 | +| 3 | 三班 | +| 5 | 四班 | ++----+--------+ +3 rows in set (0.00 sec) + + +-- 客户端B看不到新增的 四班数据, +mysql> select * from my_class; ++----+--------+ +| id | name | ++----+--------+ +| 1 | 一班 | +| 3 | 三班 | ++----+--------+ +2 rows in set (0.00 sec) +``` + +客户端A执行commit 提交事务之后,客户端B就可以看到新增的数据了 + +通常不需要关闭自动事务,需要使用事务的时候,使用手动事务 + + +## 手动事务 + +开始、过程、结束,都要用户手动发送事务操作指令来实现 + +手动事务指令 +```sql +-- 1、开启事务,从这条语句开始,后面所有的语句都不会直接写入到数据表,保存在事务日志中 +start transaction + +-- 2、事务处理,多个指令构成 + +-- 3、事务提交,结束事务 +commit / rollback + +``` + +## 事务的使用 + +```sql +mysql> select * from my_class; ++----+--------+ +| id | name | ++----+--------+ +| 1 | 一班 | +| 3 | 三班 | +| 5 | 四班 | ++----+--------+ +3 rows in set (0.04 sec) + +mysql> select * from my_student; ++----+--------+----------+------+--------+ +| id | name | class_id | age | gender | ++----+--------+----------+------+--------+ +| 1 | 刘备 | 1 | 18 | 2 | +| 2 | 李四 | 1 | 19 | 1 | +| 3 | 王五 | NULL | 20 | 2 | +| 4 | 张飞 | NULL | 21 | 1 | +| 5 | 关羽 | NULL | 22 | 2 | +| 6 | 曹操 | 1 | 20 | NULL | ++----+--------+----------+------+--------+ +6 rows in set (0.00 sec) + + +-- 开启事务 +start transaction; + +-- 执行事务操作,多个修改操作 +insert into my_class (name)values ('六班'); +insert into my_student (name, class_id, age, gender)values ('司马懿', 6, 26, 1); + +-- 提交事务 +commit; + +-- 或者回滚操作,所有数据无效清空 +rollback; +``` + +## 回滚点 + +当有一系列事务操作是,而其中的步骤如果成功了,没有必要重新来过,可以在某个点,设置一个记号(回滚点),然后如果后面有失败,那么可以回到这个记号的位置 + +```sql +-- 增加回滚点 +savepoint 回滚点名字; + +-- 回到回滚点 清空之后所有操作 +rollback to 回滚点名字; +``` + +一个事务处理过程中,如果有很多步骤,可以设置多个回滚点 + + +## 事务的特点 + +ACID: +- 原子性 automicity 一个事务是不可分割的工作单元,要么都做,要么都不做 +- 一致性 consistency 事务必须是使数据库从一个一致性状态变到另一个一致性状态 +- 隔离性 isolation 一个事务的执行,不能被其他事务干扰,操作数据的时候会锁住该条数据 +- 持久性 durability 一个事务一旦提交,他对数据库中的数据改变就是永久的 + +如果条件中使用了索引,会隔离一条记录;反之,通过全表检索,会锁定整个表 + + diff --git a/blog/php-mysql/sql-variables.md b/blog/php-mysql/sql-variables.md new file mode 100644 index 0000000..72168da --- /dev/null +++ b/blog/php-mysql/sql-variables.md @@ -0,0 +1,136 @@ +# 变量 + +MySQL本质是一种编程语言 + +## 1、系统变量 + +对所有用户客户端都有效 + +### 1.1、查看系统变量 + +1、方式一 + +```sql +show variables [like 'pattern']; +``` + +示例 + +```sql +mysql> show variables like 'autocommit'; ++---------------+-------+ +| Variable_name | Value | ++---------------+-------+ +| autocommit | ON | ++---------------+-------+ +``` + +2、方式二: + +使用select查询变量的数据值 + +```sql +select @@变量名; +``` + +示例 + +```sql +select @@autocommit; ++--------------+ +| @@autocommit | ++--------------+ +| 1 | ++--------------+ +``` + +### 1.2、修改系统变量 + +1、局部修改(会话级别) + +```sql +-- 只针对当前客户端当次连接有效 +set 变量名 = 值; + +-- eg: +set autocommit = 'off'; +show variables like 'autocommit'; +``` + +2、全局修改 + +```sql +-- 所有客户端,都有效 +set global 变量名 = 值; +set @@global.变量名 = 值; + +-- eg: +set global autocommit = 'off'; +``` + +注意,全局修改之后,重启客户端生效 + + +## 2、会话变量 + +也称为用户变量,设置的变量,只针对当前用户使用的客户端生效 + +```sql +-- 定义用户变量 +set @变量名 = 值; + +set @age = 23; +``` + +mysql中没有比较符号 == ,使用的是 =; +为了避免分不清是赋值还是比较,赋值使用`:=` + +```sql +set @变量名 := 值; + +set @name := 'Tom'; +``` + +mysql允许将数据从表中取出存储到变量中,只能是一行数据 + +```sql +-- 1、赋值且查看赋值过程 +select @变量1 := 字段1, @变量2 := 字段2 from 表 where 条件 + +select @name := name, @age := age from my_student limit 1; ++---------------+-------------+ +| @name := name | @age := age | ++---------------+-------------+ +| 刘备 | 18 | ++---------------+-------------+ + +--- 2、只赋值不看过程 +select 字段1, 字段2 from 表 where 条件 into @变量1, @变量2; +select name, age from my_student limit 1 into @name, @age; +``` + +查看变量 + +```sql +select @变量名 + +mysql> select @name, @age; ++--------+------+ +| @name | @age | ++--------+------+ +| 刘备 | 18 | ++--------+------+ +``` + +## 3、局部变量 + +作用范围在begin到end语句块之间,在该语句块里设置的变量 + +- declare语句用于定义局部变量 +- 局部变量 declare语句出现在begin到end语句块之间 + + +声明语法 +```sql +declare 变量名 数据类型 [属性]; +``` -- GitLab