今日推荐语
做一个创造者,创造出人们想要的有趣的东西。展示你的技能,练习你的技能,最终会有适合的人找到你。——纳瓦尔
日期 | 学习内容 | 打卡编号 |
---|---|---|
2024年12月18日 | Mysql 范式、存储过程等尾部基础知识 | 004 |
前言
哈喽,我是菜鸟阿康。今天把Mysql基础知识学完了,提高部分可能会后续更新(可以先点个关注嘿嘿)。
今天主要学习了范式、存储过程、视图、触发器等知识,其中重要一点就是范式部分、会用到一点的还有变量。
以下是我的学习笔记,既做打卡也做分享,希望对你也有所帮助,不足之处欢迎大家交流指正。
文末给大家附上之前的学习笔记,大家感兴趣也可以去看下。
继续加油!兄弟们!
十、三范式
(一) 三范式概念
我理解范式的设计,主要是减除数据字段冗余,数据实体之间尽量保持独立,方便理解和维护。为了便于理解,在这里设计3张表进行场景举例。
名称 | 定义 | 场景案例 |
---|---|---|
第一范式 | 每列都是不可再分的最小数据单元 | 比如学生表中 email 字段只存email地址,不要参杂其他字段信息。 |
第二范式 | 每个表只描述一件事情,要求所有非主键字段完全依赖主键。 | 主要针对多对多的场景。在数据库表设计中,对于多对多的场景,一般我们会建立中间表,来查询相关信息。 比如学生与老师之间就是多对多关系,如果学生表中要存储老师ID,那老师的其他信息以及对应关系就应该借助第三张表来查询。 |
第三范式 | 非主键字段不能传递依赖于主键字段(不要产生传递依赖) | 比如学生表与班级表。学生表中存储了班级ID,就没必要再存储【班级名称】字段,完全可以从班级信息表中关联查询。 |
(二) 三范式总结(面试考点)
- 第一范式:有主键,具有原子性,字段不可分割
- 第二范式:非主键字段完全依赖主键,没有部分依赖
- 第三范式:非主键字段没有传递依赖
注意:实际开发中,不是完全遵循三范式,会经常使用冗余字段的。
十一、视图(了解)
视图(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 表名 ... ; |
十三、触发器(了解)
(一) 概述
- 概述:指在insert\update\delete 之前或者之后触发并执行触发器中的sql 语句的集合。
- 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,默认为当前数 据库 。 |