9月30日我的学习心得与个人理解
视图
通过查询得到一张虚拟表,然后保存下来,下次直接使用
优点
通过视图,如果频繁使用一张虚拟表,可不用重复查询
create view 视图名 as 表名 创建一张视图
drop view 视图名 删除视图

触发器
共有6种触发的情况
增前 增后 删前 删后 改前 改后
语法结构
create trigger 触发器名 before/after insert/update/delete on 表名 for each row
begin
sql代码
end
触发器的名字最好做到见名知意
针对插入/删除/修改
create trigger tri_after_insert_t1 after insert/delete/update on 表名 for each row
begin
sql代码
end
修改MySQL默认的结束符
delimiter $$ 将结束符修改为$$
delimiter ; 再改回;

触发器案例
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代表失败
);
create table errlog(
id int primary key auto_increment,
err_cmd char (64),
err_time datetime
);

delimiter $$
create trigger tri_after_insert_cmd after insert on cmd for each row begin
if NEW.success = 'no' then #新纪录都会被MySQL封装成NEW对象
insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time);
end if;
end $$
delimiter; 结束后需再改回来,否则结束符一直是$$
在表cmd中插入数据。触发触发器,根据IF条件决定是否插入了错误日志
INSERT INTO cmd(
USER,
priv,
cmd,
sub_time,
success
)
VALUES
('tony','1111','ls -l /etc',NOW(),'yes'),
('linda','2222','cat /etc/passwd',NOW(),'no')
drop trigger tri_after_insert_cmd; 删除触发器
事物
开启一个事物可以包含一些SQL语句,这些SQL语句要么同时成功,要么一个都不能成功,称为事物的原子性
事物属性:原子性,一致性,隔离性,持久性。这4个属性通常称为ACID特性。
事物作用:保证了数据操作时的安全性
start transaction; 开启事物操作
rollback 回滚到上一个状态
commit 刷新到硬盘
函数
类似于Python中的内置函数
select date_format(sub_time,'%Y-%m'),count(id) from blog group by data_format(sub_time,'%Y-%m');
MySQL中的流程控制
if判断
delimiter
CREATE PROCEDURE proc_if ()
BEGIN
declare i int default 0;
if i = 1 THEN
SELECT 1;
ELSEIF i = 2 THEN
SELECT 2;
ELSE
SELECT 7;
END IF;
END
delimiter;
while循环
delimiter
CREATE PROCEDURE proc_while()
BEGIN
DEClARE num INT;
SET num = 0;
WHILE num < 10 DO
SELECT
num;
SET num = num + 1;
END WHILE;
END
delimiter;
索引
索引就是一种数据结构,类似于书的目录。在MySQL中也叫做“键”,是存储引擎用于快速找到记录的数据结构
primary key 聚集索引,主键
unique key 辅助索引
index key
primary key, unique key出来有索引功能外,还有额外的限制条件
index key没有任何的限制条件单纯的用来表示索引
索引本质都是通过不断缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件
索引不能滥用
1.表中有大量数据时,创建索引速度会很慢
2.索引创建完毕后,对表的查询性能会大幅度提升,但是写的性能会降低
create index idx_name on s1(name); 给表s1的name字段创建索引
create index idx_id on s1(id); 给表s1的id字段创建索引
select name from emp where name='tony' name是覆盖索引
select age,email from emp where name='tony' name是非覆盖索引
b+树
b+树只有叶子节点才会存放真正的数据,其他节点都仅仅存放索引用来指向数据的查询方向
b+树层级越高查询次数越多,所以应尽量降低b+树的层级
针对索引的测试
1.准备表
create table s1(
id int,
name varchar(20),
gender char(6),
email varchar()
);
2.创建存储过程,实现批量插入记录
delimiter $$ 声明存储过程的结束符号$$
create procedure auto_insert1()
BEGIN
declare i int default 1;
whilei<(3000000)do
insert into s1 values(i,'mark','john',concat('john',i,'邮箱地址'));
set i = i + 1;
end while;
END$$ #$$
delimiter; 重新声明分号为结束符号
3.查看存储过程
show create procedure auto_insert1\G
4.调用存储过程
call auto_insert1();

浙公网安备 33010602011771号