SQL研习录(27)——视图基础知识及基本操作详解


版权声明

  • 本文原创作者:清风不渡
  • 博客地址:https://blog.csdn.net/WXKKang

一、视图

1、什么是视图?

  计算机数据库中的视图就是一张虚拟的表一样,表里面的内容由它的查询语句定义,同真实的表一样,视图也具有带有名称的列和行数据。但是,视图中的内容在数据库中并不是以存储的数据集形式存在,它们来自定义视图的查询所引用的表,并且在引用视图时就动态生成了
  说白了,视图其实就是存储在数据库中的具有名字的SQL语句,或者或是以预定义的SQL查询的形式存在的数据表的成分
  在视图中,可以包含表中的所有列,也可以仅包含选定的列;视图可以创建自一张表,也可以创建自多张表,这个就看创建视图时的SQL查询语句时怎么写的了
  视图一经定义便存储在了数据库中,与其对应的数据并没有像表一样又在数据库中储存了一份,我们通过视图看到的数据只是存放在基本表中的数据,对视图的操作与对表的操作一样,可以对它进行查询、修改(有权限要求)以及删除
  当我们对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化,同样的道理,基本表的数据发生变化时,这种变化也可以自动的反映到视图中

2、视图有什么作用?

  那么,视图有什么作用呢?
  1、视点集中
  视点集中就是使用户只关心他感兴趣的某些特定的数据和他们所负责的特定任务,这样通过只允许用户看到视图中所定义的数据而不是视图的引用表中的数据,可以提到数据的安全性
  2、简化操作
  视图大大的简化了用户对数据的操作,因为在定义视图时,如果视图本身就是一个复杂查询的结果集,这样在每一次执行相同的查询时,就不必重新写这些复杂的查询语句,只要一条简单的查询视图语句即可。即简化了代码的书写量,也向用户隐藏了表与表之间的连接操作
  3、定制数据
  视图能够实现让不同的用户以不同的方式看到不同或者相同的结果集。因此,当有许多不同水平的用户共用同一数据库时,这方面的重要性就显的极为重要
  4、合并分割数据
  在有些情况下,由于表中的数据量太大,所以在表的设计时需要将表进行水平分割或者是垂直分割,但是表的结构的变化却对应用程序产生了不良的影响,这时候使用视图就可以重新保持原有的结构关系,从而使外模式保持不变,原有的应用程序仍然可以通过视图来重载数据
  5、安全性
  视图可以作为一种安全机制,在第一点就可以体现出来,通过视图用户只能查看和修改他们所能看到的数据,其他数据库或表既不可见也不可以访问,如果某一用户想要访问视图的结果集,那么就必须授予其访问权限。视图所引用表的访问权限与视图权限的设置互不影响
这个怎么实现呢?我们可以先在表中增加一个区分用户的列(例如用户ID),然后建立视图,使得用户只能看到标有自己标志的行,然后我们就可以把视图授权给其他用户了
  6、逻辑数据独立性
  视图可以使应用程序和数据库表在一定程度上独立,如果没有视图的话,应用一定是建立在表上的,有了视图之后,程序可以建立在视图上,从而使程序与数据库表被视图分割开来,例如:
  (1)如果应用建立在数据库表上,当数据库表发生变化时,可以在表上建立视图,通过视图屏蔽表的变化,从而使应用程序可以不动
  (2)如果应用建立在数据库表上,当应用发生变化时,可以在表上建立视图,通过视图来屏蔽应用的变化,从而使数据库表不动
  (3)如果应用建立在视图上,当数据库表发生变化的时候,可以在表上修改视图,通过视图屏蔽表的变化,从而使应用程序可以不动
  (4)如果应用建立在视图上,当应用发生变化时,可以在表上修改视图,通过视图屏蔽应用的变化,从而使数据库可以不动

3、如何创建视图?

  数据库视图由 CREATE VIEW 语句创建。视图可以创建自单个表、多个表或者其他视图
  要创建视图的话,用户必须有适当的系统权限。具体需要何种权限随数据库系统实现的不同而不同
  基本语法如下所示:

CREATE VIEW view_name AS
SELECT column1, column2.....
FROM table_name
WHERE [condition];

  里面的查询语句和普通的SELECT 查询一样,我们可以在上面的 SELECT 语句中包含多个数据表
  例如下面有一张测试表,我们来通过它创建视图:

CREATE TABLE student(
	s_id varchar(50) NOT NULL PRIMARY KEY,
	s_name varchar(50),
	s_gender varchar(50),
	s_age int
)

INSERT INTO student (s_id,s_name,s_gender,s_age) VALUES ('S101','Lucy','female',11);
INSERT INTO student (s_id,s_name,s_gender,s_age) VALUES ('S102','Jack','male',16);
INSERT INTO student (s_id,s_name,s_gender,s_age) VALUES ('S103','Bruce','male',18);
INSERT INTO student (s_id,s_name,s_gender,s_age) VALUES ('S104','Tom','male',14);
INSERT INTO student (s_id,s_name,s_gender,s_age) VALUES ('S105','Jayce','male',15);

  创建的视图如下:

CREATE VIEW STUDENT_VIEW AS
SELECT s_name,s_age FROM student;

  这样我们就可以通过访问视图来查看表里的数据了,且通过视图只能查看s_name和s_age两列,如下:

SELECT * FROM STUDENT_VIEW;

  执行结果如下:
在这里插入图片描述

4、WITH CHECK OPTION

  WITH CHECK OPTION 是 CREATE VIEW 语句的一个可选项。WITH CHECK OPTION 用于保证所有的 UPDATE 和 INSERT 语句都满足视图定义中的条件
  如果不能满足这些条件,UPDATE 或 INSERT 就会返回错误
  下面的例子创建的也是 CUSTOMERS_VIEW 视图,不过这次 WITH CHECK OPTION 是打开的:

CREATE VIEW STUDENT_VIEW AS
SELECT s_name, s_age
FROM  student
WHERE s_age IS NOT NULL
WITH CHECK OPTION;

  上一句中的WITH CHECK OPTION 使得视图拒绝任何 s_age 字段为 NULL 的条目,因为视图的定义中,s_age字段不能为空

5、更新视图

  视图可以在特定的情况下更新:

  • SELECT 子句不能包含 DISTINCT 关键字
  • SELECT 子句不能包含任何汇总函数(summary functions)
  • SELECT 子句不能包含任何集合函数(set functions)
  • SELECT 子句不能包含任何集合运算符(set operators)
  • SELECT 子句不能包含 ORDER BY 子句
  • FROM 子句中不能有多个数据表
  • WHERE 子句不能包含子查询(subquery)
  • 查询语句中不能有 GROUP BY 或者 HAVING
  • 计算得出的列不能更新
  • 视图必须包含原始数据表中所有的 NOT NULL 列,从而使 INSERT 查询生效。
      如果视图满足以上所有的条件,该视图就可以被更新。下面的例子中,Jack的年龄被更新了:
UPDATE STUDENT_VIEW
SET s_age = 35
WHERE name='Jack';

  注意: 最终更新的还是原始数据表,只是其结果反应在了视图上

6、向视图中插入新行

  可以向视图中插入新行,其规则同(使用 UPDATE 命令)更新视图所遵循的规则相同。
  注意: 当视图没有包含原始数据表中所有 NOT NULL 的列的时候不能向视图插入新行,否则的话,就可以像在数据表中插入新行一样,向视图中插入新行

INSERT INTO view_name (column_name1,column_name2,...)
VALUES (column_value1,column_value2,...);

7、删除视图中的行

  视图中的数据行可以被删除。删除数据行与更新视图和向视图中插入新行遵循相同的规则
  例如:下面的例子将删除 STUDENT_VIEW 视图中 AGE=11 的数据行

 DELETE FROM STUDENT_VIEW
WHERE age = 11;

8、删除视图

  当我们不再需要某个视图的时候,我们可以将它删除,语法如下:

DROP VIEW view_name;

  例如:现在我们将STUDENT_VIEW视图删除:

DROP VIEW STUDENT_VIEW;
发布了81 篇原创文章 · 获赞 36 · 访问量 3338

猜你喜欢

转载自blog.csdn.net/WXKKang/article/details/103889913
今日推荐