zoukankan      html  css  js  c++  java
  • 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;$
    
  • 相关阅读:
    数据库的未来:ORM+LINQ+RX
    工具论-科学是实用工具
    事务、锁与原子性
    ORM-面向对象&关系数据库
    swift Class的内存布局
    使用phpexcel导出到xls文件的时候出现乱码解决
    苹果CMS
    js网页如何获取手机屏幕宽度
    常用正则说明
    php中的线程、进程和并发区别
  • 原文地址:https://www.cnblogs.com/huyuqing/p/14408222.html
Copyright © 2011-2022 走看看