首页 > 数据库 >MySQL 学习笔记 进阶(存储过程 下,存储函数,触发器,锁 上)

MySQL 学习笔记 进阶(存储过程 下,存储函数,触发器,锁 上)

时间:2024-07-30 16:17:21浏览次数:11  
标签:语句 存储 END 进阶 MySQL 游标 触发器 SQL

存储过程

 

存储过程-if判断

  • 语法
IF 条件1 THEN
        ......
ELSEIF 条件2 THEN
        ......
ELSE
        ......
END IF;

 

存储过程-参数

  •  用法
CREATE PROCEDURE 存储过程名称([ IN/OUT/INOUT 参数名 参数类型 ])
BEGIN
    -- SQL语句
END;

 

存储过程-case

  • 语法一
CASE case_value
    WHEN when_value1 THEN statement_list1
    [ WHEN when_value2 THEN statement_list2 ] ...
    [ ELSE statement_list ]
END CASE;
  • 语法二
CASE 
    WHEN search_condition1 THEN statement_list1
    [ WHEN search_condition2 THEN statement_list2 ] ...
    [ ELSE statement_list ]
END CASE;

 

存储过程-循环

  • while

while循环是有条件的循环控制语句。满足条件后,再执行循环体中的SQL语句。具体语法为:

#先判定条件,如果条件为true,则执行逻辑,否则,不执行逻辑
WHILE 条件 DO
    SQL逻辑
END WHILE;
  • repeat

repeat是有条件的循环控制语句,当满足条件的时候退出循环。具体语法为:

#先执行一次逻辑,然后判断逻辑是否满足,如果满足,则退出。如果不满足,则继续下一次循环。
REPEAT 
    SQL逻辑...
    UNTIL 条件
END REPEAT;
  • loop

loop实现简单的循环,如果不在SQL逻辑中增加退出循环的条件,可以用来实现简单的死循环。loop可以配合以下两个语句使用:

LEAVE:配合循环使用,退出循环。

ITERATE:必须用在循环中,作用是跳过当前循环剩下的语句,直接进入下一次循环。

[begin_label:] LOOP
     SQL逻辑...
END LOOP [end_label];
LEAVE label; -- 退出指定标记的循环体
ITERATE label; -- 直接进入下一次循环

 

存储过程-游标

游标是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理。游标的使用包括游标的声明、OPEN、FETCH和CLOSE,其语法分别如下。

  • 声明游标
DECLARE 游标名称 CURSOR FOR 查询语句;
  • 打开游标
OPEN 游标名称;
  • 获取游标记录
FETCH 游标记录 INTO 变量 [, 变量 ];

 

存储过程-条件处理程序

条件处理程序可以用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤。具体语法为:

DECLARE handler_action HANDLER FOR condition_value [, condition value] ... statement;

handler_action
    CONTINUE:继续执行当前程序
    EXIT: 终止执行当前程序
condition_value
    SQLSTATE sqlstate_value: 状态码,如02000
    SQLWARNING: 所有以01开头的SQLSTATE代码的简写
    NOT FOUNG: 所有以02开头的SQLSTATE代码的简写
    SQLEXCEPTION: 所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE代码的简写

 

存储函数

 

存储函数

存储函数是有返回值的存储过程,存储函数的参数只能是IN类型的。具体语法如下:

CREATE FUNCTION 存储函数名称([ 参数列表 ])
RETUREN type [characteristic ...]
BEGIN
    -- SQL语句
    RETURN ...;
END;

characteristic说明:
DETERMINISTIC: 相同的输入参数总是产生相同的结果
NOT SQL: 不包含SQL语句
READS SQL DATA: 包含读取数据的语句,但不包含写入数据的语句。

 

触发器

 

触发器-介绍

触发器是与表有关的数据库对象,指在insert/update/delete之前或之后,触发并进行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。

使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发。

  •  创建
CREATE TRIGGER trigger_name
BEFORE/AFTER INSERT/UPDATE/DELETE
ON tbl_name FOR EACH ROW -- 行级触发器
BEGIN
    trigger_stmt;
END;
  • 查看
SHOW TRIGGERS;
  • 删除
DROP TRIGGER [schema_name.]trigger_name; -- 如果没有指定schema_name,默认为当前数据库。

 

 

锁-概述

  • 介绍

锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU,RAM,I/O)的征用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。

  • 分类

MySQL中的锁,按照锁的粒度分,分为以下三类:

    · 全局锁:锁定数据库中的所有表。

    · 表级锁:每次操作锁住整张表。

    · 行级锁:每次操作锁住对应的行数据。

 

锁-全局锁-介绍

全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。

其典型的使用场景是做全库的逻辑备份,对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。

 

数据库中加全局锁,是一个比较重的操作,存在以下问题:

  1. 如果在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。
  2. 如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog),会导致主从延迟。

在InnoDB引擎中,我们可以在备份时加上参数 --single-transaction参数来完成不加锁的一致性数据备份。

mysqldump --single-transaction -uroot -p123456 itcast > itcast.sql

 

标签:语句,存储,END,进阶,MySQL,游标,触发器,SQL
From: https://www.cnblogs.com/handsome-zyc/p/18331961

相关文章

  • Mysql设置自增ID
    1、创建新表时设置ID自增:CREATETABLEyour_table_name(idINTNOTNULLAUTO_INCREMENT,nameVARCHAR(255),PRIMARYKEY(id));2、为现有表添加自增ID:ALTERTABLEyour_table_nameADDCOLUMNidINTNOTNULLAUTO_INCREMENTPRIMARYKEY;3......
  • Mysql 行列转换
    mysql用case CREATETABLE`stu`(`name`varchar(255)DEFAULTNULL,`subject`varchar(255)CHARACTERSETutf8mb4COLLATEutf8mb4_0900_ai_ciDEFAULTNULL,`result`varchar(255)DEFAULTNULL)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4COLLATE=utf8mb4_090......
  • 如何使用 python 在 influxdb 中创建组织和存储桶
    如何使用python在influxdb中创建组织和存储桶?我有一个python脚本,用于在influxdb中创建组织和存储桶,但它无法工作并返回未经授权的响应任何人可以使用influxdbapi帮助我解决这个问题吗?HTTPresponsebody:{"code":"unauthorized","message":"write:org......
  • mysql 8 临时表空间
    mysql>optimizetableiuap_apdoc_coredoc.productapplyrange;+--------------------------------------+----------+----------+-------------------------------------------------------------------+|Table|Op|Msg_type|......
  • mongodb数据迁移mysql
    1、安装MongoDB参考链接https://blog.csdn.net/qq_45664055/article/details/119794071http://bbs.itying.com/topic/5bd675d80e525017c449479d1.1创建repo文件,MongoDB数据库不在yum的官方仓库,通过配置如下文件,可以通过yum下载MongoDBvi/etc/yum.repos.d/mongodb-org-4......
  • 忘记MySQL密码的处理措施(取消密码认证,直接登录)
    忘记MySQL密码/etc/my.cnf.d/mysql-server.cnf删除#号,取消注释skip-grant-tables选项下参数重启mysqld服务后,直接回车登录查看status状态直接修改密码无法成功,提示在skip-grant-tables选项下使用FLUSHPRIVILEGES;命令刷新权限即可回到上面删除掉skip-grant-tables......
  • MYSQL学习总结
    事务:一个不可拆分的操作,要么全部执行完,要么全都不执行;隔离级别:总共有四个,分别是ReadUncommitted(读取未提交内容),ReadCommitted(读取提交内容),RepeatableRead(可重读),Serializable(可串行化);ReadUncommitted(读取未提交内容):一个事务可以读取另一个事务未提交的数据;如果另一个事务......
  • Mysql时间互转
    第一种情况:日期转字符串1、函数:date_format(date,format)selectdate_format(now(),'%Y-%m-%d%H:%i:%S');第二种情况:日期转时间戳1、函数:unix_timestamp(data)selectunix_timestamp(now());第三种情况:字符串转日期1、函数:str_to_date(str,format);注:format格式必须......
  • MySQL安装
    1、安装成功的步骤#获取rpmsudorpm-Uvhhttps://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm#直接安装yuminstall-ymysql-community-server#查看服务systemctlstatusmysql2、安装成功后续#安装成功后续#启动systemctlstartmysqld.s......
  • 分享一个MySQL数据库表结构导出word文档最方便的方法
    原文链接:https://blog.csdn.net/typ1805/article/details/836587081、使用的是MySQL-Front工具,这个工具使用非常方便,尤其是导出数据的时候,几百万的数据一两分钟就导完了,推荐使用。MySQL-Front下载(只有3.93M):https://mysql-front.en.softonic.com/注:新版本和老版本的区别比较大,有......