MySQL进阶之----视图 , 索引

MySQL视图 , 索引

mysql视图是什么?

mysql视图(view) 是一种虚拟存在的表, 同实表一样, 视图也是有列和行构成, 但视图并不实际存在于数据库中, 行和列的数据来自于定义视图的查询语句, 实际上视图表并不真实存在数据, 只是单独的存放查询语句, 并且还是在使用视图时动态生成的

数据库中只存放的视图的定义, 即查询语句,并没有将数据存放于视图, 这些数据存放在真实的表中, 使用视图时调用里面从查询语句生成临时的数据展示出来, 即数据库会从真实表中取出对应的数据, 因此, 视图中的数据是依赖于真实表中的数据的, 一旦真实表中的数据发生变化, 视图表中的数据也会跟着发生变化.

视图可以从原有的表上选取对应用户的信息, 哪些对用户没用, 或者用户没有权限了解的信息, 都可以直接屏蔽掉, 作用类似于筛选, 这样即使用了简单化, 也保证了系统的安全

建表语句:

department表
create table department(d_id int not null primary key,
d_name varchar(20) not null unique , function varchar(20),
address varchar(100)
);
worker表
create table worker(num int not null primary key,
d_id int , name varchar(20) not null ,
sex char(10) not null ,
birthday datetime ,
homeaddress varchar(50)
) ;

例如: 下面的数据库中有一张公司部门表 department. 表中包括部门号(d_id) 部门名称(d_name) 功能(function) 和办公地址(address) 表结构如下:

mysql> desc department;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| d_id     | int(4)      | NO   | PRI | NULL    |       |
| d_name   | varchar(20) | NO   |     | NULL    |       |
| function | varchar(50) | YES  |     | NULL    |       |
| address  | varchar(50) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

还有一张工表 worker. 表中包含了员工的工号(num). 部门号(d_id) 姓名(name) 性别(sex) 出生日期(birthday) 和家庭住址 (homeaddress) 表结构如下:

mysql> desc worker;
+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| num         | int(10)     | NO   | PRI | NULL    |       |
| d_id        | int(4)      | YES  |     | NULL    |       |
| name        | varchar(20) | NO   |     | NULL    |       |
| sex         | varchar(4)  | NO   |     | NULL    |       |
| birthday    | datetime    | YES  |     | NULL    |       |
| homeaddress | varchar(50) | YES  |     | NULL    |       |
+-------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

由于部门领导的权限范围不同, 因此, 各部门的领导只能看到该部门的员工信息, 而且, 领导可能不关心员工的生日和家庭住址, 为了达到这个目的, 可以为各部门的领导建立一个视图, 通过该视图, 领导只能看到本部门员工指定信息

例如,为生产部门建立一个名为 product view 的视图。通过视图 product view,生产部门的领导只能看到生产部门员工的工作号、姓名和性别等信息。这些 department 表的信息和 worker 表的信息依然存在于各自的表中,而视图 product_view 中不保存任何数据信息。当 department 表和 worker 表的信息发生改变时,视图 product_view 显示的信息也会发生相应的变化。

SQL语句实现:

create  view product_view as 
	select worker.num,worker.name,worker.sex,department.d_name from 
	department inner join worker on department.d_id=worker.d_id;
	
表中数据随意插入,能达到效果就行
效果如下:
mysql> select * from product_view;
+-----+-------+--------+-----------+
| num | name  | sex    | d_name    |
+-----+-------+--------+-----------+
|   1 | chen  | male   | 技术部     |
|   2 | liurx | male   | 销售部     |
|   3 | xiuy  | female | 技术部     |
|   4 | mes   | female | 运营部     |
|   5 | sec   | male   | 人事部     |
|   6 | mie   | male   | 运营部     |
+-----+-------+--------+-----------+
6 rows in set (0.00 sec)

技巧: 如果经常需要很多个表查询指定字段的数据, 可以在这些表上建立一个视图, 通过这个视图显示这些字段的数据

MySQL 的视图不支持传入参数的功能, 因此交互性上还是有欠缺的, 但对于变化不大的操作. 使用视图可以很大程度上简单化用户的操作

总结视图与普通表的区别, 有一下几点

  • 视图不是数据库中真实的数据表, 而是一张虚拟表, 其结构和数据是建立在数据中真实表的查询基础上的. 调用时会自动触发查询语句进行查询后拼接成一张虚拟表展示
  • 存储在数据库中的查询操作SQL语句定义了视图的内容, 列数据和行数据来之于视图查询所引用的实际表, 引用视图动态生成这些数据的
  • 视图没有实际的物理记录, 不是以数据集的形式存储在数据库中的, 它所对应的数据实际上是存储在视图索索引的真实表中
  • 视图是数据的窗口, 而表示内容的真实存放地, 而视图只是以不同的展示方式展示数据, 其数据来源还是真实表的索引
  • 视图是查看数据的一种方法, 可以查询数据表中某些字段构成的数据, 只是一些SQL语句的集合, 从安全的角度来看, 视图的数据安全性更高, 使用视图的用户不接触数据表, 不知道数据表结构
  • 视图的建立和删除只会影响视图本身, 不会对真实数据表造成影响

视图的优质

视图与表在本质上虽然不同, 但是视图经过定义后, 结构形成和表一样, 可以进行查询, 修改, 更新, 和删除等操作, 同时, 具有以下优点

  1. 定制用户数据, 聚焦特定的数据

    在实际的应用过程中, 不同的用户可能对不同的数据有不同的要求

    例如 当数据库存在时, 学生基本信息表和课程表and老师信息表等多种表同时存在时, 可以根据需求让不同的用户使用不同的数据, 学生查看修改自己基本信息的视图, 安排课程人员查看修改课程表和老师信息视图, 教师课程学生信息和课程学校视图

  2. 简单化数据操作

    在使用查询时, 很多时候要使用聚合函数, 同时不要显示其他字段的信息, 可能还需要关联到其他表, 语句肯能会很长, 如果这个表动作频繁发生的话, 可以创建视图来简化操作

  3. 提高数据的安全性

    视图是虚拟的, 物理上是不存在的 可以值授予用户视图权限, 而不具体制定使用表的权限, 来保护基础数据的安全

  4. 共享所需要数据

    通过使用视图, 每个用户不必都定义和存储自己所需的数据, 可以共性数据库中的数据, 同样的数据只需要存储一次

  5. 更改数据格式

    通过使用视图, 可以重新格式化检索出数据, 并组织到其他语言程序中

  6. 重用SQL语句

    视图提供的是对查询操作的封装,本身不包含数据,所呈现的数据是根据视图定义从基础表中检索出来的,如果基础表的数据新增或删除,视图呈现的也是更新后的数据。视图定义后,编写完所需的查询,可以方便地重用该视图。

MySQL创建视图(create view)

前言: 创建视图是指在已经在MySQL数据库表上建立视图, 视图可以建立在一张表中, 也可以建立在多张表中.

基本语法

语法格式:

create view <视图名> as <select语句>

语法说明.

  • <视图名> : 指定视图的名称, 该名称在视图库中必须是唯一的, 不能与其他表或视图同名