TCL:Transaction Control Language事务控制语言

TCL

  • 事务的特点 acid: 原子性(Atomicity),一致性(Consistency),隔离性(isolation),持久性(Durability)

事务的创建

  • 隐式事务:事务没有明显的开启和结束的标记,比如insert、update、delete、select语句
  • 显式事务:事务具有明显的开启和结束的标记,前提:必须先设置 自动提交功能 为禁用

    步骤

    步骤1:开启事务

    set autocommit=0

    start transaction;可选的

    步骤2:编写事务中的sq1语句(select insert update delete

    步骤3:结束事务

    commit;提交事务

    rollback;回滚事务

查看隔离级别

SELECT @@tx_isolation

设置隔离级别

SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别

视图

  • 它是一个虚拟表,使用和普通表一样

创建视图

语法: create view 视图名 as 查询语句;

# 创建视图
# 查询姓名中包含a字符的员工名、部门名和工种信息
# 1.把查询信息封装起来
CREATE VIEW v1
AS
SELECT `last_name`, `department_name`, `job_title`
FROM employees e
INNER JOIN departments d ON e.`department_id` = d.`department_id`
INNER JOIN jobs jo ON e.`job_id` = jo.`job_id`
# 2. 用视图查询
SELECT * FROM v1 WHERE last_name LIKE '%a%';

视图的修改

  • 方式一:create or replace view 视图名 as 查询语句
  • 方式二:alter view 视图名 as 查询语句;
# 视图的修改
# 查询所有员工信息
# 方式一:
CREATE OR REPLACE VIEW v2
AS
SELECT * FROM employees SELECT v2.last_name FROM v2 # 查询所有姓名
# 方式二:
ALTER VIEW v2
AS
SELECT last_name, first_name FROM employees SELECT * FROM v2 #查询这个视图

视图的删除

  • 语法:drop view 视图名,视图名,…;
# 删除视图v1和v2
DROP VIEW v1,v2

查看视图结构

DESC v1

变量

  • 分类:系统变量(全局/会话变量),自定义变量(用户/局部变量)

系统变量

全局变量

# 系统变量
# 1.查看系统所有变量
# SHOW global|session VARIABLES;
SHOW VARIABLES
# 2. 查看系统中满足条件的部分变量 如:查看字符集
# SHOW global|【session】variables LIKE '%chars'
SHOW VARIABLES LIKE '%char%'
# 3、查看指定的某个系统变量的值
# select @@global|【session】.系统变量名;
SELECT @@global.autocommit
SELECT @@global.tx_isolation
# 4、为某个系统变量赋值
#方式一:
# set global|【sessifn】系统变量名=值;
#方式二:
# set @@global|【session】.系统变量名=值;
SET @@global.autocommit = 0; # 更改是否自动提交

会话变量

# 会话变量
# 1.查看所有会话变量
SHOW SESSION VARIABLES
# 2. 查看部门会话变量
SHOW SESSION VARIABLES LIKE '%char%'
# 3. 查看指定的某个会话变量
SELECT @@session.tx_isolation
# 4. 设置会话变量值
SET @@session.autocommit = 1

自定义变量

用户变量

# 用户变量
# 1. 声明并初始化
/*
SET 用户变量名=值;
或 SET 用户变量名:=值;
或 SELECT 用户变量名:=值;
*/
# 2. 赋值
/*
语法一:select into
语法二:如上初始化
*/
SET @name = 'j';
SELECT @name SET @temp = '';
SELECT COUNT(*) INTO @temp FROM employees;
SELECT @temp

局部变量

  • 作用域:仅仅在定义它的begin end中有效
  • 位置:只能在begin and开头
# 局部变量
# 1. 声明
/*
语法一:declare 变量名 类型
语法二:declare 变量名 类型 default 值
*/
# 2. 赋值 和用户变量赋值一样;set/select # 1.用户变量
SET @a = 1;
SET @b = 2;
SET @c = @a + @b;
SELECT @c
# 2.局部变量
DECLARE a INT DEFAULT 1; # 报错
DECLARE b INT DEFAULT 2; # 报错
DECLARE c INT ; # 报错
SET c = a + b; # 报错

存储过程

创建和调用

  • 创建语法
CREATE PROCEDURE 存储过程名(参数列表)
BEGIN
具体SQL语句
LEND
/*
注意:
1、参数列表包含三部分
参数模式 参数名 参数类型
举例: IN stuname VARCHAR(20)
参数模式:
IN: 调用该存储过程需要传入参数
OUT: 可以返回该参数值
INOUT: 既可以做输入 也可以做输出(输出的是参数值)
2、如果存储过程体仅仅只有一句话,BEGINEND可以省略
3、存储过程体中的每条sQL语句的结尾要求必须加分号。
*/
  • 调用语法:CALL 存储过程名 (实参列表);

空参列表

MySQL中操作

  • 1.编写存储过程语句
# 空参列表
# 插入到admin表中3条记录
DELIMITER $ #设置结束符
CREATE PROCEDURE myp1()
BEGIN
INSERT INTO admin(`username`, `password`) VALUES
('aaa','aaa'),
('bbb','bbb'),
('ccc','ccc'); # 每一条语句都以分号结束
END $ # 结束标记
  • 2.window下,以管理员启动dos窗口,输入mysql -uroot -p密码进入MySQL操作下,粘贴存储过程语句,回车
  • 3.调用存储过程 call myp1() $; 即可操作成功

带in模式

# 带in类型
# 创建存储过程实现根据女神名,查询对应的男神信息
DELIMITER $
CREATE PROCEDURE myp2(IN girlName VARCHAR(50))
BEGIN
SELECT bo.* FROM boys bo
INNER JOIN beauty b ON bo.`id` = b.`boyfriend_id`
WHERE b.`name` = girlName;
END $ CALL myp2('唐艺昕1') # sqlyog执行语法

在命令行窗口执行时,唐艺昕1是中文,需要先设置字符集 然后再调用语句.

带out模式

# 带out存储过程
# 根据女生名,返回对应的男朋友
DELIMITER $
CREATE PROCEDURE myp3(IN girlName VARCHAR(20), OUT boyName VARCHAR(20))
BEGIN
SELECT bo.`boyName` INTO boyName
FROM beauty b
INNER JOIN boys bo ON b.`boyfriend_id` = bo.`id`
WHERE b.`name` = girlName;
END $ # 调用(命令行窗口)
SET @bName=''$;
CALL myp3('热巴',@bName)$;
SELECT @bName$;

带inout的存储过程

# 传入a和b两个值,最终a和b都翻倍并返回
DELIMITER $
CREATE PROCEDURE myp4(INOUT a INT, INOUT b INT)
BEGIN
SET a = a * 2;
SET b = b * 2;
END $ # 调用(命令行方式)
SET @a=2;$
SET @b=3;$
CALL myp4(@a, @b);$
SELECT @a,@b;$

存储过程的删除

DROP PROCEDURE myp1

存储过程的查看

SHOW CREATE PROCEDURE myp2;

函数

  • 函数和存储过程区别:

    ①存储过程:可以有0个返回,也可以有多个返回

    ②函数:有且只有1个返回
  • 语法:
CREATE FUNCTTON 函数名(参数列表)RETURNS 返回类型I
BEGIN
函数体
END
/*
注意: 参数列表包含两部分:参数名 参数类型
肯定会有return单语句,如果没有会报错
使用delimiter语句设置结束标记
*/ # 调用:SELECT FUNCTION(参数列表)

例子

# 1.无参有返回
# 返回公司的员工个数
DELIMITER $
CREATE FUNCTION f1() RETURNS INT
BEGIN
DECLARE c INT ;
SELECT COUNT(*) INTO c # 赋值
FROM `employees`;
RETURN c;
END $ #调用
SELECT f1(); # 2.有参有返回
# 根据员工名,返回它的工资
DELIMITER $
CREATE FUNCTION f2(eName VARCHAR(20)) RETURNS DOUBLE
BEGIN
DECLARE result DOUBLE;
SELECT salary INTO result FROM employees WHERE `last_name` = eName;
RETURN result;
END $ #调用
SELECT f2('Kochhar');$

查看/删除函数

# 查看函数
SHOW CREATE FUNCTION f2
# 删除函数
DROP FUNCTION f1

流程控制

case再练手

语法

/*
情况1:类似于java中的switch语句,一般用于实现等值判断
CASE 变量|表达式|字段
WHEN 要判断的值 THEN 返回的值1或语句1;
WHEN 要判断的值 THEN 返回的值2或语句2;
ELSE 要返回的值n或语句n;
END CASE;
情况2:类似于java中的多重IF语句,一般用于实现区间判断语法:
CASE
WHEN 要判断的条件1 THEN返回的值1或语句1;
WHEN 要判断的条件2 THEN返回的值2或语句2;
ELSE 要返回的值n或语句n;
END CASE;
*/
# case初步练手看DQL

# case
# 创建存储过程,根据传入的成绩,来显示等级
DELIMITER $
CREATE PROCEDURE myp1(IN grade INT)
BEGIN
CASE
WHEN grade BETWEEN 90 AND 100 THEN SELECT 'a';
WHEN grade BETWEEN 80 AND 90 THEN SELECT 'b';
ELSE SELECT 'c';
END CASE;
END $ #调用
CALL myp1(90);$

if结构

语法:

/*
if 条件1 then语句1;
elseif 条件2 then 语句2;
...
else 语句n;
end if; 应用在begin end中
*/

循环结构

概念

分类:
while、loop、repeat
循环控制:
iterate类似于continue,继续,结束本次循环,继续下一次
leave 类似于break,跳出,结束当前所在的循环
# 以下【】可有可无
/*
# while 语法
【标签:(有标签才能搭配循环控制语句)】while 循环条件 do
循环体;
end while【标签】;
*/
/*
# loop语法:
【标签:】1oop
循环体;
end 1oop【标签】
*/
/*
# repeat 语法:
【标签:】 repeat
循环体;
until结束循环的条件
end repeat【标签】
*/

举例

# 没有添加循环控制语句
# 批量插入,根据次数插入到admin表中多条记录
DELIMITER $
CREATE PROCEDURE pro_while(IN num INT)
BEGIN
DECLARE i INT DEFAULT 1;
WHILE i <= num DO
INSERT INTO admin(`username`, `password`) VALUES
(CONCAT('admin',i), 'aaa');
SET i = i + 1;
END WHILE;
END $ # 调用
SET @a = 10;$
CALL pro_while(@a);$ # 添加leave语句
# 批量插入,根据次数插入到admin表中多条记录,如果次数>20则停止
TRUNCATE TABLE admin DELIMITER $
CREATE PROCEDURE pro_leave(IN num INT)
BEGIN
DECLARE i INT DEFAULT 1;
a:WHILE i < num DO
IF i > 20
THEN LEAVE a;
END IF;
INSERT INTO admin(`username`, `password`) VALUES
(CONCAT('admin',i), 123456);
SET i = i + 1;
END WHILE;
END $ #调用
SET @a = 100;$
CALL pro_leave(@a);$
#查看
SELECT * FROM admin;$ # 添加iterate语句
# 批量插入,根据次数插入到admin表中多条记录,仅仅插入偶数
TRUNCATE TABLE admin DELIMITER $
CREATE PROCEDURE pro_iterate(IN num INT)
BEGIN
DECLARE i INT DEFAULT 0;
a:WHILE i < num DO
SET i = i + 1;
IF (i % 2) != 0
THEN ITERATE a;
END IF;
INSERT INTO admin(`username`, `password`) VALUES
(CONCAT('admin',i), 123456); END WHILE ;
END $ #调用
SET @a = 100;$
CALL pro_iterate(@a);$
#查看
SELECT * FROM admin;$

MySQL-5-TCL,视图,变量,存储过程和函数,流程控制的更多相关文章

  1. MySQL之视图、触发器、事务、存储过程、函数 流程控制

    MySQL之视图.触发器.事务.存储过程.函数 阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 MySQL这个软件想将数据处理的所有事情,能够在mysql这个层面上全部 ...

  2. 在PowerDesigner中设计物理模型3——视图、存储过程和函数

    原文:在PowerDesigner中设计物理模型3--视图.存储过程和函数 视图 在SQL Server中视图定义了一个SQL查询,一个查询中可以查询一个表也可以查询多个表,在PD中定义视图与在SQL ...

  3. 刷新SQL Server所有视图、函数、存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图、函数、存储过程有效性。 [SQL]代码 --视图、存储过程、函数名称 DECLARE @NAME NVARCHAR(255); --局部游标 DECLARE @CUR CURSOR --自动修改未上状态为旷课 SET @CUR=CURSOR SCROLL DYNAMIC FO

    刷新SQL Server所有视图.函数.存储过程 更多   sql   此脚本用于在删除或添加字段时刷新相关视图,并检查视图.函数.存储过程有效性. [SQL]代码 --视图.存储过程.函数名称 DE ...

  4. Linux基础-shell脚本知识整理和脚本编写----------变量、运算符、流程控制、函数、计划任务(发送邮件)

    I:知识整理:变量.运算符.流程控制.函数.计划任务 变量 系统变量:set:显示所有变量                env:环境变量 常用系统变量: path pwd lang home his ...

  5. 自动化运维工具之Puppet变量、正则表达式、流程控制、类和模板

    前文我们了解了puppet的file.exec.cron.notify这四种核心资源类型的使用以及资源见定义通知/订阅关系,回顾请参考https://www.cnblogs.com/qiuhom-18 ...

  6. MySQL 第十天(视图、存储过程、函数、触发器)

    MySql高级-视图.函数.存储过程.触发器 目录 一.视图    1 1.视图的定义    1 2.视图的作用    1 (1)可以简化查询.    1 (2)可以进行权限控制,    3 3.查询 ...

  7. MySQL— 索引,视图,触发器,函数,存储过程,执行计划,慢日志,分页性能

    一.索引,分页性能,执行计划,慢日志 (1)索引的种类,创建语句,名词补充(最左前缀匹配,覆盖索引,索引合并,局部索引等): import sys # http://www.cnblogs.com/w ...

  8. mysql 视图 触发器 事物 存储过程 函数 流程控制

    1.视图 *** 视图是有一条sql语句的查询结果构成的虚拟表 其不是物理存在的 使用方式与普通表相同 视图的作用1.简化sql语句的编写 2.限制可以查看的数据 可以使用权限来完成 权限某一个库 的 ...

  9. MySQL视图 索引 存储过程 触发器 函数

       视图: 也就是一个虚拟表(不是真实存在的),它的本质就是根据SQL语句获取动态的数据集,并为其命名.用户使用时只需要使用命名的视图即可获取结果集,并可以当做表来使用.它的作用就是方便查询操作,减 ...

随机推荐

  1. DirectX11 With Windows SDK--38 级联阴影映射(CSM)

    前言 在31章我们曾经实现过阴影映射,但是受到阴影贴图精度的限制,只能在场景中相当有限的范围内投射阴影.本章我们将以微软提供的例子和博客作为切入点,学习如何解决阴影中出现的Atrifacts: 边缘闪 ...

  2. Java第十五周作业

    Cola公司的雇员分为以下若干类:(知识点:多态) [必做题]• 4.1 ColaEmployee :这是所有员工总的父类,属性:员工的姓名,员工的生日月份.方法:getSalary(int mont ...

  3. 详解javascript的eventloop(一)

    先看一段代码 console.log('Hi') setTimeOut(function cb1(){ console.log('cb1') },500) console.log('Bye') 第一步 ...

  4. 深入理解vue 修饰符sync【 vue sync修饰符示例】

    在说vue 修饰符sync前,我们先看下官方文档:vue .sync 修饰符,里面说vue .sync 修饰符以前存在于vue1.0版本里,但是在在 2.0 中移除了 .sync .但是在 2.0 发 ...

  5. Element修改弹窗类组件的层级

    前情 Element,一套为开发者.设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库,在项目中我们就使用了它,非常nice 坑位 在使用Element组件的时候,一切都十分顺利,但是在使用弹 ...

  6. 【Azure 应用服务】Azure Function 启用 Managed Identity后, Powershell Funciton出现 ERROR: ManagedIdentityCredential authentication failed

    问题描述 编写Powershell Function,登录到China Azure并获取Azure AD User信息,但是发现遇见了 [Error] ERROR: ManagedIdentityCr ...

  7. CAS如何解决ABA问题

    点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. CAS如何解决ABA问题 什么是ABA:在CAS过程中,线程1.线程2分 ...

  8. STS快捷键

    在类或者方法上方加注释:shift+alt+J

  9. [AcWing 777] 字符串乘方

    点击查看代码 #include<iostream> using namespace std; string str; int main() { while (cin >> st ...

  10. FreeRTOS --(11)任务管理之系统节拍

    转载自 https://blog.csdn.net/zhoutaopower/article/details/107146764 前面有了创建任务.启动调度器.任务控制,接下来便开始分析一个 Tick ...