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;$
原文地址:https://www.cnblogs.com/huyuqing/p/14408222.html