暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

从0到1学数据库:其他数据库对象

罗晓胜 2020-12-24
605

点击上方“罗晓胜”,马上关注,您的支持对我帮助很大

上期文章

 



/   前言   /


其实除了表和数据,数据库还有一些其他对象,比方说视图、索引,这也是数据库中很重要的组成部分。


/   正文   /


要点

• 视图
• 序列
• 索引
• 同义词

视图

• 视图的概念 – 视图是虚表。是一个命名的查询,用于改变基表数据的显 示,简化查询。视图的访问方式与表的访问方式相同。

– 视图的好处:• 可以限制对基表数据的访问,只允许用户通过视图看到 表中的一部分数据 • 可以使复杂的查询变的简单 • 提供了数据的独立性,用户并不知道数据来自于何处 • 提供了对相同数据的不同显示

• 简单视图和复杂视图 * – 简单视图:只涉及到一个表,而且SELECT子句中不包含函表达式列(包括单行函数和分组函数)。* – 复杂视图:涉及到一个或多个表,SELECT子句中包含函数 表达式列(单行函数或分组函数)。* 最主要的区别在:通过视图实现DML操作上,简单视图可以,复杂视图不一定

创建视图

• 创建视图 CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view [(alias[, alias]...)] AS subquery [WITH CHECK OPTION [CONSTRAINT constraint]] [WITH READ ONLY [CONSTRAINT constraint]];

– 在子查询中可以加入复杂的SELECT. – 子查询中能使用ORDER BY子句,如果想排序,可以在执行查询 视图时使用。

• 创建视图 – OR REPLACE:如果所创建的视图已经存在,会自动重建该视图 – FORCE:不管基表是否存在,都会创建该视图 – NOFORCE:只有基表都存在,才会创建该视图 – view:视图的名称 – alias:为视图所产生的列定义别名,别名的数量必须和视图所产生列的 数量相等 – subquery:一条完整的SELECT语句,在该语句中同样可以定义别名 – WITH CHECK OPTION:通过视图做DML操作时,必须要保证所插入 或修改或删除的数据行必须满足视图所定义的约束,也就是说插入或更新后的结果必须仍然可以通过该视图查询得到 。
– constraint:CHECK OPTION中的约束名 – WITH READ ONLY:确保在该视图上不能进行任何DML操作,默认可 以通过视图执行DML操作。

• 创建视图示例 – 查询id为1的用户视图

CREATE OR REPLACE VIEW student_view AS SELECT id id_view, name name_view,age*10 age_view
FROM student
WHERE id = 1;
DESC id;

SELECT * FROM student_view;

视图执行DML操作

– 创建视图v_student1,是个简单视图。CREATE OR REPLACE VIEW v_student1 AS SELECT id,age FROM student;

– 通过视图进行DML操作。UPDATE v_student1 SET age=age+100;

• 不能通过视图删除记录的条件 – 视图中包含分组函数 – 视图中含有GROUP BY子句 – 视图中含有DISTINCT关键字

• 不能通过视图修改记录的条件 – 视图中包含分组函数 – 视图中含有GROUP BY子句 – 视图中含有DISTINCT关键字 – 视图中要修改的列包含表达式

• 不能通过视图添加记录的条件 – 视图中包含分组函数 – 视图中含有GROUP BY子句 – 视图中含有DISTINCT关键字 – 视图中要修改的列包含表达式 – 视图中没有表的NOT NULL列。

视图的管理

• WITH CHECK OPTION – WITH CHECK OPTION实质是给视图加一个“CHECK”约束,该CHECK约束的条件就是视图中的子查询的WHERE 条件,以后如果想通过该视图执行DML操作,不允许违反 该CHECK约束。

例 WITH CHECK OPTION例子

CREATE OR REPLACE VIEW v_emp3 AS SELECT id,age FROM student WHERE id=1 WITH CHECK OPTION CONSTRAINT v_emp3_ck;

– 该约束的条件为视图中WHERE条件,即 “id=1”,如视图v_emp3想执行DML操作,不 id(只能是1), 如果违反了,执行出错,会出现错误提示。

• WITH READ ONLY – WITH READ ONLY的视图是只读的,不允许通过该视图执行DML语句。

例 WITH READ ONLY例子,创建一个视图v_emp4

CREATE OR REPLACE VIEW v_emp4 AS SELECT id,age FROM student WITH READ ONLY;

– 通过该视图进行更新操作 UPDATE v_emp4 SET salary=salary+100;

• 删除视图 – 删除视图的语法 DROP VIEW view;

内联视图

• 内联视图

– 内联视图(Inline View),是一个在SQL语句内可以使用的 子查询的别名。是一个命名的SQL语句,但不是真正的数 据库的视图对象。最常见的内联视图的例子就是主查询中 的FROM子句中,包含的是一个命名的子查询。

– 例 内联视图的例子

SELECT a.name,b.name FROM student a, (SELECT id,name FROM t_class) b WHERE a.c_class=b.id;

分页

分页(limit-N) – limit-N分页查询主要是实现查找表中最大或最小的N条记录功能。

– Top-N分析语法:SELECT [列名] FROM 表名 limit n

索引

• 索引是: – 方案(schema)中的一个数据库对象 – 在 数据库中用来加速对表的查询速度 – 通过使用快速路径访问方法快速定位数据,减少了磁盘的I/O – 与表独立存放,但需要依附于表,是在表的基础上创建的 – 由 数据库自动维护

创建索引

• 创建索引有两种方式:自动或者手动 • 自动: 当在表上定义一个PRIMARY KEY 或者UNIQUE 约束条 件时,数据库自动创建一个对应的唯一索引. • 手动: 用户可以创建索引以加速查询,在需要创建索引的字段 上创建需要的索引。

• 在一列或者多列上创建索引. CREATE INDEX indexname ON table (column[, column]...);

• 例:下面的索引将会提高对student表基于 name 字 段的查询速度.

CREATE INDEX emp_last_name_idx ON student(name);

注:可通过执行计划查看索引命中及查询所用时长

索引分析

• 适合创建索引情况 – 查询列的数据范围很广泛 – 查询列中包含大量的NULL值 – WHERE条件中的列或者多表连接的列适合创建索引 – 欲查询的表数据量很大,而且大多数的查询得到结果集的 数量占总记录量的2%~4%

• 不适合创建索引的情况 – 很小数据量的表 – 在查询中不常用来作为查询条件的列 – 查询最终得到的结果集很大 – 频繁更新的表(索引对于DML操作是有部分负面影响的) – 索引列作为表达式的一部分被使用时(比如常查询的条件 是age*12,此时在SALARY列上创建索引是没有效果 的)

删除索引

• 删除索引的语法 DROP INDEX index;

• 删除索引后,索引中的数据及定义被删除,索引所占的数据空 间被释放,但表中的数据仍然存在。


/   总结   /

本文主要讲了数据库中视图、索引等对象,索引是数据库中非常重要的部分,对加快查询速度有着至关重要的影响,面试中也会经常问到索引调优等问题。

往期推荐:

如何入门做软件开发

为什么我不推荐入行程序员

做全栈开发很难吗

关注我的公众号,学习技术或投稿

长按上图,识别图中二维码即可关注


文章转载自罗晓胜,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论