mysql视图机制

什么是视图

视图是一张虚拟的表,为什么是虚拟呢?因为视图与数据库中存在的表不太一样,前面我们创建的4张表都是包含数据的,

如用户信息,订单信息等,而视图则是不包含数据的,下面通过一个例子来演示视图,下面的sql是查询王五的所有

订单情况,需要关联到orders表,orderd etail表 tiems表 user表

mysql> select u.username, o.number, tm.name as itemsName , tm.price, od.items_num from

(

( orders as o inner join orderdetail as od on o.id = od.orders_id)

inner join items as tm on od.items_id = tm.id

)

inner join user as u on o.user_id = u.id

where username=‘王五‘;

显然数据已如期查询出来了,但是我们发现任何需要这个数据的人都必须了解相关的表结构,并且需要知道如何创建

和对表进行联结,为了检索其他用户的相同数据必须修改where条件并带上一大段关联查询的sql语句。是的,每次这样的操作确实挺

麻烦的,加入现在可以把这个除了where条件外的sql查询出来的数据包装成一个名为user_order_data 的虚拟表,就可以使用

使用以下方式检索出数据了。

select * from user_order_data where username=‘王五‘;

按这样的方式每次查询不同的用户只需修改where条件即可也不同在写那段看起来有点恶心的长sql了,而事实上

user_order_data 就是一张视图表,也可称为虚拟表,而这就是视图最显著的作用了。

视图创建与使用

了解完什么是视图后,我们先来看看如何创建视图和使用视图,使用以下语法:

create view 视图名(列明...) as select 语句

现在我们使用前面关联查询的orders表 orderdetail表 items表 user表来创建视图user_order_data

-- 创建视图虚拟表 user_order_data

mysql> create view user_order_data(username,numer,itemname,price,items_num) as select u.username, o.number,tm

(

( orders as o inner join orderdatail as od on o.id = od.orders_id)

inner join items as tm on od.items_id = tm.id

)

inner join user as u on o.user_id = u.id;

-- 使用视图

mysql> select * from user_order_data;

可以看出除了在select语句前面加上 create view user_order_data as 外,其他几乎没变化。在使用视图user_order_data

时,跟使用数据库表没啥区别,因此以后需要查询指定用户或者所有用户的订单情况时,就不用编写长巴巴的一段sql了

,还是蛮简洁的。除了上述的方式,还可以将视图虚拟表的字段别名移动到查询字段后面:

create or replace view user_order_data

as

select

u.username as username,

o.number as number,

tm.name as name,

tm.prive as prive,

od.items_num as items_num

from

(

( orders as o inner join orderdetail as od on o.id = od.orders_id)

inner join items as tm on od.items_id = tm.id

)

innner join user as u on o.user_id = u.id

注意这里使用了 create or replace view 语句,意思就是不存在就创建,存在就替换。如果想删除视图可以使用以下语法:

drop view 视图名称

在使用视图的过程还有些需要注意的点,如下

与创建表一样,创建视图的名称必须唯一

创建视图的个数并没有限制,但是如果一张视图嵌套或者关联的表过多,同样会引发性能问题,在实际生产环节中

部署时务必进行必要的性能检测,。

在过滤条件数据时如果在创建视图的sql语句中存在where的条件语句,而在使用该视图的语句中也存在where条件语句时,

这两个where条件语句会自动组合

order by 可以在视图中使用,但如果从该视图检索数据的select语句中国也含有order by ,那么该视图中的order by

将被覆盖。

视图中不能使用索引,也不能使用触发器

使用可以和普通的表一起使用,编辑一条连接视图和普通表的sql语句是允许的。

关于使用视图对数据的进行更新(增删改),因为视图本身并没有数据,所以这些操作都是直接作用到普通表中的,但也并非

所有的视图都可以进行更新操作,如视图中存在分组(group by) 联结 子查询 并(union) 聚合函数(sum/count等)

计算字段,distinct 等都不能对视图进行更新操作,因此我们前面的例子也是不能进行更新操作的,事实上,视图更多的

是用于数据检索而更新,因此对于更新也没有必要进行多阐述。

视图的本质

至此对于视图的创建和使用都比较清晰了,现在准备进一步认识视图的本质,前面我们反复说过,视图是一张

虚拟表,是不带任何数据的,每次查询时,只是从普通表中动态的获取数据并组合,只不过外表看起来像

一张表罢了

事实上有些时候视图还会被用于限制用户对普通表的查询操作,对于这类用户只赋予对应视图的select操作权限,仅

让他们只能读取特定的行或列的数据。这样我们也就不用直接使用数据库的权限设置行列的读取,同时也避免了权限细化的麻烦。

高效索引

使用索引的理由

由于mysql在默认情况下,表中的数据记录是没有顺序可言的,也就是说在数据检索过程中,符合条件的数据存储

在哪里,我们是完全不知情的,如果使用selec语句进行查询,数据库会从第一条记录开始检索,即使找到第一条

符合条件的数据,数据库的检索也并不会因此而停止,毕竟符合条件的数据可能并不止一条,也就是说此时

检索会把表中的数据全部检索一遍才结束,这样的检索方式也称为全表扫描,但假设表中存在巨量数据呢,指明了某个关键字

在正文中的出现的页码位置或章节的位置,这样只要找到对应页面就能找到要检索的内容了,数据库的检索也是类似

这样的原理,通过创建某个字段或者多个字段的索引,在搜索该字段时就可以根据对应的索引进行快速检索出相应

内容而无需全表扫描了。

索引的创建及其基本类型

mysql 索引可以分为单列索引,符合索引,唯一索引,主键索引等,下面分别介绍

单列索引

单列索引,也称为普通索引,单列索引是最基本的索引,他没有任何限制,创建一个单列索引,语法如下:

create index index_name on tbl_name(index_col_name)

其中index_name为索引的名称,可以自定义,tbl_name 则指明要创建索引的表,而index_col_name指明表中

那一个列要创建索引。当然我们也可以通过修改表结构的方式添加索引:

alter table tbl_name add index index_name on (index_col_name);

还可在创建表时直接指定:

-- 创建表时直接指定

create table `table`(

`id` int(11) not null auto_increment,

`name` varchar(32) not null,

..... -- 其他字段

primary key (`id`),

indexName (name(32)) -- 创建name字段索引

);

下面为user表的username字段创建单列索引:

-- 创建username字段的索引名称为index_name ,这就是基础的索引创建

mysql> create index index_name on user(username);

-- 查看user表存在的索引 \G 代表优化显示方式

mysql> show index from user \G;

可见user表中的username字段的索引已被创建,在使用show index from user 查看user的索引字段时,我们发现id

字段也创建了索引,事实上,当user表被创建时,主键的定义的字段id就会自动创建索引,这是一种特殊的索引,

也称为丛生索引,而刚才创建的index_name 索引属于单列索引

复合索引

复合索引:复合索引是在多个字段上创建的索引。复合索引遵守 最左前缀 原则,即在查询条件中使用了复合索引的

第一个字段,索引才会被使用。因此,在复合索引中索引列的顺序至关重要。创建一个复合索引的语法如下:

-- index_name 代表索引名称,而index_col_name 和index_col_name2为列名,可以多个

create index index_name on  tbl_name(index_col_name,index_col_name2,.....);

-- 同样道理,也可以通过修改表结构的方式添加索引,

alter tble tbl_name add index index_name on (index_col_name1,index_col_name2,.....);

-- 创建表时直接指定

create table `table`(

`id` int(11) not null auto_increment,

`name` varchar(32) not null,

`pinyin` varchar(32),

....... -- 其他字段

primary key (`id`),

indexName (name(32),pinyin(32))

);

mysql视图

标签:出现   需要   特定   items   null   join   检测   过多   class

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:https://www.cnblogs.com/simadongyang/p/8455267.html

mysql视图登录_mysql视图相关推荐

  1. mysql视图存储_Mysql 视图、存储过程以及权限控制

    导读: 该文章为视图.存储过程.用户权限练习: 如果有不对的地方欢迎指出与补充: 该基础练习基于MySQL5.0以上: 语句格式: 1. 视图格式: create view view_name[列名, ...

  2. mysql 视图用户_MySQL视图,存储过程,用户管理

    1. 视图 一张虚拟表,就是将一个经常被使用的查询作为一个虚拟表,开发者查询的时候不需要再次书写SQL,而是直接调用对应的视图就可,调用视图以后MySQL会执行这个查询SQL. # 创建视图 crea ...

  3. mysql 视图 教程_MySQL视图简介及基本操作教程

    前言 视图是数据库系统中一种非常有用的数据库对象.MySQL 5.0 之后的版本添加了对视图的支持. 认识视图 视图是一个虚拟表,其内容由查询定义.同真实表一样,视图包含一系列带有名称的列和行数据,但 ...

  4. mysql视图应用_MySQL视图的概念与实际应用

    以下的文章主要是对MySQL视图的描述,其中包括MySQ视图L概述,以及创建MySQL视图-create view与修改MySQL视图--alter view等相关内容的具体描述,以下就是文章的具体内 ...

  5. mysql 视图 中文_Mysql视图-WEB资讯专栏-DMOZ中文网站分类目录-免费收录各类优秀网站的中文网站目录....

    1.初识视图 1.视图的概念和作用 什么是视图:是从一个或多个表中导出来的表,它是一种虚拟存在的表,表的结构和数据都依赖于基本表. 作用: 简化查询语句:简化用户的查询操作,使 1.初识视图 1.视图 ...

  6. mysql 视图 排序_MySQL 视图

    视图(view): 什么是视图: 视图就是将查询的结果集展示出来,视图就是一张表 为什么需要视图: 首先,视图并不能加快查询速度,因为视图中本身不存储数据 视图仅仅是村粗再数据字典中的一个定义,同时视 ...

  7. mysql 视图优势_MySQL视图简介及优缺点

    在本教程中,您将了解一个叫作数据库视图的新数据库对象. 我们将讨论使用数据库视图的优缺点. 数据库视图是虚拟表或逻辑表,它被定义为具有连接的SQL SELECT查询语句. 因为数据库视图与数据库表类似 ...

  8. mysql视图参数_MySQL视图概述

    1.介绍 在传统关系型数据库里,视图有时也被称作虚表,是基于特定SQL结果集的虚拟数据表.在有些场合会变得很方便,例如:原有系统重构,旧的数据表A和B已经被拆分和合并到数据表C.D.F里面,为了实现平 ...

  9. mysql 视图查询_MySQL视图复杂查询详解

    内容大纲:什么是视图查询 子查询 标量子查询 关联子查询 如何用SQL解决业务问题 各种函数 总结:知识点图解 视图什么是视图 视图存放的是SQL语句,而数据库表存放的是数据,使用视图时,会运行视图里 ...

最新文章

  1. b站看那个的python_用Python获取B站播放历史记录 !男友居然天天背着我看这些!...
  2. oj上c语言编译错误,名字的漂亮度(华为OJ)C语言版本(提示格式错误,但是编译器没有报错,知道的网友提个意见)...
  3. 网络安全技术文章征稿启事
  4. Linux学习:文件属性函数
  5. C++四种cast操作符
  6. Java读取properties配置文件时,中文乱码解决方法
  7. chatterbot mysql_ChatterBot代码解读-介绍和框架
  8. vue-cli3出现Invalid Host header的解决方案
  9. 对Boost.Asio中异步事件循环的理解
  10. Linux中强大的top命令
  11. 计算机显示10的负次方,我输入10的9次方在EXCEL里,为什么总变成日期了?怎么办/excel10的负次方怎么打...
  12. 语音模块SYN6288
  13. 文本情感分类python_文本情感分类(一):传统模型
  14. 论文阅读:Audio-Driven Emotional Video Portraits
  15. 会员付费超前点播模式争议背后,我们该怎么看待在线视频的未来?
  16. web自定义字体引用与资源压缩
  17. MOSFET的SOA或者ASO是什么?
  18. 艾兰岛编辑器-全局存储
  19. Javaweb8==通过tomcat访问到一段代码并执行,同时读取前端数据和从后端给前端返回数据。通过继承javaEE的HttpServlet类。实现登录注册功能和前端界面。
  20. 突发!47岁技术传奇陈皓(左耳朵耗子)去世,叛逆人生不断创业,网友纷纷悼念...

热门文章

  1. Python lambda表达式与函数式编程
  2. from .pycaffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, RMSPropSolver, AdaDeltaSolver,
  3. python event多线程回调
  4. matlab傅里叶变换矩阵
  5. ubuntu 使用FFTW快速计算离散傅里叶变换
  6. linux 连接远程命令行,screen命令行远程连接
  7. sublimelinter校验php,代码校验工具 SublimeLinter 的安装与使用
  8. RabbitMQ的安装(linux篇)
  9. Linux 热插拔(Hot Plug)处理机制系列
  10. 网络口协商_以太网端口协商解析