视图
将内关联或自关联的表创建成另一个表
(select * from students as a inner join classes as b on a.cls_id=b.id)
>create view v_students as (select...);
视图本质就是对查询的封装
定义视图,建议以v_开头
>create view 视图名称 as select语句;
查看视图:查看表会将所有的视图也列出来
>show tables;
删除视图
>drop view 视图名称;
例:
>drop view v_stu_score_course;
使用:视图的用途就是查询
>select * from v_stu_score_course;
事务
事务具有ACID特性:
原子性(A,atomicity)、
一致性(C,consistency)、
隔离性(I,isolation)、
持久性(D,durabulity)。
原子性:事务内的所有操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
一致性:数据库总是从一个一致性的状态转换到另一个一致性的状态。
隔离性:一个事物所做的修改在最终提交之前,对其他事物是不可见的。
持久性:事务完成后,该事务内涉及的数据必须持久性的写入磁盘保证其持久性。当然,这是从事务的角度来考虑的的持久性,从操作系统故障或硬件故障来说,这是不一定的。
一个事务不可分割
事务命令
要求:表的引擎类型必须是innodb类型才可以使用事务,这是mysql表的默认引擎
查看表的创建语句,可以看到engine=innodb
>show create table pikachu;
修改数据的命令会触发事务,包括insert、update、delete
开启事务,命令如下:
开启事务后执行修改命令,变更会维护到本地缓存中,而不维护到物理表中
>begin;
提交事务,命令如下
将缓存中的数据变更维护到物理表中
>commit;
回滚事务,命令如下:
放弃缓存中变更的数据
>rollback;
索引
当数据库中数据量很大时,查找数据会变得很慢
优化方案:索引
索引并不是越多越好,索引太多时,会对增删改造成拖累
语法
查看索引
>show index from 表名;
创建索引
方式一:建表时创建索引
>create table pikachu(id int primary key,name varchar(10) unique,age int,key (age));
方式二:对于已经存在的表,添加索引
如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致
字段类型如果不是字符串,可以不填写长度部分
>create index 索引名称 on 表名(字段名称(长度))
例:
>create index age_index on pikachu(age);
删除索引:
>drop index 索引名称 on 表名;
>drop index age_index on pikachu;
测试时间
>set profiling=1;
#打开sql语句执行时间
建议不开,占资源
>show profiles;#查看sql执行时间
外键
如果一个实体的某个字段指向另一个实体的主键,就称为外键。被指向的实体,称之为主实体(主表),也叫父实体(父表)。负责指向的实体,称之为从实体(从表),也叫子实体(子表)
对关系字段进行约束,当为从表中的关系字段填写值时,会到关联的主表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并报错
语法
查看外键
>show create table pikachu;
添加外键
>alter table pikachu constraint fk foreign key (cls_is) references pikahcu2(id) on delete cascade;
on delete cascade删除主表的同时删除子表,无法只删除子表
删除外键
>show create table 表名
>alter table students drop foreign key 外键名字;