首页 > 数据库 >k01_mysql

k01_mysql

时间:2024-03-11 19:33:54浏览次数:19  
标签:autocommit k01 触发器 test1 -- student mysql SELECT

视图---事务---游标---存储过程---触发器

1、视图

创建视图

-- 创建一个名为:view_student_info 的视图,将student的所有信息放在视图中
CREATE VIEW view_student_info AS SELECT *FROM student
-- 指定创建视图名中的字段名称(默认创建的视图字段与原表完全相同,但是也可以不同)
CREATE VIEW v_student_info(a,b,c,d,e) AS SELECT sno,sname,ssex,sage,sdept FROM  student 

查询视图:

#跟插叙数据表一样
#查询视图名为:v_student_info的视图
SELECT *FROM v_student_info 
#查询视图:v_student_info的定义
DESCRIBE v_student_info

image-20230510213522201

image-20230510214042926

2、事务

数据库中的事务是指对数据库执行一批操作,
在同一个事务当中,这些操作最终要么全部执行成功,要么全部失败,
不会存在部分成功的情况。

事务的几个特性:
原子性
一致性
隔离性
持久性

mysql中事务默认是隐式事务,执行insert、update、delete操作的时候,数据库自动开启事务、提交或回滚事务。
是否开启隐式事务是由变量autocommit控制的。
所以事务分为隐式事务和显式事务。
-- 查看autocommit是否开启了自动提交         autocommit为ON表示开启了自动提交。
SHOW VARIABLES like 'autocommit';

-- 以下是显示提交
-- COMMIT
-- 创建一个表格,里面仅仅有一个名a的字段
CREATE TABLE test1(a int);
SELECT *FROM test1;
-- 设置不自藕丁提交事务
set autocommit=0;
-- 查看autocommit是否开启了自动提交,目前value为OFF
SHOW VARIABLES like 'autocommit';
-- 向test1表中插入一条数据,比如插入:55
INSERT INTO test1 VALUES(55)
-- 查询test1表看看当前插入的数据是否存在
SELECT *FROM test1;
COMMIT;
SET autocommit=1;
SHOW  VARIABLES LIKE "autocommit";
-- 事务回滚
-- 设置autocommit中的value状态值为:OFF(0)
SET autocommit=0;
-- 查看变量autocommit是否开启了自动提交
SHOW  VARIABLES LIKE "autocommit";
-- 向test1表中插入一个数据
INSERT INTO test1 VALUES(100)
-- 查询test1表中的数据
SELECT * FROM test1;
-- 回滚事务操作
ROLLBACK;
-- 查询test1表中的数据
SELECT * FROM test1;-- 事务回滚了
SET autocommit=1;
SELECT * FROM test1;

3、存储过程

类似yu函数或者方法,但是写法可能不同

1.创建一个存储过程

创建一个mypro的存储过程,其中传入变量a,b为int类型,输出类型为sum也为int类型
CREATE PROCEDURE mypro
(IN a INT,IN b INT,OUT sum INT)
BEGIN
SET sum=a+b;
END;
  • IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量);
  • OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量);
  • INOUT输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)。

2.使用mypro存储过程

CALL mypro(15,23,@s);-- 调用存储过程
SELECT @s;  -- 显示刚刚调用的存储过程中输出逇@s的值

image-20230511165329027

-- 使用declare声明变量,这个是在存储过程中使用的变量,只可以在存储过程汇中使用
-- 创建一个ms的一个存储过程,在其中声明变量
CREATE PROCEDURE ms()
BEGIN
-- 声明一个变量,变量名为a
DECLARE a VARCHAR(10);
SET a="我是a变量";
-- SELECT *FROM student WHERE sno!=a;
SELECT a;

END

CALL ms();

4、游标

MySQL 中使用 **DECLARE** 关键字来声明游标,并定义相应的 SELECT 语句,根据需要添加 WHERE 和其它子句。其语法的基本形式如下:

DECLARE cursor_name CURSOR FOR select_statement;

其中,cursor_name 表示游标的名称;select_statement 表示 SELECT 语句,可以返回一行或多行数据。

1.声明游标

-- 游标--只能在存储过程中使用
-- 创建一个名为:testyoubiao的存储过程声明一个名为nameYouBiao的游标,
CREATE PROCEDURE testyoubiao()
BEGIN
DECLARE nameYouBiao CURSOR FOR
SELECT sname FROM student;
END;

2.使用游标

CREATE DEFINER=`root`@`localhost` PROCEDURE `testyoubiao3`()
BEGIN
-- 声明变量
DECLARE a VARCHAR(10);
DECLARE b VARCHAR(10);
DECLARE c VARCHAR(10);
DECLARE d VARCHAR(10);
DECLARE e VARCHAR(10);
-- 声明游标
DECLARE nameYouBiao CURSOR FOR
SELECT * FROM student WHERE sno=200215121;
OPEN nameYouBiao;#打开游标
-- 使用游标
FETCH nameYouBiao INTO a,b,c,d,e;#注意:游标字的段数要跟要分赋值的变量数,数量相同
SELECT a;
SELECT b;
SELECT c;
SELECT d;
END

5、触发器

在MySQL中创建触发器通过SQL语句CREATE TRIGGER来实现,其语法形式如下: 
CREATE trigger trigger_name BEFORE|AFTER trigger_EVENT     
ON TABLE_NAME FOR EACH ROW trigger_STMT 
  • 参数trigger_name表示要创建的触发器名;
  • 参数BEFORE和AFTER指定了触发器执行的时间,前者在触发器事件之前执行触发器语句,后者在触发器事件之后执行触发器语句;
  • 参数trigger_EVENT表示触发事件,即触发器执行条件(触发事件),包含DELETE、INSERT和UPDATE语句;
  • 参数TABLE_NAME表示触发事件的操作表名;
  • 参数FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器;
  • 参数trigger_STMT(sql语句)表示激活触发器后被执行的语句。执行语句中如果要引用更新记录中的字段,对于INSERT语句,只有NEW是合法的,表示当前已插入的记录;对于DELETE语句,只有OLD才合法,表示当前删除的记录;而UPDATE语句可以和NEW(更新后)以及OLD(更新前)同时使用。

注意:

不能创建具有相同名字的触发器。
对于具有相同触发程序动作时间和事件的给定表,不能有两个触发器(比如after insert插入之后有一个触发器那么就不能再有触发器是after的了,但是before insert是可以的)。
因此,在创建触发器之前,需要查看MySQL中是否已经存在该标识符的触发器和触发器的相关事件。

表结构如下:

student:

image-20230510212515995

course:

image-20230510212456860

sc:

image-20230510212533697

标签:autocommit,k01,触发器,test1,--,student,mysql,SELECT
From: https://www.cnblogs.com/2580p/p/18066880

相关文章

  • mysql查询几天之前,或某个时间段之间的每天记录数量,不存在补全0
    直接看SQL(非常简单,通俗易懂)biz_requirement_order:业务表名create_time:业务表时间字段,依据这个字段统计数量num:数量返回值别名,可以随意改t表:查询所有符合条件的日期a表:业务表中根据日期分组,查询每天的记录数量最后使用左连接查询,将两个集合合并返回最终结果查询几天之前......
  • 一文学会JDBC实现java和mySQL的数据连接(尚硅谷学习课程代码+笔记+思路总结)
    JDBC是指数据库连接技术,用于java连接mySQL等数据库。本文详细介绍了尚硅谷课程中JDBC的学习内容和补充知识。概述java语言只提供规范接口,存在于java.sql.javax.sql包下,然后数据库软件根据java提供的规范实现具体的驱动代码(jar)jar包是java程序打成的一种压缩包格式,只要导入就......
  • MySQL如果数据存在则更新,不存在则插入
    如果数据存在则更新,不存在则插入,MySQL有duplicate、replaceinto、replace三种方式如何更新数据?insertignoreinto又是如何插入数据的呢?准备表和基础数据测试MySQL版本:8.0.35usetestdb;#droptabletb_student;CREATETABLE`tb_student`(`id`intNOTNULLAUTO_IN......
  • MySQL如何选择时间类型
    日常业务中经常需要记录时间,如订单生成时间、记录保存时间、更新时间等。如何选择MySQL表的时间字段类型呢?一句话,看业务,具体是看业务是否会跨时区。MySQL的日期类型可以用于记录日期的格式有:Datatype实例备注DATE'0000-00-00'日期(年月日)TIME'00:00:00'......
  • MySQL 进阶实战
    目录1.数据库设计与规范化1.1.实体关系模型(ER模型)简介1.2.数据库设计的范式化过程1.3.设计常见问题和解决方案2.高级SQL技巧2.1.聚合函数和分组查询2.2.子查询和联合查询2.3.视图的创建和使用2.4.存储过程和触发器的概念3.数据库连接与应用开发3.1.使用编程......
  • MySQL分组之后按照固定顺序排序 FIELD
    以下回答来自通义千问:要按照特定顺序显示type字段的统计结果,MySQL并没有提供直接按指定顺序进行GROUPBY的方法。但是,你可以结合ORDERBY语句和FIELD()函数来实现这一需求。FIELD()函数可以将某个字段的值与一系列指定值进行比较,并按照指定值的顺序排序。假设你希望固定的type顺......
  • mysql5.7MHA配置
    准备工作,三台服务器,安装mysql5.7-glibc版本,做主从配置,用gtid模式。安装mysql1、准备安装包[root@hk2install]#llmysql-5.7.32-linux-glibc2.12-x86_64.tar.gz-rw-r--r--1rootroot661214270Jan2019:59mysql-5.7.32-linux-glibc2.12-x86_64.tar.gz 2、解压缩,环......
  • MySQL实现事务隔离的原理
    一、readview四个字段create_trx_id:创建该readview的事务的事务idm_ids:创建readview时,当前数据库中的活跃事务(指启动但还没提交的事务)min_trx_id:m_ids的最小值max_trx_id:创建readview后,下一个事务的id二、聚簇索引的隐藏列trx_id:最近一次改动该聚簇索引记录的事务idrol......
  • Mysql和Clickhouse数据查询-按照时间分组统计并且对无无数据的日期补0
      最近在做数据查询需求的时候,遇到按照时间分组查询统计指标的需求,比如说查询模块的最近15天访问数据量,没有数据的日期补0,以前对于这种类似的需求都是通过代码来补数据,想试试sql实现这种查询,因此查询了不少文章,对于类似实现方法的文章网上也有很多,差异也很多,因此这篇文章只......
  • MySQL 8.0.26版本升级32版本查询数据为空的跟踪
    某业务系统将MySQL8.0.26升级为GreatSQL8.0.32-24后,某些特定的SQL语句不能查询到数据。经测试MySQL8.0.32也存在相同的问题此BUG已在GreatSQL8.0.32-25版本中解决MySQL8.0.26版本升级32版本查询数据为空的跟踪接到客户反馈的问题后,对问题进行了复现和分析。版本信......