36. MySQL补充知识点

news/2024/11/28 22:07:44/文章来源:https://www.cnblogs.com/hbutmeng/p/18518926

1. 视图

1.1 理论

[1] 什么是视图

视图是通过查询得到一张虚拟表,并保存下来,后续可以直接使用。

视图也是一张表。

在计算机科学中,视图(View)是一种虚拟表,其内容是一个或多个基本表的查询结果。 

与基本表不同,视图不存储实际的数据,而是根据创建视图时的查询语句在使用时进行实时计算。

[2]视图的作用

如果需要频繁操作一张虚拟表(表并不存在,只是结构与表类似),就可以制作成视图,降低操作复杂度。

[3]注意事项

视图只有表结构没有实际数据,所展示的数据来自于原本表。

视图可以对原本表中的数据进行增删改查。

但是建议视图只用来查询,不要对原本表中的数据进行增加、删除、修改。

[4]语法

create view 视图名(即表名) as SQL查询语句;

1.2 代码示例

原本表数据

在原本表的基础上创建视图

create view virtual_emp as select * from emp where id>3;

查看视图数据

查看视图结构

删除视图  drop view 视图名;

2. 触发器

2.1 理论

(1)概念

在对表数据进行增、删、改的操作下,自动触发的功能

(2)触发器使用场景

表数据增加之前、增加之后

表数据修改之前、修改之后

表数据删除之前、删除之后

(3)创建触发器语法

create trigger 触发器名称 before/after insert/update/delete on 表名 for each row begin SQL语句 end 结束符

因为SQL语句也包含分号;  因此创建触发器之前要将结束符由 ; 修改为$$,创建完成之后再改回 ;

2.2 代码示例

(1)创建命令信息表

记录哪个用户、在哪个时间、运行了哪条命令、是成功还是失败

create table command(id int primary key auto_increment comment "主键",username varchar(32) comment "用户",cmd varchar(32) comment "命令",sub_time datetime comment "运行时间",status enum("success","failure") comment "运行状态"
);

(2)创建日志记录表

记录运行错误的命令、运行错误命令的时间

create table error_log(id int primary key auto_increment comment "主键",error_cmd varchar(64) comment "运行错误的命令",error_time datetime comment "日志时间"
);

(3)创建触发器

delimiter $$  --将默认的结束符由;改为$$
create trigger tri_after_insert_command after insert on command for each row  #在command表插入数据之后触发
begin
if NEW.status='failure'  #新记录都会被MySQL封装成NEW对象
then insert into error_log(error_cmd,error_time) values(NEW.cmd,NEW.sub_time);
end if;  #if语句结尾固定搭配
end $$
delimiter ;  --完成将结束符改回分号

以上  #注释的内容是在一条完整的创建触发器的语句里面,实际运行时不去掉这些注释会报错

查看触发器:

(4)向command表中插入数据,满足指定条件时,触发器运行

insert into command(usename, cmd, sub_time, status) values('avril', 'ls', NOW(), "success"),('lavigne', 'lss', NOW(), "failure");

"failure"的相关数据被记录到表error_log中

(5)删除触发器

drop trigger 触发器名称;

3. 事务

3.1 理论

(1) 概念

事务是指一系列相关操作的集合,这些操作被视为一个不可分割的工作单元。

一个事务可以包含多条SQL语句,这些语句要么同时执行成功,要么同时执行失败。

(2)事务的四大特性

ACID

A(Atomicity):原子性

  事务被视为一个原子操作,不可再分割

  要么所有的操作都成功执行,要么所有的操作都会被回滚到事务开始前的状态,确保数据的一致性。

C(Consistency):一致性  

  事务执行前后,数据库应保持一致的状态。
  在事务开始之前和结束之后,数据库必须满足所有的完整性约束,如数据类型、关系等。

I(Isolation):隔离性

  事务的执行结果对其他并发执行的事务是隔离的。
  即一个事务的执行不应受到其他事务的干扰,各个事务之间应该相互独立工作,从而避免数据的不一致性。

D(Durability):持久性

  指一旦事务提交(commit)成功,它对数据库的改变就是永久性的,即使系统随后发生故障,这些改变也不会丢失。

  持久性确保了在事务成功提交后,即使系统崩溃或电源故障,数据仍然会被保留在数据库中。

3.2 代码示例

 (1)创建表,准备数据

create table user(id int primary key auto_increment,name varchar(32),money int
)insert into user(name, money) values('avril', 1000),('lavigne', 1000),('ronaldo', 1000);

(2)事务操作

[1]开启一个事务

start transaction;

[2]在事务里面编写SQL语句

update user set money=900 where name='avril';
update user set money=1010 where name='lavigne'; 
update user set money=1090 where name='ronaldo';

[3]事务回滚:返回执行事务操作之前的数据库状态

rollback;

[4]提交事务:类比于将数据从内存保存到硬盘中,事务提交之后无法回滚

commit;

4. 存储过程

4.1 理论

(1)概念

存储过程类比于python中的自定义函数

存储过程的内部包含了一系列可以执行的SQL语句,位于MySQL的服务端中;可以通过调用存储过程触发内部的SQL语句

存储过程是关系型数据库中存储的一组预定义的SQL语句集合,可以接收参数并返回结果

(2)语法

delimiter $$
create procedure 存储过程名称(形参1,形参2...)
beginsql语句;
end$$
delimiter ;

4.2 代码示例

(1)创建存储过程

delimiter $$create procedure p1(in m int,  # in表示这个参数必须只能是传入不能被返回出去in n int,out res int  # out表示这个参数可以被返回出去,inout表示即可以传入也可以被返回
)
beginselect name from emp where dep_id > m and dep_id <n;set res = 666;  # 设置res变量的值,用来标识当前的存储过程代码确实执行了 
end $$delimiter ;

(2)调用存储过程

调用存储过程时,传入必要的参数,获取结果

 查看存储过程具体信息

show create procedure p1;

查看所有存储过程

show procedure status;

删除存储过程

drop procedure p1;

5. 内置函数

MySQL的内置函数只能在SQL语句中使用

CONCAT(str1, str2, ...): 将多个字符串拼接成一个字符串

SUBSTRING(str, start, length): 切片

UPPER(str): 将字符串转换为大写
LOWER(str): 将字符串转换为小写

LENGTH(str): 返回字符串的长度

Trim、LTrim、RTrim: 移除指定字符

TRIM()函数可以删除字符串开头和结尾处的所有指定字符。
LTRIM()和RTRIM()分别只删除开头和结尾的指定字符。

Left、Right: 获取左右起始指定个数字符

日期和时间函数:
NOW(): 返回当前日期和时间。
CURDATE(): 返回当前日期。
CURTIME(): 返回当前时间。
DATE_FORMAT(date, format): 格式化日期。

数值函数:
ROUND(num, decimals): 对数值进行四舍五入。
FLOOR(num): 返回不大于给定数值的最大整数。
CEILING(num): 返回不小于给定数值的最小整数。
ABS(num): 返回给定数值的绝对值。

6. 流程控制

# MySQL if判断
if 条件 then
子代码
elseif 条件 then
子代码
else
子代码
end if;# MySQL while循环
DECLARE num INT ;
SET num = 0 ;
WHILE num < 10 DO
SELECT num ;
SET num = num + 1 ;
END WHILE ;

7. 索引

 7.1 索引的概念

索引(在MySQL中也叫做“键(key)”)是存储引擎用于快速找到记录的一种数据结构,这也是索引最基本的功能。
索引对于良好的性能非常关键。
数据量越大时,索引对性能的影响也越重要,好的索引可以将查询性能提高几个数量级。
在数据量较小且负载较低时,不恰当的索引对性能的影响可能还不明显,但是在数据量逐渐增大时,糟糕的索引会使MySQL的性能急剧的下降。
索引优化是查询性能优化最有效的手段。
如果想要在一本书中找到某个特定主题,一般会先看书的目录,找到对应的页码,然后直接翻到对应的页码即可查看。
在MySQL中,存储引擎用类似的方法使用索引
首先在索引中找到对应的值
然后根据匹配的索引记录找到对应的数据行。
简单的说,数据库索引类似于书前面的目录,能加快数据库的查询速度。

7.2 MySQL中索引的类型

创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建 对应列的索引。
索引在MySQL中也叫键,是存储引擎用于快速查找记录的一种数据结构
主键约束(PRIMARY KEY)
唯一约束(UNIQUE)
index key
外键约束(FOREIGN KEY)
foreign key
不是用来加速查询的
primary key/unique key
不仅可以加速查询速度,还具有对应的约束条件
index key
只有加速查询速度的功能

7.3 索引的本质

通过不蹲的缩小想要的数据范围筛选出最终的结果
同时将随机事件(一页一页的翻)变成顺序时间(先找目录再找数据)
也就是说我们有了索引机制,我们可以总是用一种固定的方式查询数据

7.4 索引的缺点

当表中有大量数据存在的前提下,创建索引的速度回非常慢
在索引创建完毕后,对表的查询性能会大幅度的上升,但是写的性能也会大幅度下降
不要随意地创建索引

7.5 索引的使用场景

要考虑对数据库表的某列或某几列创建索引,需要考虑以下几点:
数据量较大,且经常对这些列进行条件查询。
该数据库表的插入操作,及对这些列的修改操作频率较低。
索引会占用额外的磁盘空间。
满足以上条件时,考虑对表中的这些字段创建索引,以提高查询效率。
反之,如果非条件查询列,或经常做插入、修改操作,或磁盘空间不足时,不考虑创建索引。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/843108.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

车间工人违规行为智能识别方案

车间工人违规行为智能识别方案基于深度学习的视频分析系统,车间工人违规行为智能识别方案能够利用工业相机实时监测工人在生产线上的行为,系统不仅能够监测工人的操作行为,还能够监控整个生产流程。例如,它可以监测材料选择需要经过的环节数量,手动翻转的次数,以及上料动…

人员禁区闯入行为检测算法

人员禁区闯入行为检测算法通过现场监控相机捕捉监控区域内的实时图像,人员禁区闯入行为检测算法基于YOLOv7和CNN对图像进行分析,当检测到禁区闯入行为时,系统会立即触发告警。支持与第三方设备通信,发送开关量信号,以及将告警信息推送给后台值班人员。通过实时监控和快速响…

MySQL底层概述—1.InnoDB内存结构

大纲 1.InnoDB引擎架构 2.Buffer Pool 3.Page管理机制之Page页分类 4.Page管理机制之Page页管理 5.Change Buffer 6.Log Buffer1.InnoDB引擎架构 (1)InnoDB引擎架构图 (2)InnoDB内存结构(1)InnoDB引擎架构图 下面是InnoDB引擎架构图,主要分为内存结构和磁盘结构两大部分。(2)I…

[Vue] Watch and WatchEffect

WatchLet’s look at another simple example using our composition API. Here’s some code that has a simple search input box, uses the search text to call an API, and returns the number of events that match the input results. <template><div>Searc…

【java编程】Unsafe 类

Unsafe 类不是一个 ClassLoader, 但是为什么要在本篇文章提起, 其实是因为该类可以进行注入恶意类到 JVM 中. Unsafe 类简介 sun.misc.Unsafe 类是一个提供底层、不安全的操作,比如直接内存访问、线程调度、原子操作等功能的工具类。 这个类主要被Java内部库使用,比如Java的…

山体落石泥石流自动监测摄像机

山体落石泥石流自动监测摄像机捕获的图像数据将对图像进行分析,山体落石泥石流自动监测摄像机识别出山体的位移、裂缝、滑坡等异常现象。算法的训练需要大量的山体图像数据,包括正常和异常状态的图像,以确保其识别的准确性。一旦AI系统识别出山体失稳的迹象,它会立即触发报…

【java编程】Xalan ClassLoader

Xalan 是 Java 中用于操作 XML 的一个库,它是 Apache XML 项目的一部分,主要用于将 XSLT(Extensible Stylesheet Language Transformations)转换为可执行代码,从而实现XML文档的转换。 XSLT 的理解 当然了, 我们先理解该模块如何使用之后, 我们再研究它的妙用, XSLT 说白了…

[游记]CSP2024 游记

这是一篇迟到的游记,为什么呢?因为作者已经成为文化课选手了。 Day-1 晚上 \(6:00\) 到了宾馆,在路上准备了一下面基事宜。在车上昏昏沉沉,结果下了车精神抖擞了。 简单布置之后开始摆烂,这是符合考前规范的好事。某游戏连跪十五局。rp -- 。我希望这是给我第二天攒 rp。 …

[笔记]动态规划优化(斜率优化,决策单调性优化)

本文主要记录某些动态规划思路及动态规划优化。 首先先把以前写过的斜率优化祭出来。 斜率优化 \(\text{P5017 [NOIP2018 普及组] 摆渡车}\) 经典例题。 设 \(f_i\) 表示最后班车在 \(i\) 时刻发车,所有人等待时间和的最小值。(这里的所有人是指到达时刻小于等于 \(i\) 的所有…

基于Java+SpringBoot+Mysql实现的点卡各种卡寄售平台功能设计与实现一

后台功能:寄售管理、提现管理、订单管理、认证管理、公告管理、用户管理等。 该系统总共21张表,代码整洁,每个功能、接口上都有注释说明。 部分功能:前台用户信息实体类Entity、实名认证信息实体类Entity、银行卡类型信息实体类Entity、寄售卡类型信息实体类Entity、寄售卡…

【java编程】BCEL ClassLoader

BCEL 介绍 BCEL的全名应该是Apache Commons BCEL,属于Apache Commons项目下的一个子项目。Apache Commons大家应该不陌生,反序列化最著名的利用链就是出自于其另一个子项目——Apache Commons Collections。 BCEL库提供了一系列用于分析、创建、修改Java Class文件的API。就…

借助电脑探究双变量函数问题侧记

记录一次借助电脑探究双变量函数问题的全过程前情概要 偶尔看到下面的习题,想到以前自己整理的双变量函数问题,尝试练手时发现,寻找思路不是很简单的问题,探索一番,对整个过程作以记录,成篇为一侧记 . 典型案例 【2025届高三数学月考3第12题】对于函数 \(f(x)=e^x-x^2+a\…