01-视图的含义

视图是从一个或者多个表中导出的,视图的行为与表非常相似,但视图是一个虚拟表。视图还可以从已经存在的视图的基础上定义。

02-创建视图

# 基本语法格式:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS SELECT_statement [WITH [CASCADED | LOCAL] CHECK OPTION] CREATE表示创建新视图;REPLACE表示替换已经创建的视图;
ALGORITHM表示视图选择的算法;view_name 为视图的名称;
column_list 为属性列;SELECT_statement表示select语句;WITH[CASCADED | LOCAL] CHECK OPTION 参数表示视图在更新时保证在视图的权限范围之内。
ALGORITHM的取值有3个,分别是 UNDEFINED | MERGE | TEMPTABLE,
UNDEFINED 表示MySQL将自动选择算法;
MERGE 表示将使用的视图语句与视图定义合并起来,使得视图定义的某一部分取代语句对应的部分;
TEMPTABLE 表示将视图的结果存入临时表,然后用临时表来执行语句。
CASCADED | LOCAL 为可选参数,CASCADED 为默认值,表示更新视图时要满足所有相关视图和表的条件;
LOCAL 表示更新视图时满足该视图本身定义的条件即可。

在单表上创建视图:

mysql> mysql> create t (quantity int, price int);
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 6
Current database: test_db Query OK, 0 rows affected (0.15 sec) mysql> insert into t values (3, 50);
Query OK, 1 row affected (0.01 sec) mysql> create view view_t as select quantity,price, quantity*price from t;
Query OK, 0 rows affected (0.03 sec) mysql> select * from views_t;
ERROR 1146 (42S02): Table 'test_db.views_t' doesn't exist
mysql> select * from view_t;
+----------+-------+----------------+
| quantity | price | quantity*price |
+----------+-------+----------------+
| 3 | 50 | 150 |
+----------+-------+----------------+
1 row in set (0.01 sec) mysql> create view view_t2 (qty, price, total) as select quantity, price, quantity*price from t;
Query OK, 0 rows affected (0.02 sec) mysql> select * from view_t2;
+------+-------+-------+
| qty | price | total |
+------+-------+-------+
| 3 | 50 | 150 |
+------+-------+-------+
1 row in set (0.01 sec)

在多表上创建视图

mysql> create table student (s_id int, name varchar(255));
Query OK, 0 rows affected (0.02 sec) mysql> insert into student values (1, 'liming'), (2, 'wangwu'), (3, 'lisi');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0 mysql> create table stu_info (s_id int, glass varchar(255), address varchar(255));
Query OK, 0 rows affected (0.02 sec) mysql> insert into stu_info values (1, 'wuban', 'jilin'), (2, 'liuban', 'shandong'), (3, 'qiban', 'beijing');
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0 # 创建视图
mysql> create view stu_glass (id, name, glass) as select student.s_id, student.name, stu_info.glass from student, stu_info where student.s_id = stu_info.s_id;
Query OK, 0 rows affected (0.03 sec) mysql> select * from stu_glass;
+------+--------+--------+
| id | name | glass |
+------+--------+--------+
| 1 | liming | wuban |
| 2 | wangwu | liuban |
| 3 | lisi | qiban |
+------+--------+--------+
3 rows in set (0.01 sec)

03-查看视图

查看视图是查看数据库中已存在的视图的定义。查看视图必须要有 SHOW VIEW 的权限,MySQL数据库下的user 表中保存着这个信息。

查看视图的方法包括:DESCRIBE、SHOW TABLE STATUS 和 SHOW CREATE VIEW。

DESCRIBE、SHOW TABLE STATUS 和 SHOW CREATE VIEW。

# 1、使用DESCRIBE 语句查看视图基本信息
DESCRIBE 视图名;
例:
mysql> DESCRIBE stu_glass;
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(255) | YES | | NULL | |
| glass | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
3 rows in set (0.01 sec) mysql> DESC view_t;
+----------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+------------+------+-----+---------+-------+
| quantity | int(11) | YES | | NULL | |
| price | int(11) | YES | | NULL | |
| quantity*price | bigint(21) | YES | | NULL | |
+----------------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec) # 2、使用SHOW TABLE STATUS语句查看视图基本信息
语法如下:
SHOW TABLE STATUS LIKE '视图名';
例:
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) # 3、使用 SHOW CREATE VIEW 语句查看视图详细信息
语法如下:
SHOW CREATE VIEW 视图名;
例:
mysql> SHOW CREATE VIEW view_t \G;
*************************** 1. row ***************************
View: view_t
Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`skip-grants user`@`skip-grants host` SQL SECURITY DEFINER VIEW `view_t` AS select `t`.`quantity` AS `quantity`,`t`.`price` AS `price`,(`t`.`quantity` * `t`.`price`) AS `quantity*price` from `t`
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec) ERROR:
No query specified # 4、在views表中查看视图详细信息
在MySQL中,information_schema 数据库下的views表中存储了所有视图的定义。通过对views表的查询,可以查看数据库中所有视图的详细信息,查询语句如下:
SELECT * FROM information_schema.views;
查询结果太长就不在这里显示,结果显示当前以及定义的所有视图的详细信息,在这里也可以看到前面定义的 stu_glass、view_t 视图的详细信息。

04-修改视图

# 1、使用 CREATE OR REPLACE VIEW 语句修改视图
语法如下:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS SELECT_statement
[WITH [CASCADED | LOCAL] CHECK OPTION] 修改视图的语句和创建视图的语句是完全一样的。当视图已经存在时,修改语句对视图进行修改;当视图不存在时,创建视图。
例:
mysql> desc view_t;
+----------------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+------------+------+-----+---------+-------+
| quantity | int(11) | YES | | NULL | |
| price | int(11) | YES | | NULL | |
| quantity*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.01 sec) mysql> desc view_t;
+----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| quantity | int(11) | YES | | NULL | |
| price | int(11) | YES | | NULL | |
+----------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec) # 2、使用 ALTER 语句修改视图
语法如下:
ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS SELECT_statement
[WITH [CASCADED | LOCAL] CHECK OPTION] ALTER VIEW view_t AS SELECT quantity from t;
例:
mysql> desc view_t;
+----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| quantity | int(11) | YES | | NULL | |
| price | int(11) | YES | | NULL | |
+----------+---------+------+-----+---------+-------+
2 rows in set (0.01 sec) mysql> ALTER VIEW view_t AS SELECT quantity from t;
Query OK, 0 rows affected (0.02 sec) mysql> desc view_t;
+----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| quantity | int(11) | YES | | NULL | |
+----------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

05-更新视图

1、更新视图是指通过视图来插入、更新、删除表中的数据,因为视图是一个虚拟表,其中没有数据。
2、通过视图更新的时候都是转到基本表上进行更新的,如果对视图增加或者删除记录,实际上是对基本表增加或者删除记录。 # 1、使用 UPDATE 语句更新视图 view_t
UPDATE view_t SET quantity=5;
例:
mysql> select * from view_t;
+----------+
| quantity |
+----------+
| 3 |
+----------+
1 row in set (0.00 sec) mysql> UPDATE view_t SET quantity=5;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0 mysql> select * from view_t;
+----------+
| quantity |
+----------+
| 5 |
+----------+
1 row in set (0.00 sec) # 当视图中包含有如下内容时,视图的更新操作将不能被执行:
(1)视图中不包含基本表中被定义为非空的列。
(2)在定义视图的 SELECT 语句后的字段列表中使用了数学表达式。
(3)在定义视图的SELECT 语句后的字段列表中使用了聚合函数。
(4)在定义视图的SELECT 语句中使用了DISTINCT,UNION,TOP,GROUP BY 或HAVING子句。

06-删除视图

当视图不再需要时,可以将其删除。删除一个或多个使用 DROP VIEW 语句,
语法如下:
DROP VIEW [IF EXISTS]
view_name [, view_name] ...
[RESTRICT | CASCADE]
其中,view_name 是要删除的视图名称,可以添加多个需要的视图名称,各个名称之间使用逗号分隔开。
删除视图必须拥有 DROP 权限。
例:
mysql> drop view if exists stu_glass;
Query OK, 0 rows affected (0.01 sec)

07 MySQL之视图的更多相关文章

  1. MySQL之视图学习

    MYSQL---视图 1.概述: ​ 视图是从一个或者多个表中导出的,视图的行为与表非常类似,但视图是一个虚拟表.在视图中用户可以使用SELECT语句查询数据,以及使用INSERT.UPDATE和DE ...

  2. mysql数据库视图连接出现2003····错误

    MySQL利用视图工具连接数据库时出现2003····错误                                                  原因:MySQL的服务没有开启 解决步骤: ...

  3. mysql 查询表,视图,触发器,函数,存储过程

    1. mysql查询所有表: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名' AND  TAB ...

  4. mysql view(视图)

    一,什么是视图 视图是存放数据的一个接口,也可以说是虚拟的表.这些数据可以是从一个或几个基本表(或视图)的数据.也可以是用户自已定义的数据.其实视图里面不存放数据的,数据还是放在基本表里面,基本表里面 ...

  5. 第五章 MySQL事务,视图,索引,备份和恢复

    第五章 MySQL事务,视图,索引,备份和恢复 一.事务 1.什么是事务 事务是一种机制,一个操作序列,它包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求.要么都执行 ...

  6. MySQL之视图、触发器、事务、存储、函数、流程控制

    一.视图 视图就是一个虚拟表,我们把复杂的sql语句后看到的虚拟表封装起来,给他取个名字,当我们下次使用的时候,就不用再去写复杂的sql语句,直接调用封装后的视图名字,就可以得到我们想要的表,然后就可 ...

  7. MySQL之视图、触发器、事务、存储过程、函数 流程控制

    MySQL之视图.触发器.事务.存储过程.函数 阅读目录 一 视图 二 触发器 三 事务 四 存储过程 五 函数 六 流程控制 MySQL这个软件想将数据处理的所有事情,能够在mysql这个层面上全部 ...

  8. MySQL的视图view,视图创建后,会随着表的改变而自动改变数据

    首先是创建视图 CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `new_view` A ...

  9. MySQL通过视图(或临时表)实现动态SQL(游标)

    >参考de优秀文章 写MySQL存储过程实现动态执行SQL Dynamic cursor in stored procedure MySQL通过视图(或临时表)实现动态SQL(游标). 因在实现 ...

随机推荐

  1. Spark集群任务提交流程----2.1.0源码解析

    Spark的应用程序是通过spark-submit提交到Spark集群上运行的,那么spark-submit到底提交了什么,集群是怎样调度运行的,下面一一详解. 0. spark-submit提交任务 ...

  2. ASP.config配置

    使用ASP.NET搭建三层时候, 有Model (模型)DAL(数据访问层)    BLL(业务逻辑层)  连接数据库的DBhelper 放在DAL层 假如 你数据库密码改了,你要打开VS 找到DBh ...

  3. PAT Basic 1063 计算谱半径 (20 分)

    在数学中,矩阵的“谱半径”是指其特征值的模集合的上确界.换言之,对于给定的 n 个复数空间的特征值 { , },它们的模为实部与虚部的平方和的开方,而“谱半径”就是最大模. 现在给定一些复数空间的特征 ...

  4. redis——redis的一些核心把握

    redis单线程,为什么比较快 单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了多个线程.redis能够快速执行的原因有三点: (1) 绝大 ...

  5. Xadmin相关实现

    一,保存搜索条件(Save search conditions) kept conditions(保存条件)的应用场景比较常见,在我们查询时,可以实现多条件的筛选查询,比如:在淘宝上,选择了其中的一个 ...

  6. marquee标签实现跑马灯效果--无缝滚动

    今天在做微信端的大转盘抽奖时,想把所有用户的抽奖记录做成无缝滚动的效果,无奈我的js功底太差,一时想不出实现的方法,便百度各种相似效果.但无意中发现了一个html标签——<marquee> ...

  7. Aizu - 1383 Pizza Delivery (最短路图+DAG上的割边)

    题意:给出一张有向图,每条边有长度,对于每条边,你要回答将该边的方向取反后,从起点到终点的最短距离是增加or减小or不变. 首先求出起点到所有点的最短距离和所有点到终点的最短距离(两次DIjkstra ...

  8. BZOJ5017 [Snoi2017]炸弹[线段树优化建边+scc缩点+DAG上DP/线性递推]

    方法一: 朴素思路:果断建图,每次二分出一个区间然后要向这个区间每个点连有向边,然后一个环的话是可以互相引爆的,缩点之后就是一个DAG,求每个点出发有多少可达点. 然后注意两个问题: 上述建边显然$n ...

  9. np中的随机函数

      numpy.random.uniform介绍: 1. 函数原型:  numpy.random.uniform(low,high,size)  ==>也即其他函数是对该函数的进一步封装 功能: ...

  10. vue04

    目录 Vue项目环境 项目的创建 vue根据配置重新构建依赖 pycharm管理vue项目 vue项目目录结构分析 vue项目生命周期 views文件夹内的.vue文件介绍 配置自定义全局样式 导航栏 ...