mysql视图(一)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: mysql视图


  • 创建视图
DROP view IF EXISTS v_dept;
create view v_dept as select deptno,dname from dept;
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
   VIEW view_name [(column_list)]
   AS select_statement
   [WITH [CASCADED | LOCAL] CHECK OPTION]

视图的作用:

  1. 使操作简单化,可以对经常使用的查询定义一个视图,使用户不必为同样的查询操作指定条件

视图用来隐藏复杂的业务逻辑,从join连接查询产生一个view。先使用 视图完成一定的逻辑,再在视图的基础上完成另外的逻辑。

通常,视图完成的逻辑都是相对比较基础的逻辑。

  1. 增加数据的安全性,通过视图,用户只能查询和修改指定的数据。
  2. 提高表的逻辑独立性,视图可以屏蔽原有表结构变化带来的影响。

总之,使用视图的大部分情况是为了保障数据安全性,提高查询效率

  • 查看视图必须要有SHOW VIEW权限
  • 查看视图基本信息
DESCRIBE view_name;  
DESC view_name;-- DESCRIBE一般都简写成 DESC
-- 显示了视图的字段定义、字段的数据类型、是否为空、是否为主/外键、默认值和额外信息
  • 查看视图的信息
SHOW TABLE STATUS LIKE 'view_name';
-- COMMENT的值为VIEW说明该表为视图,其他的信息为NULL说明这是一个虚表,如果是基表那么会基表的信息,这是基表和视图的区别
  • 查看视图详细信息
SHOW CREATE VIEW view_name;
-- 结果显示视图的名称、创建视图的语句等信息
-- 对VIEWS表的查询可以查看数据库中所有视图的详细信息
SELECT * FROM `information_schema`.`VIEWS`;
  • 查询视图
select * from view_name;
• 1
  • 修改视图
-- CREATE OR REPLACE VIEW 语句修改视图
CREATE OR REPLACE VIEW view_name
AS SELECT column_name(s)
   FROM table_name
   WHERE condition
-- ALTER VIEW 语句修改视图
ALTER OR REPLACE [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)]
AS select_statement [WITH [CASCADED | LOCAL] CHECK OPTION]
-- 该语句用于更改已有视图的定义
-- 其语法与CREATE VIEW类似。当视图不存在时创建,存在时进行修改
ALTER VIEW stu_class AS SELECT stuno FROM student;
alter view v_emp as select empno,ename,job,deptno from emp;
alter view v_emp(v1,v2,v3,v4) as select empno,ename,job,deptno from emp;
  • 更新视图:
    更新视图是指通过视图来插入、更新、删除表数据,因为视图是虚表,其中没有数据。
    通过视图更新的时候都是转到基表进行更新,

如果对视图增加或者删除记录,实际上是对基表增加或删除记录!

UPDATE view_name SET stuname='xiaofang' WHERE stuno=2
select * from view_name;
INSERT INTO view_name VALUES(6,'haojie')
 select * from view_name;
 DELETE FROM view_name WHERE stuno=1

当视图中包含如下内容的时候:

(1)视图中包含基本中被定义为非空的列

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

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

(4)定义视图的SELECT语句中使用了DISTINCT、UNION、TOP、GROUP BY 、HAVING子句

视图的更新操作将不能被执行

  • 删除视图
DROP VIEW [IF EXISTS]
   view_name [, view_name] ...
   [RESTRICT | CASCADE]
DROP VIEW view_name;
DROP view IF EXISTS view_name;
SHOW CREATE VIEW view_name;

视图的更新

mysql> select * from dept;
+--------+-------+-----------+
| deptno | dname | loc       |
+--------+-------+-----------+
|     10 | bsc   | puyang    |
|     11 | bts   | xuchang   |
|     12 | 0521  | zhengzhou |
+--------+-------+-----------+
3 rows in set (0.01 sec)
mysql> create view v_dept as select deptno,dname from dept;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from v_dept;
+--------+-------+
| deptno | dname |
+--------+-------+
|     10 | bsc   |
|     11 | bts   |
|     12 | 0521  |
+--------+-------+
3 rows in set (0.23 sec)
mysql> update v_dept set dname='MSC' where deptno=12;(更新视图)
Query OK, 1 row affected (0.03 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from v_dept;
+--------+-------+
| deptno | dname |
+--------+-------+
|     10 | bsc   |
|     11 | bts   |
|     12 | MSC   |
+--------+-------+
3 rows in set (0.00 sec)
mysql> select * from dept;(基表对应的数据也更新)
+--------+-------+-----------+
| deptno | dname | loc       |
+--------+-------+-----------+
|     10 | bsc   | puyang    |
|     11 | bts   | xuchang   |
|     12 | MSC   | zhengzhou |
+--------+-------+-----------+
3 rows in set (0.00 sec)
删除视图的数据:
mysql> delete from v_dept where deptno=10;
Query OK, 1 row affected (0.00 sec)
mysql> select * from v_dept;
+--------+-------+
| deptno | dname |
+--------+-------+
|     11 | bts   |
|     12 | MSC   |
+--------+-------+
2 rows in set (0.00 sec)
mysql> select * from dept;(基表对应的记录也被删除了)
+--------+-------+-----------+
| deptno | dname | loc       |
+--------+-------+-----------+
|     11 | bts   | xuchang   |
|     12 | MSC   | zhengzhou |
+--------+-------+-----------+
2 rows in set (0.00 sec)

不可更新的视图

某些视图是可更新的。也就是说,可以在诸如UPDATE、DELETE或INSERT等语句中使用它们,以更新基表的内容。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。还有一些特定的其他结构,这类结构会使得视图不可更新。更具体地讲,如果视图包含下述结构中的任何一种,那么它就是不可更新的:

  • 聚合函数(SUM(), MIN(), MAX(), COUNT()等)。
  • DISTINCT
  • GROUP BY
  • HAVING
  • UNION或UNION ALL
  • 位于选择列表中的子查询
  • Join
  • FROM子句中的不可更新视图
  • WHERE子句中的子查询,引用FROM子句中的表
  • 仅引用文字值(在该情况下,没有要更新的基本表)。
  • ALGORITHM = TEMPTABLE(使用临时表总会使视图成为不可更新的)。
创建不可更新的视图:(使用临时表的算法)
mysql> create algorithm=temptable view v_dept2 as select * from dept;
Query OK, 0 rows affected (0.00 sec)
mysql> show create view v_dept2\G
*************************** 1. row ***************************
                View: v_dept2
         Create View: CREATE ALGORITHM=TEMPTABLE DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v_dept2` AS select `dept`.`deptno` AS `deptno`,`dept`.`dname` AS `dname`,`dept`.`loc` AS `loc` from `dept`
character_set_client: gbk
collation_connection: gbk_chinese_ci
1 row in set (0.00 sec)
尝试更新视图,报错,(一定程度上保证了基表数据的安全性)
mysql> update v_dept2 set loc='shanghai' where deptno=10;
ERROR 1288 (HY000): The target table v_dept2 of the UPDATE is not updatable

关于视图的可插入性:insert

如果视图满足关于视图列的下述额外要求,可更新的视图也是可插入的:

  • 不得有重复的视图列名称。
  • 视图必须包含没有默认值的基表中的所有列。
  • 视图列必须是简单的列引用而不是导出列。导出列不是简单的列引用,而是从表达式导出的。

下面给出了一些导出列示例:

  • 3.14159
  • col1 + 3
  • UPPER(col2)
  • col3 / col4
  • (subquery)
    混合了简单列引用和导出列的视图是不可插入的,但是,如果仅更新非导出列,视图是可更新的。


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3天前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:视图之美,简化查询、提升效率的数据库利器(14)
轻松入门MySQL:视图之美,简化查询、提升效率的数据库利器(14)
|
3天前
|
关系型数据库 MySQL 程序员
【MySQL 数据库】8、视图
【MySQL 数据库】8、视图
47 0
|
6月前
|
SQL 关系型数据库 MySQL
MySql数据库中的视图,索引与数据库sql脚本如何导入与导出---(详细介绍)
MySql数据库中的视图,索引与数据库sql脚本如何导入与导出---(详细介绍)
252 0
|
3天前
|
存储 关系型数据库 MySQL
MySQL中如何创建一个视图
MySQL中如何创建一个视图
22 0
|
3天前
|
存储 关系型数据库 MySQL
mysql视图
mysql视图
|
3天前
|
关系型数据库 MySQL
MySQL第四战:视图以及常见面试题(上)
MySQL第四战:视图以及常见面试题(上)
|
3天前
|
关系型数据库 MySQL 索引
【MySQL】17. 视图
【MySQL】17. 视图
12 0
|
6月前
|
存储 关系型数据库 MySQL
MySql进阶使用之视图、索引(详解)
MySql进阶使用之视图、索引(详解)
388 1
|
3天前
|
Oracle 关系型数据库 MySQL
【mysql】—— 视图
【mysql】—— 视图
|
3天前
|
关系型数据库 MySQL
Mysql基础第二十五天,使用视图
Mysql基础第二十五天,使用视图
20 0
Mysql基础第二十五天,使用视图

推荐镜像

更多