09视图,触发器,事务,存储过程,函数,流程控制,索引,隔离机制,锁机制,三大范式

【一】视图

(1)视图须知概念
1.什么是视图?
视图就是通过查询得到一张虚拟表,然后保存下来,下次可以直接使用
2.为什么要用视图?
如果要频繁操作一张虚拟表(拼表组成),就可以制作成视图,后续直接操作
注意:视图所获得的虚拟表与原表数据无关
(2)视图相关语法(和表的语法一致)
1.创建视图
create view 视图名(表名) as 虚拟表的查询SQL语句
eg:
CREATE VIEW my_view AS SELECT column1, column2 FROM my_table WHERE condition;
2.查
SELECT * FROM my_view;
3.改
UPDATE my_view SET column1 = value1 WHERE condition;
4.删
DROP VIEW my_view;

【二】触发器

(1)触发器概念
1.什么是触发器
满足对表数据进行增删改的情况下,自动触发的功能,称为触发器
2.触发器的六种使用情况
● 增前
● 增后
● 删前
● 删后
● 改前
● 改后
(2)语法结构
1.
create trigger 触发器的名字 
before/after insert/update/delete 
on 表名 for each row 
beginSQL语句
end
2.查看当前库下所有的触发器信息
show triggers\G;
3.删除当前库下指定的触发器信息
drop trigger 触发器名称;
4.触发器的名字一般情况下建议采用下列布局形式tri_after_insert_t1tri_before_update_t2tri_before_delete_t3
(3)使用实例
表:
CREATE TABLE cmd (id INT PRIMARY KEY auto_increment,USER CHAR (32),priv CHAR (10),cmd CHAR (64),sub_time datetime, #提交时间success enum ('yes', 'no') #0代表执行失败
);
需求:cmd表插入数据的success如果值为no 则去errlog表中插入一条记录
delimiter $$  # 将mysql默认的结束符由;换成$$
create trigger tri_after_insert_cmd after insert on cmd for each row
beginif NEW.success = 'no' then  # 新记录都会被MySQL封装成NEW对象insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time);end if;
end $$
delimiter ;  # 结束之后记得再改回来,不然后面结束符就都是$$了

【三】事务(掌握)

(1)事务概念
"""当让多条SQL语句保持一致性的时候(要么同时成功,要么同事失败),可以考虑使用事务"""
1.什么是事务
事务可以包含诸多SQL语句并且这些SQL语句要么同时执行成功 要么同时执行失败 这是事务的原子性特点
事务的作用
2.四大特性(ACID)
ACIDA:原子性一个事务是一个不可分割的整体 里面的操作要么都成立要么都不成立C:一致性事务必须使数据库从一个一致性状态变到另外一个一致性状态I:隔离性并发编程中 多个事务之间是相互隔离的 不会彼此干扰D:持久性事务一旦提交 产生的结果应该是永久的 不可逆的
(2)事务的使用
 1.创建表及录入数据create table user(id int primary key auto_increment,name char(32),balance int);insert into user(name,balance)values('jason',1000),('kevin',1000),('tank',1000);2.事务操作开启一个事务的操作start transaction;编写SQL语句(同属于一个事务)update user set balance=900 where name='jason';update user set balance=1010 where name='kevin'; update user set balance=1090 where name='tank';事务回滚(返回执行事务操作之前的数据库状态)rollback;  # 执行完回滚之后 事务自动结束事务确认(执行完事务的主动操作之后 确认无误之后 需要执行确认命令)commit;  # 执行完确认提交之后 无法回滚 事务自动结束

【四】存储过程

(1)存储过程的概念
1.什么是存储过程
存储过程就类似于Python中的自定义函数
(2)如何使用存储过程
1.定义
# 相当于定义函数
delimiter $$
create procedure 存储过程的名字(形参1,形参2...)
beginsql 代码
end $$
delimiter ;
2.相当于调用函数
call p1()
3.查看存储过程具体信息
show create procedure pro1;
4.查看所有存储过程
show procedure status;
5.删除存储过程
drop procedure pro1;
(3)使用实例
类似于有参函数delimiter $$create procedure p1(in m int,  # in表示这个参数必须只能是传入不能被返回出去in n int,  out res int  # out表示这个参数可以被返回出去,还有一个inout表示即可以传入也可以被返回出去)beginselect tname from userinfo where id > m and id < n;set res=0;  # 用来标志存储过程是否执行end $$delimiter ;# 针对res需要先提前定义set @res=10;  定义select @res;  查看call p1(1,5,@res)  调用select @res  查看

【五】函数

(1)函数概念
1.什么是函数
跟存储过程是有区别的,存储过程是自定义函数,函数就类似于内置函数
(2)语法
# 1.移除指定字符
Trim、LTrim、RTrim# 2.大小写转换
Lower、Upper# 3.获取左右起始指定个数字符
Left、Right# 4.返回读音相似值(对英文效果)
Soundex
"""
eg:客户表中有一个顾客登记的用户名为J.Lee但如果这是输入错误真名其实叫J.Lie,可以使用soundex匹配发音类似的where Soundex(name)=Soundex('J.Lie')
"""# 5.日期格式:date_format
'''在MySQL中表示时间格式尽量采用2022-11-11形式'''
CREATE TABLE blog (id INT PRIMARY KEY auto_increment,NAME CHAR (32),sub_time datetime
);
INSERT INTO blog (NAME, sub_time)
VALUES('第1篇','2015-03-01 11:31:21'),('第2篇','2015-03-11 16:31:21'),('第3篇','2016-07-01 10:21:31'),('第4篇','2016-07-22 09:23:21'),('第5篇','2016-07-23 10:11:11'),('第6篇','2016-07-25 11:21:31'),('第7篇','2017-03-01 15:33:21'),('第8篇','2017-03-01 17:32:21'),('第9篇','2017-03-01 18:31:21');
select date_format(sub_time,'%Y-%m'),count(id) from blog group by date_format(sub_time,'%Y-%m');

【六】流程控制

# python if判断if 条件:子代码elif 条件:子代码else:子代码
# js if判断if(条件){子代码}else if(条件){子代码}else{子代码}
# MySQL if判断if 条件 then子代码elseif 条件 then子代码else子代码end if;# MySQL while循环DECLARE num INT ;SET num = 0 ;WHILE num < 10 DOSELECT num ;SET num = num + 1 ;END WHILE ;

【七】索引

(1)索引概念
1.什么是索引
索引(在MySQL中也叫做“键(key)”)是存储引擎用于快速找到记录的一种数据结构,这也是索引
2.MySQL中索引的类型
创建主键约束(PRIMARY KEY)、唯一约束(UNIQUE)、外键约束(FOREIGN KEY)时,会自动创建 对应列的索引。
3.索引的本质
通过不断的缩小想要的数据范围筛选出最终的结果 
4.id	name	pwd		post_comment  addr  age 基于id查找数据很快 但是基于addr查找数据就很慢 解决的措施可以是给addr添加索引
'''索引虽然好用 但是不能无限制的创建!!!'''
5.**索引的影响:*** 在表中有大量数据的前提下,创建索引速度会很慢* 在索引创建完毕后,对表的查询性能会大幅度提升,但是写的性能会降低
6.索引的底层数据结构是b+树b树 红黑树 二叉树 b*树 b+树上述结构都是为了更好的基于树查找到相应的数据
(2)索引语法用法
1.查看索引
show index from 表名;
+---------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name   | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| student |          0 | PRIMARY    |            1 | id          | A         |           8 |     NULL | NULL   |      | BTREE      |         |               |
| student |          0 | sn         |            1 | sn          | A         |           8 |     NULL | NULL   | YES  | BTREE      |         |               |
| student |          1 | classes_id |            1 | classes_id  | A         |           2 |     NULL | NULL   | YES  | BTREE      |         |               |
+---------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.01 sec)
2.创建索引
对于非主键、非唯一约束、非外键的字段,可以创建普通索引
create index  索引名 on 表名(字段名);# 索引名的命名规则一般是:index_表名_列名
3.删除索引
drop index 索引名 on 表名
(3)聚集索引(主键索引)
  【1】什么是聚集索引● 聚集索引(Clustered Index)是关系型数据库中的一种索引类型,它决定了表中数据的物理存储顺序。##### ● 在一个表中,只能有一个聚集索引。● 聚集索引对表进行了重新组织,使得数据按照聚集索引的键值顺序存储在磁盘上。● 由于聚集索引决定了数据的物理存储顺序,因此通过聚集索引可以快速地找到特定范围内的数据● MySQL的聚簇索引是基于B+树的数据结构实现的,它会把数据存储在索引的叶子节点上,叶子节点之间按顺序链接,使得按主键进行搜索时速度最快。● 如果没有主键,如果按主键搜索,速度是最快的。【2】聚集索引的特点● 数据的逻辑顺序和物理顺序是一致的,通过聚集索引可以直接访问特定行,因此聚集索引的查询速度很快。##### ● 聚集索引的键值必须是唯一的,不允许重复值存在。● 当表中的数据发生插入、删除或更新操作时,聚集索引需要进行相应的调整以保持数据的有序性,这可能会对性能产生一定影响。#####  ● 如果表中没有定义聚集索引,那么表的数据存储顺序将按照物理地址来存储。● 表不建立主键,也会有个隐藏字段是主键,是主键索引● 主键索引对于按照主键进行查询的性能非常高。
创建:ALTER TABLE table_name ADD PRIMARY KEY (column);
(4)辅助索引(普通索引)
查询数据的时候不可能都是用id作为筛选条件,也可能会用name,password等字段信息,那么这个时候就无法利用到聚集索引的加速查询效果。就需要给其他字段建立索引,这些索引就叫辅助索引
ALTER TABLE table_name ADD INDEX index_name (column);
(5)唯一索引(unique)
【1】什么是唯一索引
● 唯一索引是指该索引的所有值都是唯一的,不允许出现重复值。
【2】语法
● MySQL中可以通过以下语法创建唯一索引
ALTER TABLE table_name ADD UNIQUE KEY index_name (column);
【3】注意事项
● 与普通索引不同的是,如果尝试向包含唯一索引的列中插入重复的值,则会引发错误。
● 唯一索引可以用于确保数据的一致性和完整性,并且可以帮助提高查询性能。
(6)全文索引
【1】什么是全文索引
● 全文索引是一种特殊的索引,它可以用来存储和检索文本数据。
● 全文索引可以包含单词、短语和其他类型的文本内容,并支持模糊匹配和近似匹配。
【2】语法
● MySQL中可以通过以下语法创建全文索引
CREATE FULLTEXT INDEX index_name ON table_name (column);
【3】注意事项
● 需要注意的是,只有MyISAM和InnoDB存储引擎支持全文索引。
● 此外,创建全文索引可能会增加索引维护的成本,并且可能会降低其他类型的查询性能。
● 因此,在创建全文索引时需要权衡其利弊。
(7)覆盖索引
只在辅助索引的叶子节点中就已经找到了所有我们想要的数据select name from user where name='jason';
(8)非覆盖索引
虽然查询的时候命中了索引字段name,但是要查的是age字段,所以还需要利用主键才去查找select age from user where name='jason';

【八】隔离机制

(1)脏读
1.脏读是指当一个事务读取了其他事务尚未提交的数据时发生的现象。
2.意思就是比如说你一个事务,没有commit前,读的就是脏数据,只要回滚就不存在了
(2)不可重复读
1.不可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据出现不一致的情况
2.就是在每次读同一个数据时,可能数据被修改读出来就不一样
(3)幻读
1.幻读的本质在于某一次select操作得到的结果无法支撑后续的业务操作。
2.就是你第一次读的时候是这么多数据,但是当你插入数据,发现不能插入了,因为已经存在了
(4)解决办法
[1]Read uncommitted(读未提交)
最低的隔离级别,在这个级别下,一个事务可以读取到另一个事务尚未提交的数据
可能导致脏读(Dirty Read)问题,即读取到未经验证的数据。[2]Read committed(读已提交)
在这个级别下,一个事务只能读取到已经提交的数据,避免了脏读问题。
但是可能会出现不可重复读(Non-repeatable Read)问题
即同一事务中,两次读取相同的记录可能得到不同的结果,因为其他事务修改了这些记录。[3]Repeatable read(可重复读取)
在这个级别下,事务开始读取数据后,其他事务无法修改这些数据,保证了同一个事务内两次读取相同记录的一致性。
但是可能会出现幻读(Phantom Read)问题,
即同一查询在同一事务中两次执行可能返回不同的结果,因为其他事务插入或删除了符合查询条件的记录。[4]Serializable(串行化)
最高级别的隔离级别,要求事务串行执行,事务之间完全隔离,避免了脏读、不可重复读和幻读问题。
但是这会牺牲并发性能,因为并发事务被限制为顺序执行。

【九】锁机制

目的:提升数据安全性
分类:按粒度分细---》粗行级锁表级锁页级锁
(1)行级锁1.⾏级锁是Mysql中锁定粒度最细的⼀种锁○ 表示只针对当前操作的⾏进⾏加锁。
2.⾏级锁能⼤⼤减少数据库操作的冲突。○ 其加锁粒度最⼩,但加锁的开销也最⼤。
3. ⾏级锁分为共享锁和排他锁。
4.通俗的说就是在你写的时候必须要加锁,只能一个一个写入,如果一起写数据就会错乱
5.行级锁锁的是索引命中索引以后才会锁行如果没有命中索引会把整张表都锁起来。
6.流程:
命中主键索引就锁定这条语句命中的主键索引命中辅助索引就会先锁定这条辅助索引再锁定相关的主键索引考虑到性能,innodb默认支持行级锁但是只有在命中索引的情况下才锁行,否则锁住所有行本质还是行锁但是此刻相当于锁表了

【十】三大范式

三大范式是数据库设计的基础,用于确保数据的准确性、完整性和一致性,避免数据的冗余和不一致性。以下是三大范式的详细解释:

1.第一范式(1NF)
定义:数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值或重复的属性。
特点:
强调列的原子性,即列不可再分。
每一列都是独立的、不可分割的。
保证了数据的准确性,避免了数据的冗余和不一致性。
实际应用:
通常用于记录简单、固定的实体关系。

2.第二范式(2NF)
完全依赖”指的是非主属性不能仅依赖于主键的一部分
定义:在满足第一范式的基础上,非主属性必须完全依赖于整个主键,而不是主键的一部分。
特点:
表必须有一个主键。
没有包含在主键中的列必须完全依赖于主键。
保证了数据的完整性,避免了数据的冗余和不一致性。
实际应用:
通常用于记录复杂、动态的实体关系。
3.第三范式(3NF)
定义:在满足第二范式的基础上,任何非主属性不依赖于其他非主属性(即消除传递依赖)。
特点:
非主键列必须直接依赖于主键。
不能存在非主键列A依赖于非主键列B,非主键列B依赖于主键的情况(即传递依赖)。
进一步保证了数据的完整性,避免了数据的冗余和不一致性。
实际应用:
通常用于记录复杂、动态的实体关系,尤其是当数据表中存在大量数据冗余时。
4.总结:
三大范式理论是数据库设计的基础,它们通过确保数据的原子性、完整性和一致性,避免了数据的冗余和不一致性。在实际应用中,根据数据的复杂性和需求,可以选择不同的范式进行数据库设计。随着数据库技术的发展,新的范式理论也在不断涌现,为数据库设计提供了更多的选择。

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

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

相关文章

IDEA 创建springboot项目杂记-更新中

一、工具使用杂记 1、使用maven 创建新springboot项目时&#xff0c;因为https://start.spring.io/ 连接不上项目无法创建。直接把脚手架地址换为国内的 http://start.aliyun.com

田忌赛马 贪心

本题是更难的那道,一场50 最低为o 第一行一个整数 &#x1d45b;n &#xff0c;表示他们各有几匹马&#xff08;两人拥有的马的数目相同&#xff09;。第二行 &#x1d45b;n 个整数&#xff0c;每个整数都代表田忌的某匹马的速度值&#xff08;0≤0≤ 速度值 ≤100≤1…

Python】从文本字符串中提取数字、电话号码、日期、网址的方法

关于从文本字符串中提取数字、电话号码、日期和网址的方法&#xff1a; 提取数字&#xff1a; 在 Python 中&#xff0c;使用正则表达式 \d 来匹配数字。 \d 表示匹配一个数字字符&#xff08;0-9&#xff09;。如果要匹配连续的数字&#xff0c;可以使用 \d 。 import re def …

C++面向对象的常见面试题目(一)

1. 面向对象的三大特征 &#xff08;1&#xff09;封装&#xff1a;隐藏对象的内部状态&#xff0c;只暴露必要的接口。 #include <iostream> #include <string>// 定义一个简单的类 Person class Person { private: // 私有成员&#xff0c;外部不可直接访问std…

Mac OS ssh 连接提示 Permission denied (publickey)

这错误有点奇葩&#xff0c;MacBook的IDE(vscode和pycharm)远程都连不上&#xff0c;terminal能连上&#xff0c;windows的pycharm能连上&#xff0c;见鬼了&#xff0c;所以肯定不是秘钥的问题了&#xff0c;查了好久竟然发现是权限的问题。。 chmod 400 ~/.ssh/id_rsa http…

华为机试HJ37统计每个月兔子的总数

华为机试HJ37统计每个月兔子的总数 题目&#xff1a; 想法&#xff1a; 上述题目实际是一个斐波那契数列&#xff0c;利用斐波那契数列对问题进行求解 input_number int(input())def fib(n):if n < 2:return 1else:n_1 1n_2 1count 2while count < n:n_1, n_2 n_…

【Android】【多屏】多屏异显异触调试技巧总结

这里写目录标题 如何获取多屏IDs获取多屏的size/density如何启动应用到指定DisplayId多屏截屏/录屏screencapscreenrecord发送按键到指定DisplayId 如何获取多屏IDs dumpsys display | grep mDisplayIdtrinket:/ # dumpsys display | grep mDisplayIdmDisplayId0mDisplayId2 t…

【AI资讯】可以媲美GPT-SoVITS的低显存开源文本转语音模型Fish Speech

Fish Speech是一款由fishaudio开发的全新文本转语音工具&#xff0c;支持中英日三种语言&#xff0c;语音处理接近人类水平&#xff0c;使用Flash-Attn算法处理大规模数据&#xff0c;提供高效、准确、稳定的TTS体验。 Fish Audio

区块链技术的应用场景和优势。

区块链技术具有广泛的应用场景和优势。 区块链技术的应用场景&#xff1a; 1. 金融服务&#xff1a;区块链可用于支付、跨境汇款、借贷和结算等金融服务&#xff0c;提高交易效率、降低成本并增强安全性。 2. 物联网&#xff08;IoT&#xff09;&#xff1a;区块链可以用于物…

机器学习Day12:特征选择与稀疏学习

1.子集搜索与评价 相关特征&#xff1a;对当前学习任务有用的特征 无关特征&#xff1a;对当前学习任务没用的特征 特征选择&#xff1a;从给定的特征集合中选择出相关特征子集的过程 为什么要特征选择&#xff1f; 1.任务中经常碰到维数灾难 2.去除不相关的特征能降低学习的…

Git注释规范

主打一个有用 代码的提交规范参考如下&#xff1a; init:初始化项目feat:新功能&#xff08;feature&#xff09;fix:修补bugdocs:文档&#xff08;documentation&#xff09;style:格式&#xff08;不影响代码运行的变动&#xff09;refactor:重构&#xff08;即不是新增功能…

NodeJs获取文件扩展名

path.extname 是 Node.js 路径模块 (path) 中的一个方法&#xff0c;用于获取文件路径的扩展名。扩展名是指文件名中最后一个 .&#xff08;点&#xff09;之后的部分&#xff0c;包括这个 .。 const path require(path);const filename example.txt; const ext path.extna…

计算机网络之令牌环

1.令牌环工作原理 令牌环&#xff08;Token Ring&#xff09;是一种局域网&#xff08;LAN&#xff09;的通信协议&#xff0c;最初由IBM在1984年开发并标准化为IEEE 802.5标准。在令牌环网络中&#xff0c;所有的计算机或工作站被连接成一个逻辑或物理的环形拓扑结构。网络中…

排序(2)

我们在排序&#xff08;1&#xff09;中说到选择排序的代码&#xff1a; void SelectSort(int* a,int n) {int begin0,endn-1;int minibegin,maxbegin;for(int ibegin1;i<end;i){if(a[i]>a[max]){maxii;}if(a[i]<a[mini]){minii;}begin;--end;}Swap(&a[beign],&a…

SKF轴承故障频率查询

1&#xff0c;第一步&#xff1a;搜索轴承型号 skf官网 2&#xff0c;第二步&#xff1a;查询故障频率。 第三步&#xff1a;

尚品汇-(十四)

&#xff08;1&#xff09;提交git 商品后台管理到此已经完成&#xff0c;我们可以把项目提交到公共的环境&#xff0c;原来使用svn&#xff0c;现在使用git 首先在本地创建ssh key&#xff1b; 命令&#xff1a;ssh-keygen -t rsa -C "your_emailyouremail.com" I…

完美解决ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: NO)

已解决ERROR 1045 (28000): Access denied for user ‘root‘‘localhost‘ (using password: NO) 下滑查看解决方法 文章目录 报错问题解决思路解决方法交流 报错问题 ERROR 1045 (28000): Access denied for user ‘root‘‘localhost‘ (using password: NO) 解决思路 对…

InfluxDB v2.x中的Flux基本概念

InfluxDB v2.x中的Flux查询语言的核心概念主要包括以下几个方面&#xff1a; 1. 表&#xff08;Tables&#xff09; Flux以表&#xff08;Tables&#xff09;的形式处理数据。每个表包含多行数据&#xff0c;每行数据都是一个record&#xff08;记录&#xff09;&#xff0c;…

落日余晖映晚霞

落日余晖映晚霞&#xff0c;立于海滨&#xff0c;望夕阳余晖洒于波光粼粼之上&#xff0c;金光跳跃&#xff0c;若繁星闪烁&#xff0c;耀人心目。 海风轻拂&#xff0c;心境宁静&#xff0c;凡尘俗务皆于此刹那消散&#xff0c;思绪万干&#xff0c;或忆往昔点滴&#xff0c;或…

刷爆leetcode第十期

题目一 相同的树 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 首先我们要来判断下它们的根是否相等 根相等的话是否它们的左子树相等 是否…