十、MySQL视图

数据库中的视图是一个虚拟表。同真实的表一样,视图包含一系列带有名称的行和列数据。行和列数据来自由定义视图查询所引用的表,并且在引用视图时动态生成。

10.1、视图概述

视图是从一个或多个表中导出的,视图的行为与表非常相似,但视图是一个虚拟表。在视图中用户可以使用SELECT语句查询,以及使用INSERT、UPDATE、DELETE修改记录。

视图是一个虚拟表,是从数据库中一个或多个表中导出来的表。试图还可以从已存在的视图的基础上定义。视图一经定义便存储在数据库中,与其相对应的数据并没有像表那样在数据库中再存储一份。通过视图看到的数据只是存在基本表的数据。

视图的主要优点有:


1. 视点集中

视图集中即是使用户只关心它感兴趣的某些特定数据和他们所负责的特定任务。这样通过只允许用户看到视图中所定义的数据而不是视图引用表中的数据而提高了数据的安全性。

2. 简化操作

视图大大简化了用户对数据的操作。因为在定义视图时,若视图本身就是一个复杂查询的结果集,这样在每一次执行相同的查询时,不必重新写这些复杂的查询语句,只要一条简单的查询视图语句即可。可见视图向用户隐藏了表与表之间的复杂的连接操作。

3. 定制数据

视图能够实现让不同的用户以不同的方式看到不同或相同的数据集。因此,当有许多不同水平的用户共用同一数据库时,这显得极为重要。

4. 合并分割数据

在有些情况下,由于表中数据量太大,故在表的设计时常将表进行水平分割或垂直分割,但表的结构的变化却对应用程序产生不良的影响。如果使用视图就可以重新保持原有的结构关系,从而使外模式保持不变,原有的应用程序仍可以通过视图来重载数据。

5. 安全性

视图可以作为一种安全机制。通过视图用户只能查看和修改他们所能看到的数据。其它数据库或表既不可见也不可以访问。如果某一用户想要访问视图的结果集,必须授予其访问权限。视图所引用表的访问权限与视图权限的设置互不影响。

10.2、创建视图

创建视图的语法

创建视图使用CREATE VIEW语句,其语法格式为:

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

CREATE表示创建新的视图

REPLACE表示替换已创建的视图

ALGORITHM表示视图选择的算法

UNDEFINED:MySQL自动选择算法

MERGE:将使用的视图语句与视图定义结合起来,使得视图定义的某一部分取代语句对应的部分

TEMPTABLE:将视图的结果存入临时表,然后用临时表来执行语句

view_name为视图的名称,column_list为属性列
select_statement表示SELECT语句

WITH [CASCADED | LOCAL] CHECK OPTION参数表示视图在更新时保证在视图的权限范围内

CASCADED:表示更新视图时要满足所有相关视图和表的条件

LOCAL:更新视图时满足该视图本身定义的条件即可


在单表上创建视图

在t表格上创建一个名为view_t的视图

mysql> CREATE TABLE t (qty INT, price INT);
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO t VALUES(3, 50);
Query OK, 1 row affected (0.02 sec)

mysql> CREATE VIEW view_t AS SELECT qty, price, qty *price FROM t;            
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT * FROM view_t;
+------+-------+------------+
| qty  | price | qty *price |
+------+-------+------------+
|    3 |    50 |        150 |
+------+-------+------------+
1 row in set (0.00 sec)

在t表格上创建一个名为view_t2的视图

mysql> CREATE VIEW view_t2(qty, price, total ) AS SELECT qty, price, qty *price FROM t;
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT * FROM view_t2;
+------+-------+-------+
| qty  | price | total |
+------+-------+-------+
|    3 |    50 |   150 |
+------+-------+-------+
1 row in set (0.00 sec)


在多表上创建视图

在表student和表stu_info上创建视图stu_glass

mysql> CREATE TABLE student( id INT, name CHAR(11));  
Query OK, 0 rows affected (0.03 sec)

mysql> CREATE TABLE stu_info(
    -> id INT,
    -> name CHAR(11),
    -> glass CHAR(11)
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO student VALUES(1,‘wanglin1‘),(2,‘gaoli‘),(3,‘zhanghai‘); 
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> INSERT INTO stu_info VALUES(1, ‘wuban‘,‘henan‘),(2,‘liuban‘,‘hebei‘),(3,‘qiban‘,‘sh
andong‘);
Query OK, 3 rows affected (0.02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> CREATE VIEW stu_glass (id,name, glass) AS SELECT student.id,student.name ,stu_info.
glass FROM student ,stu_info WHERE student.id=stu_info.id;
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT * FROM stu_glass;
+------+----------+----------+
| id   | name     | glass    |
+------+----------+----------+
|    1 | wanglin1 | henan    |
|    2 | gaoli    | hebei    |
|    3 | zhanghai | shandong |
+------+----------+----------+
3 rows in set (0.00 sec)

10.3、查看视图

查看视图是查看数据库中已存在的视图的定义。查看视图必须有SHOW VIEW 的权限。查看视图的方法有DESCRIBE、SHOW TABLE STATUS、SHOW CREATE VIEW。

通过DESCRIBE语句查看视图view_t的定义

mysql> DESCRIBE view_t;
+------------+------------+------+-----+---------+-------+
| Field      | Type       | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+-------+
| qty        | int(11)    | YES  |     | NULL    |       |
| price      | int(11)    | YES  |     | NULL    |       |
| qty *price | bigint(21) | YES  |     | NULL    |       |
+------------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

使用SHOW TABLE STATUS命令查看视图信息

mysql> SHOW TABLE STATUS LIKE ‘view_t‘ \G;
*************************** 1. row ***************************
           Name: view_t
         Engine: NULL
        Version: NULL
     Row_format: NULL
           Rows: NULL
 Avg_row_length: NULL
    Data_length: NULL
Max_data_length: NULL
   Index_length: NULL
      Data_free: NULL
 Auto_increment: NULL
    Create_time: NULL
    Update_time: NULL
     Check_time: NULL
      Collation: NULL
       Checksum: NULL
 Create_options: NULL
        Comment: VIEW
1 row in set (0.00 sec)
ERROR: 
No query specified

mysql> SHOW TABLE STATUS LIKE ‘t‘ \G;
*************************** 1. row ***************************
           Name: t
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 1
 Avg_row_length: 16384
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 7340032
 Auto_increment: NULL
    Create_time: 2017-08-04 19:38:50
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: 
1 row in set (0.00 sec)
ERROR: 
No query specified

SHOW CREATE VIEW查看视图的详细定义,代码如下:

mysql> SHOW CREATE VIEW view_t \G;
*************************** 1. row ***************************
                View: view_t
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `view_t` AS select `t`.`qty` AS `qty`,`t`.`price` AS `price`,(`t`.`qty` * `t`.`price`) AS `qty *price` from `t`
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)
ERROR: 
No query specified

在views表中查看视图的详细定义

mysql> SELECT * FROM information_schema.views \G;
*************************** 1. row ***************************
       TABLE_CATALOG: def
        TABLE_SCHEMA: test
          TABLE_NAME: stu_glass
     VIEW_DEFINITION: select `test`.`student`.`id` AS `id`,`test`.`student`.`name` AS `name`,`test`.`stu_info`.`glass` AS `glass` from `test`.`student` join `test`.`stu_info` where (`test`.`student`.`id` = `test`.`stu_info`.`id`)
        CHECK_OPTION: NONE
        IS_UPDATABLE: YES
             DEFINER: [email protected]
       SECURITY_TYPE: DEFINER
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
*************************** 2. row ***************************
       TABLE_CATALOG: def
        TABLE_SCHEMA: test
          TABLE_NAME: view_t
     VIEW_DEFINITION: select `test`.`t`.`qty` AS `qty`,`test`.`t`.`price` AS `price`,(`test`.`t`.`qty` * `test`.`t`.`price`) AS `qty *price` from `test`.`t`
        CHECK_OPTION: NONE
        IS_UPDATABLE: YES
             DEFINER: [email protected]
       SECURITY_TYPE: DEFINER
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
*************************** 3. row ***************************
       TABLE_CATALOG: def
        TABLE_SCHEMA: test
          TABLE_NAME: view_t2
     VIEW_DEFINITION: select `test`.`t`.`qty` AS `qty`,`test`.`t`.`price` AS `price`,(`test`.`t`.`qty` * `test`.`t`.`price`) AS `total` from `test`.`t`
        CHECK_OPTION: NONE
        IS_UPDATABLE: YES
             DEFINER: [email protected]
       SECURITY_TYPE: DEFINER
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
3 rows in set (0.00 sec)
ERROR: 
No query specified

10.4、修改视图

修改视图是指修改数据库中存在的视图,当基本表的某些字段发生变化的时候,可以通过修改视图来保持与基本表的一致性。MySQL通过CREATE OR REPLACE VIEW语句和ALTER语句修改视图。

使用CREATE OR REPLACE VIEW的基本语法为:

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

修改视图view_t

mysql> DESC view_t;
+------------+------------+------+-----+---------+-------+
| Field      | Type       | Null | Key | Default | Extra |
+------------+------------+------+-----+---------+-------+
| qty        | int(11)    | YES  |     | NULL    |       |
| price      | int(11)    | YES  |     | NULL    |       |
| qty *price | bigint(21) | YES  |     | NULL    |       |
+------------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

mysql> CREATE OR REPLACE VIEW view_t AS SELECT * FROM t;
Query OK, 0 rows affected (0.07 sec)

mysql> DESC view_t;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| qty   | int(11) | YES  |     | NULL    |       |
| price | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

ALTER语句是MySQL提供的另一种修改视图的方法,其语法格式为:

ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
    VIEW view_name [(column_list)]
    AS select_statement
    [WITH [CASCADED | LOCAL] CHECK OPTION]

使用ALTER语句修改视图view_t

mysql> DESC view_t;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| qty   | int(11) | YES  |     | NULL    |       |
| price | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)

mysql> ALTER VIEW view_t AS SELECT qty FROM t;      
Query OK, 0 rows affected (0.01 sec)

mysql> DESC view_t;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| qty   | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

10.5、更新视图

更新视图是指通过视图来插入、更新、删除表中的数据,因为视图是一个虚拟表,其中没有数据。通过视图更新的时候都是转到基本表上进行更新的。

使用UPDATE语句更新视图view_t

mysql> SELECT * FROM view_t;   /*查看更新之前的视图*/
+------+
| qty  |
+------+
|    3 |
+------+
1 row in set (0.00 sec)        

mysql> SELECT * FROM t;       /*查看更新之前的表*/
+------+-------+
| qty  | price |
+------+-------+
|    3 |    50 |
+------+-------+
1 row in set (0.00 sec)
               
mysql> UPDATE view_t SET qty=5;  /*更新视图*/   
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM t;          /*查看更新之后的表*/
+------+-------+
| qty  | price |
+------+-------+
|    5 |    50 |
+------+-------+
1 row in set (0.00 sec)

mysql> SELECT * FROM view_t;    /*查看更新之后的视图*/
+------+
| qty  |
+------+
|    5 |
+------+
1 row in set (0.00 sec)

mysql> SELECT * FROM view_t2; 
+------+-------+-------+
| qty  | price | total |
+------+-------+-------+
|    5 |    50 |   250 |
+------+-------+-------+
1 row in set (0.00 sec)

使用INSERT语句在基本表t中插入一条记录

mysql> INSERT INTO t VALUES (3,5);
Query OK, 1 row affected (0.02 sec)

mysql> SELECT * FROM t;
+------+-------+
| qty  | price |
+------+-------+
|    5 |    50 |
|    3 |     5 |
+------+-------+
2 rows in set (0.00 sec)

mysql> SELECT * FROM view_t2;
+------+-------+-------+
| qty  | price | total |
+------+-------+-------+
|    5 |    50 |   250 |
|    3 |     5 |    15 |
+------+-------+-------+
2 rows in set (0.00 sec)

当视图中包含以下内容时,视图的更新操作将不能执行:


视图中不包含基表中被定义为非空的列;

在定义视图的SELECT语句后的字段列表中使用了数学表达式;

在定义视图的SELECT语句后的字段列表中使用聚合函数;

在定义视图的SELECT语句中使用了DISTINCT、UNION、TOP、GROUP BY或HAVING子句。

10.6、删除视图

当视图不再需要时,可以将其删除,其语法格式为:

DROP VIEW [IF EXISTS]
    view_name [, view_name] ...
    [RESTRICT | CASCADE]

删除stu_glass视图

mysql> DROP VIEW IF EXISTS stu_glass;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW CREATE VIEW stu_glass;
ERROR 1146 (42S02): Table ‘test.stu_glass‘ doesn‘t exist
时间: 2024-10-17 19:34:28

十、MySQL视图的相关文章

7Python全站之路系列之MySQL视图

Python全栈之路系列之MySQL视图 视图是一个虚拟表(非真实存在),其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用名称即可获取结果集,并可以将其当作表来使用. 创建视图 创建一个名称为v1的视图,其功能就是查询color表中的所有数据 CREATE VIEW v1 AS SELECT * FROM color; 查看视图 使用视图时,将其当作表进行操作即可,由于视图是虚拟表,所以无法使用其对真实表进行创建.更新和删除操作,仅能做查询用. select * from 

第11章 mysql 视图

2015-10-24 目录 参考资料 [1] 唐汉明.深入浅出MySQL 数据库开发.优化与管理维护(第2版)[M].北京:人民邮电出版社,2014 [2] Schwartz.高性能MySQL(第3版)[M].北京:电子工业出版社,2013 [3] 范德兰斯.MySQL开发者SQL权威指南 [M].北京:机械工业出版社,2008 [4] Forta.MySQL必知必会 [M].北京:人民邮电出版社,2009 [5] mysql视图学习总结 [6] mysql之视图 [7] mysql之视图详解

八、mysql视图、存储过程、函数以及时间调度器

1.create or replace view emp_view as select * from t4 ;给t4表创建一个名为emp_view的视图 2.drop view emp_view 删除视图 ======================================= 1.创建一个存储过程(查询所有数据) create procedure p1 () READS SQL DATA BEGIN select * from t4; END 2.创建一个存储过程(查询传参数据) cre

Oracle学习(十):视图,索引,序列号,同义词

1.知识点:可以对照下面的录屏进行阅读 视图,序列,索引,同义词 SQL> --视图:虚表 SQL> --视图的优点:简化复杂查询,限制数据访问(银行用的多),提供数据的相互独立,同样的数据可以有不同的显示方式 SQL> --第一个视图: 员工号 姓名 月薪 年薪 SQL> create view view1 2 as 3 select empno,ename,sal,sal*12 annlsal from emp; SQL> --如果显示没有权限,则需要授权,见下图1-1

MySQL视图view/存储过程和函数的使用

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Helvetica Neue"; color: #454545 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 17.0px ".PingFang SC Semibold"; color: #454545 } p.p3 { margin: 0.0px 0.0px 2.0px 0.0px; font: 14.0px

深入解析MySQL视图view

阅读目录---深入解析MySQL视图 创建视图 查看视图 视图的更改 create or replace view alter DML drop 使用with check option约束 嵌套视图 定义视图时的其他选项:algorithm.definer.SQL security 视图查询语句的处理 替代方法 具体化方法 Q:什么是视图?视图是干什么用的? A: 视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据.作为一个select语句保存在数据字典中的. 通过视图,可以展现

MySQL视图概述

1.介绍 在传统关系型数据库里,视图有时也被称作虚表,是基于特定SQL结果集的虚拟数据表.在有些场合会变得很方便,例如:原有系统重构,旧的数据表A和B已经被拆分和合并到数据表C.D.F里面,为了实现平滑迁移不影响对外数据业务,可以分别创建和原有数据表A和B一致的视图G和H,再实现数据层升级,不影响现有业务. 2.创建 创建MySQL视图语法如下 CREATE [ALGORITHM=[UNDEFINED | MERGE | TEMPTABLE] ] [DEFINER=用户名] [SQL SECUR

MySQL 视图使用初探

<一> 视图 1.优点 视点集中 简化操作 定制数据 合并分割数据 安全性 2.为什么需要视图? 视图是存储在数据库中的查询的sql 语句,它主要出于两种原因: 安全原因,视图可以隐藏一些数据,如社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等, 可使复杂的查询易于理解和使用. 3.创建视图的语法 CREATE VIEW view_name      AS         SELECT column_name(s)         FROM table_name    

Mysql视图的作用及其性能分析

定义:视图是从一个或几个基本表导出的表,它与基本表不同,是一个虚表. 作用: 1.简化操作,不用进行多表查询. 2.当不同种类的用用户共享同一个数据库时,非常灵活,(用户以不同的 方式看待同一数据. 3.视图对重构数据库提供了一定程度的逻辑独立性. 数据的逻辑独立性是指:如增加新的关系或对原有的关系增加新的 字段,用户的应用程序不受影响. 例如:原有一个Student(Sno,Sname,Ssex,Sage,Sdept)这样一个表. 后来变动为:Sx(Sno,Sname,Sage)和SY(Sno

MySQL 视图知识点小结

视图本身是一个虚拟表,不存放任何数据.在使用SQL语句访问视图的时候,它返回的数据是MySQL从其他表中生成的.视图和表在同一个命名空间, MySQL在很多地方对于视图和表是同样对待的.不过视图和表也有不同.例如,不能在视图上创建触发器,也不能用DROP TABLE命令删除视图. 视图的实现算法: 合并算法:merge 临时表算法:tmptable 可更新视图(updatable view):可以通过更新视图来更新视图涉及的相关表. 如果视图定义中包含了group by .union.聚合函数.