MySQL-5-TCL,视图,变量,存储过程和函数,流程控制
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,视图,变量,存储过程和函数,流程控制的更多相关文章
- MySQL之视图、触发器、事务、存储过程、函数 流程控制
MySQL之视图.触发器.事务.存储过程.函数 阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 MySQL这个软件想将数据处理的所有事情,能够在mysql这个层面上全部 ...
- 在PowerDesigner中设计物理模型3——视图、存储过程和函数
原文:在PowerDesigner中设计物理模型3--视图.存储过程和函数 视图 在SQL Server中视图定义了一个SQL查询,一个查询中可以查询一个表也可以查询多个表,在PD中定义视图与在SQL ...
- 刷新SQL Server所有视图、函数、存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图、函数、存储过程有效性。 [SQL]代码 --视图、存储过程、函数名称 DECLARE @NAME NVARCHAR(255); --局部游标 DECLARE @CUR CURSOR --自动修改未上状态为旷课 SET @CUR=CURSOR SCROLL DYNAMIC FO
刷新SQL Server所有视图.函数.存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图.函数.存储过程有效性. [SQL]代码 --视图.存储过程.函数名称 DE ...
- Linux基础-shell脚本知识整理和脚本编写----------变量、运算符、流程控制、函数、计划任务(发送邮件)
I:知识整理:变量.运算符.流程控制.函数.计划任务 变量 系统变量:set:显示所有变量 env:环境变量 常用系统变量: path pwd lang home his ...
- 自动化运维工具之Puppet变量、正则表达式、流程控制、类和模板
前文我们了解了puppet的file.exec.cron.notify这四种核心资源类型的使用以及资源见定义通知/订阅关系,回顾请参考https://www.cnblogs.com/qiuhom-18 ...
- MySQL 第十天(视图、存储过程、函数、触发器)
MySql高级-视图.函数.存储过程.触发器 目录 一.视图 1 1.视图的定义 1 2.视图的作用 1 (1)可以简化查询. 1 (2)可以进行权限控制, 3 3.查询 ...
- MySQL— 索引,视图,触发器,函数,存储过程,执行计划,慢日志,分页性能
一.索引,分页性能,执行计划,慢日志 (1)索引的种类,创建语句,名词补充(最左前缀匹配,覆盖索引,索引合并,局部索引等): import sys # http://www.cnblogs.com/w ...
- mysql 视图 触发器 事物 存储过程 函数 流程控制
1.视图 *** 视图是有一条sql语句的查询结果构成的虚拟表 其不是物理存在的 使用方式与普通表相同 视图的作用1.简化sql语句的编写 2.限制可以查看的数据 可以使用权限来完成 权限某一个库 的 ...
- MySQL视图 索引 存储过程 触发器 函数
视图: 也就是一个虚拟表(不是真实存在的),它的本质就是根据SQL语句获取动态的数据集,并为其命名.用户使用时只需要使用命名的视图即可获取结果集,并可以当做表来使用.它的作用就是方便查询操作,减 ...
随机推荐
- Java 8 学习记录
Java 8 学习记录 官方文档 https://docs.oracle.com/javase/8/ https://docs.oracle.com/javase/8/docs/index.html ...
- 聊聊UI自动化的PageObject设计模式
当我们开发UI自动化测试用例时,需要引用页面中的元素(数据)才能够进行点击(动作)并显示出页面内容.如果我们开发的用例是直接对HTML元素进行操作,则这样的用例无法"应对"页面中U ...
- Linux中权限对于文件和目录的区别
Linux系统中的权限对于文件和目录来说,是有一定区别的 下面先列举下普通文件对应的权限 1)可读r:表示具有读取.浏览文件内容的权限,例如,可以对文件执行 cat.more.less.head.ta ...
- go源码阅读 - sync/mutex
Mutex是go标准库中的互斥锁,用于处理并发场景下共享资源的访问冲突问题. 1. Mutex定义: // A Mutex is a mutual exclusion lock. // The zer ...
- 关于Swagger优化
背景 尽管.net6已经发布很久了,但是公司的项目由于种种原因依旧基于.net Framework.伴随着版本迭代,后端的api接口不断增多,每次在联调的时候,前端开发叫苦不迭:"小胖,你们 ...
- Ranchar中PostgreSQL容器异常 53100: could not resize shared memory segment ... bytes: No space left on device
问题: 客户查报表时描述查询一天的报表能出来,查询一个月的报表不能出来 分析原因: 从下图的异常中分析是PostgreSQL 的共享内存过小,容器默认的/dev/shm大小为64M 解决方案:调整ra ...
- url路径匹配类
AntPathMatcher 1.AntPathMatcher类匹配URL规则如下 ?匹配一个字符 * 匹配0个或多个字符 * *匹配0个或多个目录 2.例子 /trip/api/*x 匹配 / ...
- python连接redis、redis字符串操作、hash操作、列表操作、其他通用操作、管道、django中使用redis
今日内容概要 python连接redis redis字符串操作 redis之hash操作 redis之列表操作 redis其他 通用操作,管道 django中使用redis 内容详细 1.python ...
- Visual Studio 修改NuGet 包缓存路径
Visual Studio 下载的NuGet包默认会缓存到 C:\Users{Windows用户名}.nuget\packages 下,时间一长就会导致 C盘空间严重不足. 那么怎样去设置,让包缓存文 ...
- 【问题解决】'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed.
问题复述 今天项目组有人找我说之前部署的程序在测试环境没问题,到生产环境出现了奇怪的问题,点按钮没反应. 我通过腾讯会议发现他们的浏览器控制台上打出了如下错误: Access to XMLHttpRe ...