1.什么是视图:html
一个查询语句的结果是一张虚拟表,将这种虚拟表保存下来他就变成了一个视图。python
2.为何要使用虚拟表:mysql
当频繁须要用到多张表的连表结果,你就饿尅实现生成好视图,以后直接调用便可,避免了反腐写连表操做的sql语句。sql
3.如何使用:数据库
语法: create view 视图名 as 查询语句; 例: create view teacher2course as select * from teacher inner join course on teacher.tid = course.teacher_id;
4.注意:数据结构
#1.视图只有表结构,视图中的数据仍是来源于原来的表ide
#2.不要改动视图表中的数据函数
#3.通常状况下不会频繁的使用视图来写业务逻辑优化
1.什么是触发器:atom
当对某张表进行 增 删 改操做的状况下自动触发的功能称之为触发器。
2.为何要是用是触发器:
触发器专门针对咱们对某一张表数据增insert、删delete、改update的行为,这类行为一旦执行 就会触发触发器的执行,即自动运行另一段sql代码
3.触发器通常分为六种状况
增前 增后 删前 删后 改前 改后
4.语法使用
create trigger 触发器的名字 after/before insert/update/delete on 表名 for each row begin sql语句 end # 删除触发器 drop trigger tri_after_insert_cmd; 细分: # 针对插入 create trigger tri_after_insert_t1 after insert on 表名 for each row begin sql代码。。。 end create trigger tri_after_insert_t2 before insert on 表名 for each row begin sql代码。。。 end # 针对删除 create trigger tri_after_delete_t1 after delete on 表名 for each row begin sql代码。。。 end create trigger tri_after_delete_t2 before delete on 表名 for each row begin sql代码。。。 end # 针对修改 create trigger tri_after_update_t1 after update on 表名 for each row begin sql代码。。。 end create trigger tri_after_update_t2 before update on 表名 for each row begin sql代码。。。 end 案例: delimiter $$ # 将mysql默认的结束符由;换成$$,只针对当前窗口有效 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 ; # 结束以后记得再改回来,否则后面结束符就都是$$了
1.什么是事务:
一系列sql语句操做要么同时成功,要么同时失败
2.事务的四大特性:
#1.原子性(atomicity:一组操做要么都成功,要么都失败
#2.一致性(consistency):事务使数据库从一个一致状态转变到另外一个一致状态,一致性与原子性密切相关。即事务发生先后数据总额依然匹配。
#3.隔离性(isolation):各个事务之间的执行相互隔离互不干扰。
#4.持久性(durability):指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其余操做或故障不该该对其有任何影响。只能经过“另开起一个事物”来抵消以前的错误
3.语法:
#表准备 create table user( id int primary key auto_increment, name char(32), balance int ); insert into user(name,balance) values ('wsb',1000), ('egon',1000), ('ysb',1000); 1.# 修改数据以前先开启事务操做 start transaction; 2.# 一系列操做 例如 # 修改操做 update user set balance=900 where name='wsb'; #买支付100元 update user set balance=1010 where name='egon'; #中介拿走10元 update user set balance=1090 where name='ysb'; #卖家拿到90元 #3.# 回滚到上一个状态即没有第二步修改操做 rollback; 4.# 开启事务以后,只要没有执行commit操做,数据其实都没有真正刷新到硬盘,(提交后再执行回滚,没有任何回滚效果) commit; """开启事务检测操做是否完整,不完整主动回滚到上一个状态,若是完整就应该执行commit操做""" # 站在python代码的角度,应该实现的伪代码逻辑, try: update user set balance=900 where name='wsb'; #买支付100元 update user set balance=1010 where name='egon'; #中介拿走10元 update user set balance=1090 where name='ysb'; #卖家拿到90元 except 异常: rollback; else: commit;
1.什么是存储过程:
存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,经过调用它的名字能够执行其内部的一堆sql语句(相似于python中的自定义函数)
2.语法:
1.# 建立过程 delimiter $$ create procedure p1( in m int, # in表示这个参数必须只能是传入不能被返回出去 in n int, out res int # out表示这个参数能够被返回出去,还有一个inout表示便可以传入也能够被返回出去 ) begin select tname from teacher where tid > m and tid < n; # sql语句 set res=0; # 返回值 end $$ delimiter ; 2.# 如何使用 # 一、直接在mysql中调用 set @res=10 # res的值是用来判断存储过程是否被执行成功的依据,因此须要先定义一个变量@res存储10 call p1(2,4,10); # 报错 call p1(2,4,@res); # 查看结果 select @res; # 执行成功,@res变量值发生了变化 # 二、在python程序中调用 pymysql连接mysql 产生的游表cursor.callproc('p1',(2,4,10)) # 内部原理:@_p1_0=2,@_p1_1=4,@_p1_2=10; cursor.excute('select @_p1_2;') # 大前提:存储过程在哪一个库下面建立的只能在对应的库下面才能使用!!!存储
3.案例:
# 三、存储过程与事务使用举例(了解) delimiter // create PROCEDURE p5( OUT p_return_code tinyint ) BEGIN DECLARE exit handler for sqlexception BEGIN -- ERROR set p_return_code = 1; rollback; END; DECLARE exit handler for sqlwarning BEGIN -- WARNING set p_return_code = 2; rollback; END; START TRANSACTION; update user set balance=900 where id =1; update user123 set balance=1010 where id = 2; update user set balance=1090 where id =3; COMMIT; -- SUCCESS set p_return_code = 0; #0表明执行成功 END // delimiter ;
1.注意:
注意与存储过程的区别,mysql内置的函数只能在sql语句中使用!
2.参考博客:http://www.cnblogs.com/linhaifeng/articles/7495918.html#_label2
3.案例:
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');
1.什么是索引:
在mysql中也叫键,是存储引擎加速查找数据的一种数据结构。(索引就是一种数据结构,相似于书的目录。意味着之后再查数据应该先找目录再找数据,而不是用翻页的方式查询数据)
2.三种索引及区别:
#索引:
1.primary key 主键索引:加速查询 ;不能重复;不能为空
# 第一种: # create table t1( # id int auto_increment primary key, # name varchar(32) not null default '' # )engine=Innodb charset=utf8; # 第二种: alter table t1 change id id int auto_increment primary key;
2.unique key 惟一键索引:加快查询;不能重复;unique(列名)
联合惟一索引:加快查询;不能重复;unique(列名,列名)
惟一索引: # 第一种: # create table t1( # id int auto_increment primary key, # name varchar(32) not null default '', # unique ix_name (name) # )engine=Innodb charset=utf8; # # 第二种: # create unique index 索引名称(ix_name) on 表名(t1)(name); # create unique index 索引名称(ix_name_age) on 表名(t1)(name,age);
3.index key 普通键索引:加快查询
普通索引: # # 第一种: # create table t1( # id int auto_increment primary key, # name varchar(32) not null default '', # index ix_name (name) # )engine=Innodb charset=utf8; # # 第二种: # create index 索引名称(ix_name) on 表名(t1)(name);
#区别:
注意foreign key不是用来加速查询用的,不在咱们研究范围以内,上面三种key前两种除了有加速查询的效果以外还有额外的约束条件(primary key:非空且惟一,unique key:惟一),而index key没有任何约束功能只会帮你加速查询。
drop index 索引名称(ix_name) on 表名(t1);
版本5.3如下: # 删除和修改的速度就变慢了 # # 版本5.5以上: # 删除和修改的速度不是特别的慢
1.做用:查看sql语句是否使用了索引和执行效率
2.使用:explain sql语句 例:explain select * from where id=1\G
1.日志文件:记录了执行速度特别慢的sql语句
2.如何使用:
1. show variables like '%query%'; # # 2. set global long_query_time = 1; 设置慢查询的时间 # 3. slow_query_log = ON # 4. slow_query_log_file = E:\program\mysql-5.6.44-winx64\data\oldboy-slow.log
show variables like '%general%'; # +------------------+------------------------------------------------+ # | Variable_name | Value | # +------------------+------------------------------------------------+ # | general_log | ON | # | general_log_file | E:\program\mysql-5.6.44-winx64\data\oldboy.log | # +------------------+------------------------------------------------+ # set global general_log = ON;
建立用户 # create user '用户名'@'IP地址' identified by '密码'; # creaee user 'zekai'@'192.168.1.123' identified by '123qwe'; # creaee user 'zekai'@'192.168.1.%' identified by '123qwe'; # create user 'zekai'@'%' identified by '123qwe'; # # 删除用户 # drop user '用户名'@'IP地址'; # 修改用户 # rename user '用户名'@'IP地址' to '新用户名'@'IP地址'; # # 修改密码 # set password for '用户名'@'IP地址' = Password('新密码') # # 受权: # grant 权限 on 数据库.表 to '用户'@'IP地址' -- 受权 # # grant select on db1.* to 'zekai'@'%'; # grant select on *.* to 'zekai'@'%'; # grant select, insert, delete on db1.* to 'zekai'@'%'; # # 记住: # flush privileges;
3.b+树
#1.注意:
只有叶子结点存放真实数据,根和树枝节点存的仅仅是虚拟数据
查询次数由树的层级决定,层级越低次数越少一个磁盘块儿的大小是必定的,那也就意味着能存的数据量是必定的。如何保证树的层级最低呢?一个磁盘块儿存放占用空间比较小的数据项,思考咱们应该给咱们一张表里面的什么字段字段创建索引可以下降树的层级高度>>> 主键id字段。
汇集索引(primary key)
#1.汇集索引其实指的就是表的主键,innodb引擎规定一张表中必需要有主键。
特色:叶子结点放的一条条完整的记录
#1.辅助索引:
查询数据的时候不可能都是用id做为筛选条件,也可能会用name,password等字段信息,那么这个时候就没法利用到汇集索引的加速查询效果。就须要给其余字段创建索引,这些索引就叫辅助索引
特色:叶子结点存放的是辅助索引字段对应的那条记录的主键的值(好比:按照name字段建立索引,那么叶子节点存放的是:{name对应的值:name所在的那条记录的主键值})
#2.辅助索引分类:
select name from user where name='jason';
上述语句叫覆盖索引:只在辅助索引的叶子节点中就已经找到了全部咱们想要的数据
select age from user where name='jason';
上述语句叫非覆盖索引,虽然查询的时候命中了索引字段name,可是要查的是age字段,因此还须要利用主键才去查找