zoukankan      html  css  js  c++  java
  • (八)MySQL事务、视图、变量、存储过程、函数、流程控制结构

    补充:增删查改语句在数据库中基本通用,但这篇博客的内容基本是MySQL区别于其它数据库管理系统的知识,也要认真学习。

    一、事务

    1、含义:在MySQL中,可以通过创建事务来解决一些问题。

    2、语法:

    #1、开启事务
    set autocommit=0; #禁用自动提交功能
    #2、编写事务的sql语句
    select insert update delete...
    #3、结束事务
    commit;提交事务
    rollback;回滚事务

    注意:MySQL默认提交事务,所以要先将autocommit功能禁用。

    案例1:模拟张飞给刘备转账这一事件

    查询数据库:

    模拟转账:

    SET AUTOCOMMIT=0;
    UPDATE bank b
    SET b.money=b.money-500
    WHERE b.name='张飞';
    UPDATE bank b
    SET b.money=b.money+500
    WHERE b.name='刘备';

    转账后结果:

    重新打开一个新标签,重新查询bank表中的内容:

    可以看出数据库中的数据并未改变,因为前一个标签修改后还没有提交。

    输入rollback,在第一个标签中再次查看表中数据:

    可以看出rollback的作用是将数据恢复到上次提交之后的数据库内容。

    案例2:savepoint 设置保存点

    SET autocommit=0;
    START TRANSACTION;
    DELETE FROM account WHERE id=25;
    SAVEPOINT a;
    DELETE FROM account WHERE id=28;
    ROLLBACK TO a;

    注意:保存点一定要起别名,便于和rollback搭配使用。

    3、事务的隔离级别

                        脏读  不可重复读   幻读
    read uncommitted:   √       √       √
    read committed:     ×       √       √
    repeatable read:    ×       ×       √
    serializable:       ×       ×       ×

    注意:

    ①mysql中默认 第三个隔离级别 repeatable read

    ②查看隔离级别:select @@tx_isolation;

    ③设置隔离级别:set session|global transaction isolation level 隔离级别;

    4、各名词含义:

    ①脏读:其他人看到了更改的数据后,数据被滚回

    ②不可重复读:数据被滚回之后再次读取数值不同

    ③幻读:第一次查询数据为三条,在查询后数据条数被其他人更改,再次查询时数据条数与之前不同

    二、视图

    1、含义:视图是虚拟创建的表,不在库中真实存在,一般是将多个表中的数据合并在一个表中,便于以后直接对其操作。

    2、创建视图:

    案例:查询张姓学生的学生名和专业名

    step1:新建视图v1,并将学生名和专业名存放在其中

    CREATE VIEW v1 #先创建视图
    AS
    SELECT stuname,majorname
    FROM stuinfo s
    INNER JOIN major m ON s.`majorid`= m.`id`;

    注意:创建好的视图在SQLyog中显示位置如下:

    step2:对创建好的视图进行操作,从中筛选符合条件的数据

    SELECT * FROM v1 WHERE stuname LIKE '张%';

    2、修改视图(重新创建一个新视图):

    语法:

    CREATE OR REPLACE v1
    AS
    查询语句;

    3、删除视图:

    DROP VIEW myv1,myv2;

    注意:可同时删除多个视图。

    4、查看视图:

    DESC v1;
    SHOW CREATE VIEW v1;

    5、更新视图中的数据:

    #1.插入
    INSERT INTO myv1 VALUES('张飞','zf@qq.com');
    #2.修改
    UPDATE myv1 SET last_name = '张无忌' WHERE last_name='张飞';
    #3.删除
    DELETE FROM myv1 WHERE last_name = '张无忌';

    注意:视图数据的修改与表的修改相似,只需将table替换为view即可,但具备以下性质的视图不可被修改:

    ①包含以下关键字:分组函数、distinct、group  by、having、union或者union all
    ②常量视图
    ③Select中包含子查询
    ④join
    ⑤from一个不能更新的视图
    ⑥where子句的子查询引用了from子句中的表

    三、变量

    1、分类:

    系统变量
        全局变量(global)
        会话变量(session)
    自定义变量
        用户变量
        局部变量

    2、系统变量

    ①全局变量(所有会话均有效,但数据库重启后消失):

    #案例一:查看所有的全局变量
    SHOW GLOBAL VARIABLES;  
    #案例二:查看部分全局变量
    SHOW GLOBAL VARIABLES LIKE '%char%';
    #案例三:查看指定全局变量
    SELECT @@global.autocommit;
    #案例四:修改某个全局变量
    SET @@global.autocommit=0;

    ②会话变量(仅对本次会话有效)

    注意:其查看、修改与全局变量相似,只需要将global替换为session

    3、自定义变量

    ①用户变量(作用域同会话变量):

    #声明并初始化 
    SET @变量名=值;
    #赋值(更新变量的值) #方式很多,仅举其一
    SET @变量名=值;	
    #使用(查看变量的值)
    SELECT @变量名;

    ②局部变量(仅在begin end中使用):

    #声明
    DECLARE 变量名 类型; 或
    DECLARE 变量名 类型 【DEFAULT 值】;
    #赋值(更新变量的值)
    SET 局部变量名=值;
    #使用(查看变量的值)
    SELECT 局部变量名;

    案例:声明两个用户变量,求和并打印

    SET @n=6,@m=3;
    SET @sum=@n*@m;
    SELECT @sum;

    四、存储过程

    1、含义:将一组合法的SQL语句封装在一起构成存储过,程类似函数但存在区别。

    2、创建语法:

    CREATE PROCEDURE 存储过程名(参数列表)
    BEGIN
    	存储过程体(一组合法的SQL语句)
    END

    存储过程创建后在SQLyog中位置:

    注意:

    ①参数列表包含:参数模式,参数名,参数类型。

    ②参数模式:in(输入)、out(输出)、inout(即可输入也可输出)

    ③如果存储过程体仅仅只有一句话,begin end可省略。

    ④SQL语句结尾要添加分号,存储过程结尾也要使用结束符号,结束符号要使用delimiter自定义

    delimiter $

    案例1:创建一个作用为向admin中插入一条新记录的存储过程(不使用参数模式)

    DELIMITER $
    CREATE PROCEDURE ins()
    BEGIN
    	INSERT INTO admin(username,PASSWORD) 
    	VALUES('Cindy',666666);
    END$

    调用:

    CALL ins()$

    注意:调用的 时候以$结尾因为创建存储过程前将结束语句修改为了$。

    案例2:创建存储过程实现根据女生名,查询对应的男神信息(使用参数模式IN)

    CREATE PROCEDURE cre(IN girl_name VARCHAR(20))
    BEGIN
    	SELECT bo.boyName
    	FROM boys bo
    	INNER JOIN beauty b ON bo.id=b.boyfriend_id
    	WHERE b.name=girl_name;
    END$

    查询:

    CALL rel('关晓彤')$

    运行结果:

    案例3:传入a和b两个值,最终a和b都翻倍并返回(参数中包含INOUT)

    CREATE PROCEDURE my_6(INOUT a INT,INOUT b INT)
    BEGIN
    	SET a=a*2;
    	SET b=b*2;
    END$

    查询:

    SET @m=5,@n=6$
    CALL my_6(@m,@n)$
    SELECT @m,@n$

    注意:由于参数a、b即作为参数,也作为返回值,所以要先定义变量便于查询其返回值。

    3、删除存储过程:

    DROP PROCEDURE 存储过程名;

    4、查看存储过程:

    SHOW CREATE PROCEDURE 存储过程名;

    五、函数

    1、与存储过程的区别:函数有且仅有一个返回值,存储过程无要求。

    2、创建语法:

    CREATE FUNCTION 函数名(参数列表) RETURNS 返回类型
    BEGIN
    	函数体
    END

    注意:

    ①参数列表包含变量名和变量类型

    ②函数体中必须要包含return

    ③begin end的用法和存储过程相同

    函数创建后再SQLyog中的位置:

    3、调用语法:

    SELECT 函数名(参数);

    案例1:返回公司员工个数

    #创建函数
    DELIMITER $
    CREATE FUNCTION counts() RETURNS INT 
    BEGIN
    	SET @num=0; #注意分号的使用
    	SELECT COUNT(*) INTO @num
    	FROM employees;
    	RETURN @num;
    END$
    #调用函数
    SELECT counts();

    注意:

    ①函数的创建语法与存储过程的创建语法不同,使用returns。

    ②MySQL8.0版本创建函数时报错,解决方法如下:点击访问 

    4、查看、删除语法与存储过程相似,将procedure修改为function即可。

    六、流程控制结构

    1、if结构(if函数)

    if 条件1 then 语句1;
    elseif 条件2 then 语句2;
    ....
    else 语句n;
    end if;

    注意:if结构只能用在begin end中

    2、循环结构:while、loop、repeat

    ①循环控制:

      iterate类似于 continue,继续,结束本次循环,继续下一次 ​

      leave 类似于 break,跳出,结束当前所在的循环

    ②语法:

    #1.while
    【标签:】while 循环条件 do
        循环体;
    end while【 标签】;
    #2.loop
    【标签:】loop
        循环体;
    end loop 【标签】;
    #3.repeat
    【标签:】repeat
        循环体;
    until 结束循环的条件
    end repeat 【标签】;

    案例:批量插入,根据次数插入到admin表中多条记录

    DROP PROCEDURE pro_while1$
    CREATE PROCEDURE pro_while1(IN insertCount INT)
    BEGIN
    	DECLARE i INT DEFAULT 1;
    	WHILE i<=insertCount DO
    		INSERT INTO admin(username,`password`) VALUES(CONCAT('Rose',i),'666');
    		SET i=i+1;
    	END WHILE;
    	
    END $

    调用:

    SELECT pro_while1(100)$

    注意:因为没有返回值,所以使用存储过程实现。

  • 相关阅读:
    A simple class to play sound on netcf
    NETCF运行平台检测
    [翻译]XNA 3.0 Game Programming Recipes之thirtynine
    [翻译]XNA 3.0 Game Programming Recipes之thirtyfour
    [翻译]XNA 3.0 Game Programming Recipes之thirtyseven
    [翻译]XNA 3.0 Game Programming Recipes之thirtysix
    [翻译]XNA 3.0 Game Programming Recipes之thirtyfive
    [翻译]XNA 3.0 Game Programming Recipes之forty
    [翻译]XNA 3.0 Game Programming Recipes之thirtyeight
    [翻译]XNA 3.0 Game Programming Recipes之fortyone
  • 原文地址:https://www.cnblogs.com/ldu-xingjiahui/p/12594037.html
Copyright © 2011-2022 走看看