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;$