视图
基本概念:
视图是一个虚拟表,是sql的查询结果,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据,在使用视图时动态生成。视图的数据变化会影响到基表,基表的数据变化也会影响到视图[insert update delete ] ; 创建视图需要create view 权限,并且对于查询涉及的列有select权限;使用create or replace 或者 alter修改视图,那么还需要改视图的drop权限。
作用:
控制权限:视图是虚拟的表,为某个表的的部分列创建特定的视图,针对该视图开放访问权限给特性用户,达到该用户只能访问表的偶写特定字段的效果
简化复杂查询:对多表查询创建视图,使用者可以在多表查询的结果视图上进行单表查询操作,简化复杂查询
视图是否能够更新、删除、添加:如果视图与物理表的数据一一对应则可以,如果不对应则不行。 原则上不建议对视图做修改操作
视图基本操作:
创建视图:
create view 视图名 as select 字段名 from 表名;
#创建单表控制权限视图
CREATE VIEW st_right_ctl AS SELECT st.sno,st.sname,st.sex FROM student AS st WITH READ ONLY;
#使用多表查询结果创建视图
CREATE VIEW mul_tab_sel AS SELECT st.*,sc_tmp.cno,sc_tmp.degree FROM student AS st INNER JOIN (SELECT sc_last.* FROM score AS sc_last INNER JOIN (SELECT sc.cno,AVG(sc.degree) AS avg_degree FROM score AS sc GROUP BY sc.cno) AS sc_avg ON sc_last.cno=sc_avg.cno AND sc_last.degree >= sc_avg.avg_degree) AS sc_tmp ON st.sno=sc_tmp.sno;
查看视图:
#查看视图创建情况
show create view 视图名;
#查询 修改 删除视图
视图的查询 修改 删除和表的语法完全一样,将表名替换为视图名即可
索引
目的:
索引是在表的指定列上创建的特殊数据库对象,如果表查询时过滤条件与索引创建的列一致则可以有效提高表的查询效率。没有建立索引的表会进行全表扫描
原理:
- 创建索引的表按照创建索引的字段从小到大排序
- 取出两个字段:索引字段, rowid
- 把步骤2取出的数据保存在特殊的表,索引表里,索引表里的创建索引列的值是有序的。
- 在索引表基础上创建一颗B树(可以简单理解为将有序数据分为多层n叉树),对索引表进行分组查询。 logn的时间复杂度和n的时间复杂度
- 查询时索引字段的有序能够利用树的查找速度找到对应的数据,关联到rowid通过rowid反推原始数据
- 查询语句的查询条件匹配的键值如果有索引就直接查找B树,提高查询速度
使用场景:
- 表查询多,插入更新少
- 建立索引的键值中重复数据少
创建语法:
单行索引:create index 索引名 on 表名(列名) score表的degree列建立索引:CREATE INDEX sc_degree_index ON score(degree); 复合索引:create index 索引名 on 表名(列名1, 列名2, ...)