Mysql 范式、存储过程那些点(简单易懂!不怕面试)

今日推荐语

做一个创造者,创造出人们想要的有趣的东西。展示你的技能,练习你的技能,最终会有适合的人找到你。——纳瓦尔

日期        学习内容        打卡编号
2024年12月18日Mysql 范式、存储过程等尾部基础知识004

前言

哈喽,我是菜鸟阿康。今天把Mysql基础知识学完了,提高部分可能会后续更新(可以先点个关注嘿嘿)。

今天主要学习了范式、存储过程、视图、触发器等知识,其中重要一点就是范式部分、会用到一点的还有变量。

以下是我的学习笔记,既做打卡也做分享,希望对你也有所帮助,不足之处欢迎大家交流指正。

文末给大家附上之前的学习笔记,大家感兴趣也可以去看下。

继续加油!兄弟们!


十、三范式

(一) 三范式概念

我理解范式的设计,主要是减除数据字段冗余,数据实体之间尽量保持独立,方便理解和维护。为了便于理解,在这里设计3张表进行场景举例。

名称

定义

场景案例

第一范式

每列都是不可再分的最小数据单元

比如学生表中 email 字段只存email地址,不要参杂其他字段信息。

第二范式

每个表只描述一件事情,要求所有非主键字段完全依赖主键。

主要针对多对多的场景。在数据库表设计中,对于多对多的场景,一般我们会建立中间表,来查询相关信息。

比如学生与老师之间就是多对多关系,如果学生表中要存储老师ID,那老师的其他信息以及对应关系就应该借助第三张表来查询。

第三范式

非主键字段不能传递依赖于主键字段(不要产生传递依赖

比如学生表与班级表。学生表中存储了班级ID,就没必要再存储【班级名称】字段,完全可以从班级信息表中关联查询。

(二) 三范式总结(面试考点)

  1. 第一范式:有主键,具有原子性,字段不可分割
  2. 第二范式:非主键字段完全依赖主键,没有部分依赖
  3. 第三范式:非主键字段没有传递依赖

注意:实际开发中,不是完全遵循三范式,会经常使用冗余字段的。

十一、视图(了解)

视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。

视图只保存了查询的SQL逻辑,不保存查询果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

操作类型

语法

实操案例

创建

CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]

#创建视图

create or replace view test_view as select * from user where id >10;

#查看视图

show create view test_view;

#从视图查询

select * from test_view;

#修改视图数据

update test_view set user_name = '1' where id = 11;

#修改视图

create or replace view test_view as select id,user_name,email from user where id >10;

#删除视图

drop view if exists test_view;

查询

查看创建视图语句:SHOW CREATE VIEW 视图名称; 查看视图数据:SELECT * FROM 视图名称 ...... ;

修改

方式一:CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]

方式二:ALTER VIEW 视图名称[(列名列表)] AS SELECT语句 [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]

删除

DROP VIEW [IF EXISTS] 视图名称 [,视图名称] ...

十二、存储过程与变量(了解)

(一) 存储过程

概述:经过事先编译并存储到数据库中的一段 sql 语句的集合,类似于java 的方法。

操作类型

语法

创建

CREATE PROCEDURE 存储过程名称 ([ 参数列表 ]) BEGIN

-- SQL语句

END ;

查询

SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'xxx';

-- 查询指定数据库的存储过程及状态信息

SHOW CREATE PROCEDURE 存储过程名称 ;

-- 查询某个存储过程的定义

调用

CALL 名称 ([ 参数 ]);

删除

DROP PROCEDURE [ IF EXISTS ] 存储过程名称 ;

drop tables if EXISTS test;
create table test(id int, name varchar(255));

-- 创建存储过程,定义存储方法
create procedure batchInsert(in args int)
begin
declare i int default 1;
-- 开启事务(重要!不开的话,100w数据需要论天算)
start transaction;
while i <= args do
	insert into test(id,name) value(i,concat("软件工程-",i));
set i = i+ 1;
end while;
commit;
end

#调用
call batchInsert(100000);

#查询指定数据库的名称的存储过程
select * from INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_SCHEMA = 'index';
#查询指定存储过程的详细信息
show create PROCEDURE batchInsert;

#删除指定的存储过程
drop PROCEDURE if EXISTS batchInsert

(二) 变量

1. 系统变量

类型

语法

查看系统变量

show [session|global] variables; #所有变量

select @@系统变量名 #查询指定变量

select @@local_infile #查看导入开关是否打开

修改系统变量

set [session|global] 变量名=值

#设置事务自动提交

set global autocommit=1;

2. 自定义变量

类型

语法

赋值

1.SET @var_name = expr [, @var_name = expr] ... ; SET @var_name := expr [, @var_name := expr] ... ;

2.SELECT @var_name := expr [, @var_name := expr] ... ; SELECT 字段名 INTO @var_name FROM 表名;

查询

select @@var_name;

3. 局部变量

类型

语法

声明

DECLARE 变量名 变量类型 [DEFAULT ... ] ;

赋值

SET 变量名 = 值 ;

SET 变量名 := 值 ;

SELECT 字段名 INTO 变量名 FROM 表名 ... ;

十三、触发器(了解)

(一) 概述

  1. 概述:指在insert\update\delete 之前或者之后触发并执行触发器中的sql 语句的集合。
  2. NEW OLD 是别名,用来引用触发器中发生变化的记录内容,

触发器类型

NEW 或者 OLD

INSERT

NEW 表示将要或者已经新增的数据

UPDATE

OLD 表示修改之前的数据,NEW 表示将要或者已经修改后的数据

DELETE

OLD 表示将要或者已经删除的数据

(二) 语法与实操案例

操作类型

语法

实操案例

创建

CREATE TRIGGER trigger_name

BEFORE/AFTER INSERT/UPDATE/DELETE

ON tbl_name FOR EACH ROW -- 行级触发器 BEGIN

trigger_stmt ; #触发器触发后执行的sql语句

END;

CREATE TRIGGER user_log_test1

AFTER delete

ON user FOR EACH ROW -- 行级触发器

BEGIN

insert into user_log values(null,'delete',now());

END;

show triggers;

delete from user where id = 2;

DROP TRIGGER user_log_test ;

查询

SHOW TRIGGERS ;

删除

DROP TRIGGER [schema_name.]trigger_name ; -- 如果没有指定 schema_name,默认为当前数 据库 。

 文末福利【往期笔记】

1.Mysql索引必学的六个知识点

2.Mysql性能分析与索引使用(不信面试官能问完!)

3.SQL优化的7个方向(慢查询从这里排查就好了)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟阿康学习编程

关注我一起进步!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值