MySQL之视图

Posted 一个有意境的名字

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL之视图相关的知识,希望对你有一定的参考价值。

一、视图的定义

  视图是虚拟表或逻辑表,它被定义为具有连接的SQL SELECT查询语句。因为数据库视图与数据库表类似,它由行和列组成,因此可以根据数据库表查询数据。其内容由查询定义。
但是,视图并不在数据库中以存储的数据值集形式存在,行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。简单的来说视图是由其定义结果组成的表;

二、视图的优缺点

优点:

  1,数据库视图允许简化复杂查询,通过数据库视图,您只需使用简单的SQL语句,而不是使用具有多个连接的复杂的SQL语句。

       2,安全性。一般是这样做的:创建一个视图,定义好该视图所操作的数据。之后将用户权限与视图绑定。这样的方式是使用到了一个特性:grant语句可以针对视图进行授予权限。

缺点: 

  1、性能:从数据库视图查询数据可能会很慢,特别是如果视图是基于其他视图创建的。
 2、表依赖关系:将根据数据库的基础表创建一个视图。每当更改与其相关联的表的结构时,都必须更改视图。

三、创建视图

语法:

CREATE VIEW 视图名称 AS  SQL语句

ex:

技术分享图片
#两张有关系的表
mysql> select * from course;
+-----+--------+------------+
| cid | cname  | teacher_id |
+-----+--------+------------+
|   1 | 生物   |          1 |
|   2 | 物理   |          2 |
|   3 | 体育   |          3 |
|   4 | 美术   |          2 |
+-----+--------+------------+
rows in set (0.00 sec)

mysql> select * from teacher;
+-----+-----------------+
| tid | tname           |
+-----+-----------------+
|   1 | 张磊老师        |
|   2 | 李平老师        |
|   3 | 刘海燕老师      |
|   4 | 朱云海老师      |
|   5 | 李杰老师        |
+-----+-----------------+
rows in set (0.00 sec)

#查询李平老师教授的课程名
mysql> select cname from course where teacher_id = (select tid from teacher where tname=李平老师);
+--------+
| cname  |
+--------+
| 物理   |
| 美术   |
+--------+
rows in set (0.00 sec)

#子查询出临时表,作为teacher_id等判断依据
select tid from teacher where tname=李平老师
临时表
技术分享图片
create view teacher_view as select tid from teacher where tname=李平老师;

#于是查询李平老师教授的课程名的sql可以改写为
mysql> select cname from course where teacher_id = (select tid from teacher_view);
+--------+
| cname  |
+--------+
| 物理   |
| 美术   |
+--------+
rows in set (0.00 sec)
临时表创建为试图

四、使用视图

技术分享图片
mysql> create view tt as select * from course left join teacher on teacher.tid = course.teacher_id;
Query OK, 0 rows affected (0.02 sec)

mysql> select * from tt;
+-----+--------+------------+------+-----------------+
| cid | cname  | teacher_id | tid  | tname           |
+-----+--------+------------+------+-----------------+
|   1 | 王五   |          1 |    1 | 张磊老师        |
|   2 | 王五   |          2 |    2 | 丽萍老师        |
|   4 | 王五   |          2 |    2 | 丽萍老师        |
|   5 | 王五   |          2 |    2 | 丽萍老师        |
|   6 | 王五   |          2 |    2 | 丽萍老师        |
|   3 | 王五   |          3 |    3 | 王海燕老师      |
+-----+--------+------------+------+-----------------+
rows in set (0.01 sec)


不能修改视图的数据,验证为例:
mysql> insert into tt values(7,哈哈,2,4,张三丰老师);
ERROR 1471 (HY000): The target table tt of the INSERT is not insertable-into
View Code

五、修改视图

技术分享图片
# 语法:ALTER VIEW 视图名称 AS SQL语句
mysql> alter view teacher_view as select * from course where cid>3;
Query OK, 0 rows affected (0.04 sec)

mysql> select * from teacher_view;
+-----+-------+------------+
| cid | cname | teacher_id |
+-----+-------+------------+
|   4 | xxx   |          2 |
|   5 | yyy   |          2 |
+-----+-------+------------+
rows in set (0.00 sec)
View Code

七、删除视图

# 语法:DROP VIEW 视图名称

DROP VIEW teacher_view

 

 
 
 




以上是关于MySQL之视图的主要内容,如果未能解决你的问题,请参考以下文章

从mysql的片段中加载ListView

Laravel之视图和Blade模板引擎

回收站视图未显示在片段中

如何从片段内的列表视图打开链接网址?

如何使列表视图出现在片段中?

转到不在底部导航视图内的片段并返回后,底部导航视图不起作用