视图

视图就是从一个表或多个表导出来的一张虚拟的表。通过这个窗口可以看到系统专门提供的数据,方便用户操作的同时增加了安全性。

视图的特点:

1、视图的列可以来自于不同的表。

2、视图是由实际存在的表创建出来的一个虚表

3、视图的建立和删除不影响虚拟表,但是对视图内容的更新等操作(比如增加、删除、修改)会直接影响实际表。

4、当视图来自多个实际表时,不允许添加和删除数据。

一、创建视图

CREATE  [OR  REPLACE]  [ALGORITHM=[UNDEFINED | MERGE |TEMPLATE]]

VIEW  VIEW_NAME   [COLUMN_LIST]

AS  SELECT  STATEMENT

[WITH  [CASCADED |LOCAL ] ]  CHECK  OPTION

讲解:

CREATE表示创建,REPLACE表示替换已经存在的视图

ALGORITHM表示视图选择的算法,默认时UNDEFINED

COLUMN_LIST:表示视图的属性列。一般不使用

SELECT  STATEMENT表示select语句

[CASCADED |LOCAL ] :CASCADED表示更新视图时要满足所有相关视图和表的条件。LOCAL表示更新视图时满足该视图本身定义的条件即可。

注意:

1、创建视图要求使用者有CREATE  VIEW权限和SELECT语句选择列权限

    

2、创建视图最好加上WITH  CASCADED  CHECK  OPTION参数。保证数据的安全性

举例

单表创建视图

mysql> create or replace view view_test1_1 as select id,name  from test1_1 with cascaded check option;
Query OK, rows affected (0.00 sec) mysql> desc view_test1_1;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int() | NO | | NULL | |
| name | varchar() | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
rows in set (0.00 sec) mysql> select * from view_test1_1;
+----+--------+
| id | name |
+----+--------+
| | 超峰 |
| | b |
| | c |
| | a |
| | chen |
| | NULL |
+----+--------+
rows in set (0.00 sec)

对于多表创建视图就是将多个表使用join....on.....的方式连接起来然后选择其中的一些字段后创建的视图

二、查看视图

1、DESC语句也是可以查看视图的结构。

2、SHOW  TABLES  STATUS语句查看视图的基本信息。

语法为:SHOW  TABLES  STATUS  [FROM   DATABASE_NAME]  LIKE  'VIEW_NAME'  \G

这个命令也是可以查看一般表的基本的信息

针对这些参数的意思是什么我们可以去网上搜一下

3、SHOW  CREATE VIEW  VIEW_NAME语句查看视图创建的详细信息

mysql> SHOW CREATE VIEW view_test1_1\G
*************************** . row ***************************
View: view_test1_1
Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_test1_1` AS select `test1_1`.`id` AS `id`,`test1_1`.`name` AS `name` from `test1_1` WITH CASCADED CHECK OPTION
character_set_client: utf8
collation_connection: utf8_general_ci
row in set (0.00 sec)

4、在views表中查看视图详细信息

在MYSQL中所有视图的定义都保存在数据库information_schema中的表views中。

mysql> select * from information_schema.views where table_name='view_test1_1'\G
*************************** . row ***************************
TABLE_CATALOG: def
TABLE_SCHEMA: test1
TABLE_NAME: view_test1_1
VIEW_DEFINITION: select `test1`.`test1_1`.`id` AS `id`,`test1`.`test1_1`.`name` AS `name` from `test1`.`test1_1`
CHECK_OPTION: CASCADED
IS_UPDATABLE: YES
DEFINER: root@localhost
SECURITY_TYPE: DEFINER
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
row in set (0.00 sec)

二、修改视图

修改视图有两种语法,

第一种跟创建视图的语法一样:

  CREATE  [OR  REPLACE]  [ALGORITHM=[UNDEFINED | MERGE |TEMPLATE]]

  VIEW  VIEW_NAME   [COLUMN_LIST]

  AS  SELECT  STATEMENT

  [WITH  [CASCADED |LOCAL ] ]  CHECK  OPTION

使用这种方法的时候记得开头是CREATE  OR  REPLACE。。。。。。。

mysql> CREATE OR REPLACE VIEW view_test1_1 as select id from test1_1 with check option;
Query OK, rows affected (0.01 sec) mysql> select * from view_test1_1;
+----+
| id |
+----+
| |
| |
| |
| |
| |
| |
+----+
rows in set (0.00 sec)

第二种就是使用ALTER  VIEW语句的方式修改视图

  ALTER  [ALGORITHM=[UNDEFINED | MERGE |TEMPLATE]]

  VIEW  VIEW_NAME   [COLUMN_LIST]

  AS  SELECT  STATEMENT

  [WITH  [CASCADED |LOCAL ] ]  CHECK  OPTION

mysql> ALTER VIEW view_test1_1 AS select id,name,grade from test1_1 with check option;
Query OK, rows affected (0.00 sec) mysql> select * from view_test1_1;
+----+--------+-------+
| id | name | grade |
+----+--------+-------+
| | 超峰 | |
| | b | |
| | c | |
| | a | |
| | chen | |
| | NULL | NULL |
+----+--------+-------+
rows in set (0.00 sec)

请注意,修改视图等操作需要用户有DROP权限

三、更新视图

更新视图是指通过视图来插入、更新、删除表中的数据,因为视图是一个虚拟表,其中没有数据,通过视图更新时,都是转换到实际表来更新的。

那么更新视图的数据后对实际表产生影响,所以就有两种情况:一是更新了视图后,实际表数据也更新,二是实际表更新了数据,视图中的数据也会更新。

1、先来讨论第一种情况:

mysql> select * from view_test1_1;
+----+--------+-------+
| id | name | grade |
+----+--------+-------+
| | 超峰 | |
| | b | |
| | c | |
| | a | |
| | chen | |
| | NULL | NULL |
+----+--------+-------+
rows in set (0.00 sec) mysql> update view_test1_1 set name='chao' where id=;
Query OK, row affected (0.00 sec)
Rows matched: Changed: Warnings: mysql> select * from view_test1_1;
+----+--------+-------+
| id | name | grade |
+----+--------+-------+
| | 超峰 | |
| | b | |
| | c | |
| | chao | |
| | chen | |
| | NULL | NULL |
+----+--------+-------+
rows in set (0.00 sec) mysql> select * from test1_1;
+----+--------+-------+
| id | name | grade |
+----+--------+-------+
| | 超峰 | |
| | b | |
| | c | |
| | chao | |
| | chen | |
| | NULL | NULL |
+----+--------+-------+
rows in set (0.00 sec)

这个例子中,我是先更新视图,然后查询视图中的数据已经更新了,后来查询实际表数据也更新了

2、看第二种情况

mysql> select * from test1_1;
+----+--------+-------+
| id | name | grade |
+----+--------+-------+
| | 超峰 | |
| | b | |
| | c | |
| | chao | |
| | chen | |
| | NULL | NULL |
+----+--------+-------+
rows in set (0.00 sec) mysql> update test1_1 set name='feng',grade= where id=;
Query OK, row affected (0.00 sec)
Rows matched: Changed: Warnings: mysql> select * from test1_1;
+----+--------+-------+
| id | name | grade |
+----+--------+-------+
| | 超峰 | |
| | b | |
| | c | |
| | chao | |
| | chen | |
| | feng | |
+----+--------+-------+
rows in set (0.00 sec) mysql> select * from view_test1_1;
+----+--------+-------+
| id | name | grade |
+----+--------+-------+
| | 超峰 | |
| | b | |
| | c | |
| | chao | |
| | chen | |
| | feng | |
+----+--------+-------+
rows in set (0.00 sec)

插入视图中数据

mysql> select * from view_test1_1;
+----+--------+-------+
| id | name | grade |
+----+--------+-------+
| | 超峰 | |
| | b | |
| | c | |
| | chao | |
| | chen | |
| | feng | |
+----+--------+-------+
rows in set (0.00 sec) mysql> insert into view_test1_1 values (,'wang',);
Query OK, row affected (0.00 sec) mysql> select * from view_test1_1;
+----+--------+-------+
| id | name | grade |
+----+--------+-------+
| | 超峰 | |
| | b | |
| | c | |
| | chao | |
| | chen | |
| | feng | |
| | wang | |
+----+--------+-------+
rows in set (0.00 sec) mysql> select * from test1_1;
+----+--------+-------+
| id | name | grade |
+----+--------+-------+
| | 超峰 | |
| | b | |
| | c | |
| | chao | |
| | chen | |
| | feng | |
| | wang | |
+----+--------+-------+
rows in set (0.00 sec)

这个例子是演示

删除视图数据

mysql> select * from view_test1_1;
+----+--------+-------+
| id | name | grade |
+----+--------+-------+
| | 超峰 | |
| | b | |
| | c | |
| | chao | |
| | chen | |
| | feng | |
| | wang | |
+----+--------+-------+
rows in set (0.00 sec) mysql> select * from test1_1;
+----+--------+-------+
| id | name | grade |
+----+--------+-------+
| | 超峰 | |
| | b | |
| | c | |
| | chao | |
| | chen | |
| | feng | |
| | wang | |
+----+--------+-------+
rows in set (0.00 sec) mysql> delete from view_test1_1 where id = ;
Query OK, row affected (0.01 sec) mysql> select * from view_test1_1;
+----+--------+-------+
| id | name | grade |
+----+--------+-------+
| | 超峰 | |
| | b | |
| | c | |
| | chao | |
| | chen | |
| | feng | |
+----+--------+-------+
rows in set (0.00 sec) mysql> select * from test1_1;
+----+--------+-------+
| id | name | grade |
+----+--------+-------+
| | 超峰 | |
| | b | |
| | c | |
| | chao | |
| | chen | |
| | feng | |
+----+--------+-------+
rows in set (0.00 sec)

当删除视图数据的时候,我们发现实际表的数据也删除了。

四、不能更新的视图

上面的例子中我们演示了插入、更新、删除师徒数据,他们都对实际表产生了影响,所以说更新视图时,实际上更新的是实际表的记录,但是并不是所有的视图都可以更新。下面列举几种情况

1、创建视图时,视图中包含一些函数,比如sum()、count() 、max() 、min()

2、视图中包含关键字  UNION、UNION ALL 、DISTINCT、GROUP BY、HAVING

3、创建常量视图

比如:

mysql> create view view_common AS select 'chaofeng' as name;
Query OK, rows affected (0.00 sec) mysql> select * from view_common;+----------+
| name |
+----------+
| chaofeng |
+----------+
row in set (0.00 sec)

4、视图中select语句包含子查询

5、由不可更新的视图导出的视图

6、创建视图时,ALGORITHM为TEMPTABLE类型

7、视图对于的表存在没有默认值的列,而且该列没有包含在视图里

五、删除视图

删除视图指的是删除数据库中已存在的视图,也就是说我们删除的是视图的定义,而不是删除了数据。

语法:DROP  VIEW  VIEW_NAME

mysql> show tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| test1_1 |
| test1_2 |
| test1_3 |
| test1_4 |
| test1_5 |
| view_common |
| view_test1_1 |
+-----------------+
rows in set (0.00 sec) mysql> DROP VIEW view_test1_1;
Query OK, rows affected (0.00 sec) mysql> DROP VIEW view_common;
Query OK, rows affected (0.00 sec) mysql> show tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| test1_1 |
| test1_2 |
| test1_3 |
| test1_4 |
| test1_5 |
+-----------------+
rows in set (0.00 sec)

MySQL中视图和表的区别及联系是什么?

两者的区别:

1、视图时按照SQL语句生成的一个虚拟表。

2、视图不占实际的物理空间,而表中的记录需要占用物理空间

3、建立和删除视图只影响视图本身,不会影响实际的记录。而更新表会影响实际的记录

两者的联系:

1、视图是建立在实际表之上建立的表,其字段和记录都来自实际表,视图依赖基本表存在

2、一个视图对应一个基本表,也可以对应多个基本表

3、视图时基本表的抽象,在逻辑意义上建立的新关系。

MySQL基础之 视图的更多相关文章

  1. mysql基础之视图、事务、索引、外键

    一.视图 视图是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询所引用的表,并且在引用 ...

  2. Mysql基础知识--视图

    一.视图的操作 为了提高SQL语句的复用性和操作表的安全性,,MySQL数据库管理系统5提供了视图特性. 视图:本质上是一种虚拟表,其内容与真实的表相似,包含一系列带有名称的行和列数据.但是视图并不在 ...

  3. MySQL基础之视图

    关于视图 视图是虚表,其中并不存在数据,只是多个表的组成 使用视图的优势 视图可以代替复杂的查询SQL语句,可以事先将不同表的多个数据组织起来 提高权限控制管理,能够将权限限制为行级管理,更具有安全性 ...

  4. MySQL 基础七 视图

    -- 查看表 SELECT * FROM student; SHOW CREATE TABLE student; -- 创建视图 CREATE VIEW v_student1 AS SELECT *F ...

  5. MySQL基础(五)——视图

    MySQL基础(五)--视图

  6. MySQL基础笔记(五) 视图

    一.什么是视图 视图是一个虚拟表.也就是说,视图在外观和行为上都类似于表,但它不需要实际的物理存储,只保存了视图定义(查询语句). 视图由select查询所定义 -- 当创建一个视图时,实际上是在数据 ...

  7. MySQL基础(4) | 视图

    MySQL基础(4) | 视图 基本语法 1.创建 CREATE VIEW <视图名> AS <SELECT语句> 语法说明如下. <视图名>:指定视图的名称.该名 ...

  8. Mysql基础代码(不断完善中)

    Mysql基础代码,不断完善中~ /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限 ...

  9. MySQL基础学习总结

    1.MySQL基础概念 mysql逻辑架构如下: 每个客户端连接都会在服务器中拥有一个线程,这个连接的查询只会在这个单独的线程中执行. MySQL是分层的架构.上层是服务器层的服务和查询执行引擎,下层 ...

随机推荐

  1. java concurrent 探秘

    我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便.而当针对高质量Java ...

  2. Docker环境下搭建DNS LVS(keepAlived) OpenResty服务器简易集群

    现在上网已经成为每个人必备的技能,打开浏览器,输入网址,回车,简单的几步就能浏览到漂亮的网页,那从请求发出到返回漂亮的页面是怎么做到的呢,我将从公司中一般的分层架构角度考虑搭建一个简易集群来实现.目标 ...

  3. MVC会员注销功能Cookie的应用

    我们实现了<MVC应用程序实现会员登录功能>http://www.cnblogs.com/insus/p/3466512.html 有登录就会有注销功能.此次Insus.NET练习一个MV ...

  4. SQL SERVER存储过程中使用事务

    存储过程格式: CREATE PROCEDURE YourProcedure AS BEGIN SET NOCOUNT ON; BEGIN TRY---------------------开始捕捉异常 ...

  5. SSH:Hibernate框架(七种关联关系映射及配置详解)

    概念 基本映射是对一个实体进行映射,关联映射就是处理多个实体之间的关系,将关联关系映射到数据库中,所谓的关联关系在对象模型中有一个或多个引用. 分类 关联关系分为上述七种,但是由于相互之间有各种关系, ...

  6. hadoop学习之yarn资源管理

    一.yarn简介 yarn是在hadoop2.x中才引入的一个新的机制,在hadoop1.x中MapReduce任务需要同时做任务管理和资源分配,那么引入yarn之后,hadoop的资源管理的任务就全 ...

  7. DVWA的安装

    DVWA(Dam Vulnerable Web Application)是基于PHP+Mysql的一套用于常规Web漏洞教学和检测Web脆弱性测试程序,包含了SQL注入,Xss,盲注等常用的一些安全漏 ...

  8. 微信小程序 引入公共页面的几种情况

    1.不带参数 首先在pages文件夹中新建一个template文件夹,文件夹中新建一个template.wxml文件,代码如下 <!--template.wxml--> <templ ...

  9. Wampserver配置与本地建站

    ☆根目录修改问题 /.修改运行根目录 1.修改apache配置,将服务请求定位到新目录下 →左击wampserver,点击Apache打开httpd.conf文件,Ctrl+f搜索documentro ...

  10. MongoDB -的连接和使用

    MongoDB 的 连接使用 在节我们将讨论 MongoDB 的不同连接方式. 启动 MongoDB 服务 在前面的,我们已经讨论了如何启动 MongoDB 服务,你只需要在 MongoDB 安装目录 ...