SQL的视图
1、什么是视图
视图是虚拟的表,是一个存储的查询,虽然不需要实际的物理存储,但是也被看作是一个数据库对象;它与包含数据的表不一样,它不包含任何列或数据,它只是包含使用时动态检索数据的查询,并且只包含一个SELECT语句(不限制子查询)。视图实际上是由预定义查询形式的表所组成的。
视图与表之间的主要区别在于:表占据物理空间,包含实际的饿数据;而视图不需要物理空间,不包含数据,它只是从表里引用数据。
视图只保存在内存里,而且只需要保存其定义本身(查询语句),也就是说视图所需的空间只是定义语句所需要的。
2、视图的用途
(1)简化数据访问,简化复杂的SQL,对数据库里的数据进行归一化处理,达到重用SQL语句;
(2)对数据进行保护,起到安全的作用,例如只让用户访问部分字段信息;
(3)维护摘要数据;
(4)更改数据格式和表示,视图仅仅是用来查看存储在别处数据的一种设施。
3、视图的使用
在数据库里,视图的使用方式与表是一样的;当创建一个视图时,实际上是在数据库里执行了一个SELECT语句。
(1)表创建视图
CREATE VIEW view_name AS SELECT * FROM table_name [WHERE exp1] [WITH CHECK OPTION] [GROUP BY]
WITH CHECK OPTION选项的目的是确保全部的UPDATE和INSERT语句满足视图定义里的WHERE条件子句,这样保证了引用的完整性。WITH CHECK OPTION有两个选项,CASCADED和LOCAL,其中CASCADED是默认选项。这两个属性都会检查视图的完整性约束和新视图的定义条件,但是LOCAL不检查底层的表,而CASCADED会检查。所以,现对于来说CASCADED更安全些。
(2)视图创建视图
CREATE view2 AS SELECT * FROM view1;
如果从基表和从另一个视图创建视图具有一样的难度和效率,那么首选从基表创建视图。
(3)视图创建表
CREATE TABLE table_name AS SELECT col1,col2 FROM view_name;
(4)删除视图
DROP VIEW view_name;
(5)更改视图
虽然ANSI SQL不包含ALTER VIEW语句,但是某些实现也会支持它,例如:MySQL\SQL Server\Oracle,在MySQL的旧版本中还可以通过REPLACE VIEW来修改视图。
(6)使用视图
通过视图来检索数据的时候,若是该条检索语句存在WHERE子句,并且视图定义中也存在WHERE子句,那么前一个WHERE子句会被添加到视图查询中已有的WHERE子句中,以便正确过滤数据。也即是说,一个WHERE子句在视图定义中,另外一个WHERE子句在传递给视图的中,那么这两组WHERE子句会自动合并,并且会放置在视图定义中。
(7)嵌套视图对性能的影响
因为搜索引擎需要分析每一层的视图,所以若视图嵌套的层数越多,那么搜索引擎需要进行更多的分析工作,这样导致性能降低,故最好控制视图的嵌套层数。实际上,大多数搜索引擎无法 确保获得一个完美的执行计划,而只能保证执行一个耗时最短的计划。
4、视图的规则
(1)视图名必须唯一,并在只能创建不存在的视图,视图数目没有限制;
(2)视图可以嵌套,但是要注意性能问题;
(3)视图不能有索引,也不能有关联的触发器或默认值;
(4)有些DBMS禁止在视图中使用ORDER BY子句;
(5)有些DBMS把视图作为只读的查询,禁止将数据写会底层表;
(6)有些DBMS要求返回的列进行命名,若是计算字段的话,那么必须要使用别名;
(7)有些DBMS可以创建这样的视图,即不能进行导致行不再属于视图的插入或更新;
(8)视图权限:
-
- 创建视图必须要有足够的权限;
- 视图由创建者或规划所有者所拥有,视图所有者自动拥有视图的全部权限,并且可以把视图的权限授予其他用户;
原文地址:https://www.cnblogs.com/bien94/p/12904783.html
- Java枚举类型的原理
- 厚土Go学习笔记 | 27. 斐波纳契闭包
- 代码审计| APPCMS SQL-XSS-CSRF-SHELL
- 厚土Go学习笔记 | 33. 利用数据流实现密码代换功能
- 厚土Go学习笔记 | 32. Readers读取数据流
- GoStub框架二次开发实践
- 厚土Go学习笔记 | 31. 错误 通常函数会返回一个error值来判断是否出错
- 厚土Go学习笔记 | 30. Stringers的一个练习
- 黑客游戏| Owasp juice shop (一)
- 厚土Go学习笔记 | 29. 接口
- Golang中Interface类型详解
- 反序列化| 我欲修仙,法力无边。
- Go语言的网络编程简介
- golang基于redis lua封装的优先级去重队列
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JavaScript 技术篇-js获取窗口标题名,获取页面URL地址
- Pyhon海龟绘制木叶村徽章
- MIT大神写给女神的Q版Python画图库—Cutecharts【技术创作101训练营】
- JavaScript 技术篇-js创建dom节点,并设置属性
- 容器中的数据管理
- Java基础 方法
- Python 技术篇-pyperclip库实现读取写入剪切板,超简单
- 基于consul的Docker-overlay跨多宿主机容器网络
- Python 微信机器人-向指定名称的好友发送微信消息
- JavaScript技术篇-js提升网页视频播放速率,提高慕课网视频播放速度
- 使用docker五步搭建ELK日志收集分析系统
- HDFS之SequenceFile和MapFile
- 配置ELK技术栈来分析apache tomcat日志
- LVS DR模式搭建,keepalived + lvs
- Ubuntu安装docker