what
视图就是通过查询得到的一张虚拟表,然后保存下来,下次直接使用就可以了。
why
为啥使用视图,如果频繁的操作虚拟表,可以不用重复查询
how
create view teacher2course as
select *from teacher inner join course on teacher.tid=course.teacher_id
注:在硬盘中视图只有表结构文件,没有表的数据文件。
注:视图通常用于查询,尽量不要修改视图中的数据,因为他会覆盖原表中的数据。
开发过程中一般不使用视图,因为视图是数据库的通常修改视图会出现与数据库人员沟通处理跨部门沟通的问题,一般重新修改sql语句来扩展功能。
在执行数据库的增删改的时候会触发,一旦执行就会触发触发器的执行,即自动运行另外一段sql代码
创建触发器的语法
create trigger tri_after_insert_t1 after insert on 表名 for each row
begin
sql代码。
end
create table cmd(
id int primary key auto_increment,
user char(32),
priv char(32),
cmd char(64),
sub_time datetime,#提交时间
success enum(“yes”,“no”)#0标识执行失败
)
create table errlog(
id int priamary 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
insert into errlog(err_cmd,err_time) values (NEW.cmd,NEW.sub_time);
什么是事务:
开启一个事务可以包含一些sql语句,这些sql语句要么同时执行成功
要么一个都不能执行成功。
事务的作用:
保证了对数据操作的数据安全性
案例:用建行的卡操作交行的atm给工商的转钱,转到一半数据库故障,他会回滚回去,就是一个语句都没有执行。
事务:包含一些sql语句,sql语句是要么全执行成功,要么全执行失败。
事务的四大特性:
A原子性:原子性一个事务是一个不可分割的单位,事务的诸多操作要么都做,要么都不做
C一致性:事务必须是使数据从一个一致性状态变到另一个一致性状态
I隔离性(isolation):一个事务的执行不能被其他事务,并发执行的事务是互相隔离的。
持久性(durability):持久性也称永久性,事务一旦提交,他对数据的改变是永久的。接下来其他操作都不会对其有任何影响。
如何使用事务:
‘’'mysql
create table user(id int primary key auto_increment,name char(32),balance int);
insert into user (name,nbalance)values("wsb",1000),("eg",1000),('ys',1000);
修改数据之前先开启事务操作:
start transaction;
修改操作:
update user set balance=900 where name='wsb';
update user set balance=1010 where name='eg';
update user set balance=1090 where name='ys';
回滚到上一个状态
rollback;
开启start transaction之后只要没执行commit数据都还在内存中,并没有刷到硬盘上去。
commit
开启事务检测操作是否完整,不完整则回滚到上一个状态,如果完整就应该执行commit操作。
站在python的角度,应该实现的伪代码逻辑:
try:
update user set balance=900 where name=‘wsb’;
update user set balance=1010 where name=‘eg’;
update user set balance=1090 where name=‘ys’;
except 异常:
rollback;
else:
commit;
存储过程是存放在sql中的一堆可执行的sql语句,通过调用它的名字可以执行其内部的一堆sql语句。
delimiter KaTeX parse error: Expected 'EOF', got '#' at position 57: …nout res int) #̲in只能接收输入 out为输出…
delimiter;
##如何使用存储过程:
大前提:存储过程在哪个库下面创建的只能在哪个库下使用。
1.如何调用:
set @res=10#注数据库中使用@加字符串定义变量
call p1(2,4,@res)
select @res;
在python程序中调用:
pymysql链接数据库:
cursor.callproc(“p1”,(2,4,10))
#内部的原理:@_p1_0=2,@_p1_1=4,@_p1_2=10;
cursor.execute(‘select @_p1_2’)
存储过程与事务使用:
delimiter //
create procedure p5(out p_return_code tinyint)
begin
declare exit handler for sqlexception#创建一个退出的句柄。
begin
--error注释
set p_retuen_code=2;
rollback;
END;
declare exit handler for sqlwarning
begin
--waning
set p_return_code=2;
rollback;
end;
start transaction;
update user set balance=900 where id=1;
update user set balance=1010 where id=2;
update user set balance=1090 where id=3;
commit
--success
set p_return_code=0;
END // ###//为delimiter定义的新的结束符
delimiter ; -- 将数据库的结束符改为;
python调用存储过程
import pymysql
con=pymysql.connnet(
host="127.0.0.1",
port=3306,
user="root",
password="123",
database="work",
charset="utf8",
)
cursor=con.cursor(pymysql.cursors.DictCursor)
索引:
## 索引与慢查询优化
知识回顾:数据都是存在硬盘上的,那查询数据不可避免的需要进行IO操作
索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。
注意foreign key不是用来加速查询用的,不在我们研究范围之内,上面三种key前两种除了有加速查询的效果之外还有额外的约束条件(primary key:非空且唯一,unique key:唯一),而index key没有任何约束功能只会帮你加速查询
索引就是一种数据结构,类似于书的目录。意味着以后再查数据应该先找目录再找数据,而不是用翻页的方式查询数据
本质都是:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,
我们可以总是用同一种查找方式来锁定数据。
索引的影响:
https://images2017.cnblogs.com/blog/1036857/201709/1036857-20170912011123500-158121126.png
只有叶子结点存放真实数据,根和树枝节点存的仅仅是虚拟数据
查询次数由树的层级决定,层级越低次数越少
一个磁盘块儿的大小是一定的,那也就意味着能存的数据量是一定的。如何保证树的层级最低呢?一个磁盘块儿存放占用空间比较小的数据项
思考我们应该给我们一张表里面的什么字段字段建立索引能够降低树的层级高度>>> 主键id字段
聚集索引其实指的就是表的主键,innodb引擎规定一张表中必须要有主键。先来回顾一下存储引擎。
myisam在建表的时候对应到硬盘有几个文件(三个)?
innodb在建表的时候对应到硬盘有几个文件(两个)?frm文件只存放表结构,不可能放索引,也就意味着innodb的索引跟数据都放在idb表数据文件中。
**特点:**叶子结点放的一条条完整的记录
辅助索引:查询数据的时候不可能都是用id作为筛选条件,也可能会用name,password等字段信息,那么这个时候就无法利用到聚集索引的加速查询效果。就需要给其他字段建立索引,这些索引就叫辅助索引
**特点:**叶子结点存放的是辅助索引字段对应的那条记录的主键的值(比如:按照name字段创建索引,那么叶子节点存放的是:{name对应的值:name所在的那条记录的主键值})
select name from user where name=‘jason’;
上述语句叫覆盖索引:只在辅助索引的叶子节点中就已经找到了所有我们想要的数据
select age from user where name=‘jason’;
上述语句叫非覆盖索引,虽然查询的时候命中了索引字段name,但是要查的是age字段,所以还需要利用主键才去查找