视图 订阅
视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。 展开全文
视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
信息
外文名
view
安全性
用户只能看到标有自己用户名的行
作    用
简单、安全、逻辑数据独立性
含    义
存储在数据库中的查询的SQL 语句
中文名
视图
优    点
视点集中简化操作定制数据安全性
视图视图含义
从用户角度来看,一个视图是从一个特定的角度来查看数据库中的数据。从数据库系统内部来看,一个视图是由SELECT语句组成的查询定义的虚拟表。从数据库系统内部来看,视图是由一张或多张表中的数据组成的,从数据库系统外部来看,视图就如同一张表一样。视图可以查询,但不可以新 计算机视图(16张) 增、删除、修改。视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。分布式查询也可用于定义使用多个异类源数据的视图。视图是存储在数据库中的查询的SQL 语句,它主要出于两种原因:安全原因, 视图可以隐藏一些数据,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,另一原因是可使复杂的查询易于理解和使用。视图:查看图形或文档的方式。视图一经定义便存储在数据库中,与其相对应的数据并没有像表 计算机中的视图(20张) 那样又在数据库中再存储一份,通过视图看到的数据只是存放在基本表中的数据。对视图的操作与对表的操作一样,可以对其进行查询、修改(有一定的限制)、删除。当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化,同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。
收起全文
精华内容
下载资源
问答
  • 视图
    千次阅读
    2022-04-21 09:24:54


    一,视图概念

    视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。
    在这里插入图片描述

    通过视图,可以展现基表(用来创建视图的表)的部分数据;视图数据来自定义视图的查询中使用的表,使用视图动态生成。

    视图(子查询):是从一个或多个表导出的虚拟的表,其内容由查询定义。具有普通表的结构,但是不实现数据存储。

    对视图的修改:单表视图一般用于查询和修改,会改变基本表的数据,多表视图一般用于查询,不会改变基本表的数据。

    使用视图的原因

    1)简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。

    2)安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。

    3)数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。

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

    二,创建视图

    (1)基本语法

    可以使用 CREATE VIEW 语句来创建视图。

    语法格式如下:

    CREATE VIEW <视图名> AS <SELECT语句>

    语法说明如下。

    • <视图名>:指定视图的名称。该名称在数据库中必须是唯一的,不能与其他表或视图同名。
    • <SELECT语句>:指定创建视图的 SELECT 语句,可用于查询多个基础表或源视图。

    对于创建视图中的 SELECT 语句的指定存在以下限制:

    • 用户除了拥有 CREATE VIEW 权限外,还具有操作中涉及的基础表和其他视图的相关权限。
    • SELECT 语句不能引用系统或用户变量。
    • SELECT 语句不能包含 FROM 子句中的子查询。
    • SELECT 语句不能引用预处理语句参数。

    视图定义中引用的表或视图必须存在。但是,创建完视图后,可以删除定义引用的表或视图。可使用 CHECK TABLE 语句检查视图定义是否存在这类问题。

    视图定义中允许使用 ORDER BY 语句,但是若从特定视图进行选择,而该视图使用了自己的 ORDER BY 语句,则视图定义中的 ORDER BY 将被忽略。

    视图定义中不能引用 TEMPORARY 表(临时表),不能创建 TEMPORARY 视图。

    WITH CHECK OPTION 的意思是,修改视图时,检查插入的数据是否符合 WHERE 设置的条件。

    (2)创建基于单表的视图

    MySQL 可以在单个数据表上创建视图。

    查看 test_db 数据库中的 tb_students_info 表的数据,如下所示。

    mysql> SELECT * FROM tb_students_info;
    ±—±-------±--------±-----±-----±-------±-----------+
    | id | name | dept_id | age | sex | height | login_date |
    ±—±-------±--------±-----±-----±-------±-----------+
    | 1 | Dany | 1 | 25 | F | 160 | 2015-09-10 |
    | 2 | Green | 3 | 23 | F | 158 | 2016-10-22 |
    | 3 | Henry | 2 | 23 | M | 185 | 2015-05-31 |
    | 4 | Jane | 1 | 22 | F | 162 | 2016-12-20 |
    | 5 | Jim | 1 | 24 | M | 175 | 2016-01-15 |
    | 6 | John | 2 | 21 | M | 172 | 2015-11-11 |
    | 7 | Lily | 6 | 22 | F | 165 | 2016-02-26 |
    | 8 | Susan | 4 | 23 | F | 170 | 2015-10-01 |
    | 9 | Thomas | 3 | 22 | M | 178 | 2016-06-07 |
    | 10 | Tom | 4 | 23 | M | 165 | 2016-08-05 |
    ±—±-------±--------±-----±-----±-------±-----------+
    10 rows in set (0.00 sec)

    【实例 1】

    在 tb_students_info 表上创建一个名为 view_students_info 的视图,输入的 SQL 语句和执行结果如下所示。

    mysql> CREATE VIEW view_students_info
    -> AS SELECT * FROM tb_students_info;
    Query OK, 0 rows affected (0.00 sec)
    mysql> SELECT * FROM view_students_info;
    ±—±-------±--------±-----±-----±-------±-----------+
    | id | name | dept_id | age | sex | height | login_date |
    ±—±-------±--------±-----±-----±-------±-----------+
    | 1 | Dany | 1 | 25 | F | 160 | 2015-09-10 |
    | 2 | Green | 3 | 23 | F | 158 | 2016-10-22 |
    | 3 | Henry | 2 | 23 | M | 185 | 2015-05-31 |
    | 4 | Jane | 1 | 22 | F | 162 | 2016-12-20 |
    | 5 | Jim | 1 | 24 | M | 175 | 2016-01-15 |
    | 6 | John | 2 | 21 | M | 172 | 2015-11-11 |
    | 7 | Lily | 6 | 22 | F | 165 | 2016-02-26 |
    | 8 | Susan | 4 | 23 | F | 170 | 2015-10-01 |
    | 9 | Thomas | 3 | 22 | M | 178 | 2016-06-07 |
    | 10 | Tom | 4 | 23 | M | 165 | 2016-08-05 |
    ±—±-------±--------±-----±-----±-------±-----------+
    10 rows in set (0.04 sec)

    默认情况下,创建的视图和基本表的字段是一样的,也可以通过指定视图字段的名称来创建视图。

    【实例 2】

    在 tb_students_info 表上创建一个名为 v_students_info 的视图,输入的 SQL 语句和执行结果如下所示。

    mysql> CREATE VIEW v_students_info
    -> (s_id,s_name,d_id,s_age,s_sex,s_height,s_date)
    -> AS SELECT id,name,dept_id,age,sex,height,login_date
    -> FROM tb_students_info;
    Query OK, 0 rows affected (0.06 sec)
    mysql> SELECT * FROM v_students_info;
    ±-----±-------±-----±------±------±---------±-----------+
    | s_id | s_name | d_id | s_age | s_sex | s_height | s_date |
    ±-----±-------±-----±------±------±---------±-----------+
    | 1 | Dany | 1 | 24 | F | 160 | 2015-09-10 |
    | 2 | Green | 3 | 23 | F | 158 | 2016-10-22 |
    | 3 | Henry | 2 | 23 | M | 185 | 2015-05-31 |
    | 4 | Jane | 1 | 22 | F | 162 | 2016-12-20 |
    | 5 | Jim | 1 | 24 | M | 175 | 2016-01-15 |
    | 6 | John | 2 | 21 | M | 172 | 2015-11-11 |
    | 7 | Lily | 6 | 22 | F | 165 | 2016-02-26 |
    | 8 | Susan | 4 | 23 | F | 170 | 2015-10-01 |
    | 9 | Thomas | 3 | 22 | M | 178 | 2016-06-07 |
    | 10 | Tom | 4 | 23 | M | 165 | 2016-08-05 |
    ±-----±-------±-----±------±------±---------±-----------+
    10 rows in set (0.01 sec)

    可以看到,view_students_info 和 v_students_info 两个视图中的字段名称不同,但是数据却相同。因此,在使用视图时,可能用户不需要了解基本表的结构,更接触不到实际表中的数据,从而保证了数据库的安全。

    (3)创建基于多表的视图

    MySQL 中也可以在两个以上的表中创建视图,使用 CREATE VIEW 语句创建。

    【实例 3】

    在表 tb_student_info 和表 tb_departments 上创建视图 v_students_info,输入的 SQL 语句和执行结果如下所示。

    mysql> CREATE VIEW v_students_info
    -> (s_id,s_name,d_id,s_age,s_sex,s_height,s_date)
    -> AS SELECT id,name,dept_id,age,sex,height,login_date
    -> FROM tb_students_info;
    Query OK, 0 rows affected (0.06 sec)
    mysql> SELECT * FROM v_students_info;
    ±-----±-------±-----±------±------±---------±-----------+
    | s_id | s_name | d_id | s_age | s_sex | s_height | s_date |
    ±-----±-------±-----±------±------±---------±-----------+
    | 1 | Dany | 1 | 24 | F | 160 | 2015-09-10 |
    | 2 | Green | 3 | 23 | F | 158 | 2016-10-22 |
    | 3 | Henry | 2 | 23 | M | 185 | 2015-05-31 |
    | 4 | Jane | 1 | 22 | F | 162 | 2016-12-20 |
    | 5 | Jim | 1 | 24 | M | 175 | 2016-01-15 |
    | 6 | John | 2 | 21 | M | 172 | 2015-11-11 |
    | 7 | Lily | 6 | 22 | F | 165 | 2016-02-26 |
    | 8 | Susan | 4 | 23 | F | 170 | 2015-10-01 |
    | 9 | Thomas | 3 | 22 | M | 178 | 2016-06-07 |
    | 10 | Tom | 4 | 23 | M | 165 | 2016-08-05 |
    ±-----±-------±-----±------±------±---------±-----------+
    10 rows in set (0.01 sec)

    通过这个视图可以很好地保护基本表中的数据。视图中包含 s_id、s_name 和 dept_name,s_id 字段对应 tb_students_info 表中的 id 字段,s_name 字段对应 tb_students_info 表中的 name 字段,dept_name 字段对应 tb_departments 表中的 dept_name 字段。

    (4)查询视图

    视图一经定义之后,就可以如同查询数据表一样,使用 SELECT 语句查询视图中的数据,语法和查询基础表的数据一样。

    视图用于查询主要应用在以下几个方面:

    • 使用视图重新格式化检索出的数据。
    • 使用视图简化复杂的表连接。
    • 使用视图过滤数据。

    DESCRIBE 可以用来查看视图,语法如下:

    DESCRIBE 视图名;

    【实例 4】

    通过 DESCRIBE 语句查看视图 v_students_info 的定义,输入的 SQL 语句和执行结果如下所示。

    mysql> DESCRIBE v_students_info;
    ±---------±--------------±-----±----±-----------±------+
    | Field | Type | Null | Key | Default | Extra |
    ±---------±--------------±-----±----±-----------±------+
    | s_id | int(11) | NO | | 0 | |
    | s_name | varchar(45) | YES | | NULL | |
    | d_id | int(11) | YES | | NULL | |
    | s_age | int(11) | YES | | NULL | |
    | s_sex | enum(‘M’,‘F’) | YES | | NULL | |
    | s_height | int(11) | YES | | NULL | |
    | s_date | date | YES | | 2016-10-22 | |
    ±---------±--------------±-----±----±-----------±------+
    7 rows in set (0.04 sec)

    注意:DESCRIBE 一般情况下可以简写成 DESC,输入这个命令的执行结果和输入 DESCRIBE 是一样的。

    三,查看视图

    1、查询表(包括view)

    mysql> use iips;
    Database changed
    mysql> show tables;
    ±---------------------------+
    | Tables_in_iips |
    ±---------------------------+
    | tbepartner |
    | tbepartnerconfig |
    | tborg |
    ±---------------------------+
    3 rows in set

    2、查询视图

    mysql> show table  status  where  comment ='view';
    +-------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+-----------+----------+----------------+---------+
    | Name  | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment |
    +-------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+-----------+----------+----------------+---------+
    | tborg | NULL   | NULL    | NULL       | NULL | NULL           | NULL        | NULL            | NULL         | NULL      | NULL           | NULL        | NULL        | NULL       | NULL      | NULL     | NULL           | VIEW    |
    +-------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+-------------+-------------+------------+-----------+----------+----------------+---------+
    1 row in set
    

    四,修改视图

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

    (1)基本语法

    可以使用 ALTER VIEW 语句来对已有的视图进行修改。

    语法格式如下:

    ALTER VIEW <视图名> AS <SELECT语句>

    语法说明如下:

    • <视图名>:指定视图的名称。该名称在数据库中必须是唯一的,不能与其他表或视图同名。
    • <SELECT 语句>:指定创建视图的 SELECT 语句,可用于查询多个基础表或源视图。

    需要注意的是,对于 ALTER VIEW 语句的使用,需要用户具有针对视图的 CREATE VIEW 和 DROP 权限,以及由 SELECT 语句选择的每一列上的某些权限。

    修改视图的定义,除了可以通过 ALTER VIEW 外,也可以使用 DROP VIEW 语句先删除视图,再使用 CREATE VIEW 语句来实现。

    (2)修改视图内容

    视图是一个虚拟表,实际的数据来自于基本表,所以通过插入、修改和删除操作更新视图中的数据,实质上是在更新视图所引用的基本表的数据。

    注意:对视图的修改就是对基本表的修改,因此在修改时,要满足基本表的数据定义。

    某些视图是可更新的。也就是说,可以使用 UPDATE、DELETE 或 INSERT 等语句更新基本表的内容。对于可更新的视图,视图中的行和基本表的行之间必须具有一对一的关系。

    还有一些特定的其他结构,这些结构会使得视图不可更新。更具体地讲,如果视图包含以下结构中的任何一种,它就是不可更新的:

    • 聚合函数 SUM()、MIN()、MAX()、COUNT() 等。
    • DISTINCT 关键字。
    • HAVING 子句。
    • UNION 或 UNION ALL 运算符。
    • 位于选择列表中的子查询。
    • FROM 子句中的不可更新视图或包含多个表。
    • WHERE 子句中的子查询,引用 FROM 子句中的表。
    • ALGORITHM 选项为 TEMPTABLE(使用临时表总会使视图成为不可更新的)的时候。

    【实例 1】

    使用 ALTER 语句修改视图 view_students_info,输入的 SQL 语句和执行结果如下所示。

    mysql> ALTER VIEW view_students_info
    -> AS SELECT id,name,age
    -> FROM tb_students_info;
    Query OK, 0 rows affected (0.07 sec)
    mysql> DESC view_students_info;
    ±------±------------±-----±----±--------±------+
    | Field | Type | Null | Key | Default | Extra |
    ±------±------------±-----±----±--------±------+
    | id | int(11) | NO | | 0 | |
    | name | varchar(45) | YES | | NULL | |
    | age | int(11) | YES | | NULL | |
    ±------±------------±-----±----±--------±------+
    3 rows in set (0.03 sec)

    用户可以通过视图来插入、更新、删除表中的数据,因为视图是一个虚拟的表,没有数据。通过视图更新时转到基本表上进行更新,如果对视图增加或删除记录,实际上是对基本表增加或删除记录。

    查看视图 view_students_info 的数据内容,如下所示。

    mysql> SELECT * FROM view_students_info;
    ±—±-------±-----+
    | id | name | age |
    ±—±-------±-----+
    | 1 | Dany | 24 |
    | 2 | Green | 23 |
    | 3 | Henry | 23 |
    | 4 | Jane | 22 |
    | 5 | Jim | 24 |
    | 6 | John | 21 |
    | 7 | Lily | 22 |
    | 8 | Susan | 23 |
    | 9 | Thomas | 22 |
    | 10 | Tom | 23 |
    ±—±-------±-----+
    10 rows in set (0.00 sec)

    【实例 2】

    使用 UPDATE 语句更新视图 view_students_info,输入的 SQL 语句和执行结果如下所示。

    mysql> UPDATE view_students_info
    -> SET age=25 WHERE id=1;
    Query OK, 0 rows affected (0.24 sec)
    Rows matched: 1 Changed: 0 Warnings: 0
    mysql> SELECT * FROM view_students_info;
    ±—±-------±-----+
    | id | name | age |
    ±—±-------±-----+
    | 1 | Dany | 25 |
    | 2 | Green | 23 |
    | 3 | Henry | 23 |
    | 4 | Jane | 22 |
    | 5 | Jim | 24 |
    | 6 | John | 21 |
    | 7 | Lily | 22 |
    | 8 | Susan | 23 |
    | 9 | Thomas | 22 |
    | 10 | Tom | 23 |
    ±—±-------±-----+
    10 rows in set (0.00 sec)

    查看基本表 tb_students_info 和视图 v_students_info 的内容,如下所示。

    mysql> SELECT * FROM tb_students_info;
    ±—±-------±--------±-----±-----±-------±-----------+
    | id | name | dept_id | age | sex | height | login_date |
    ±—±-------±--------±-----±-----±-------±-----------+
    | 1 | Dany | 1 | 25 | F | 160 | 2015-09-10 |
    | 2 | Green | 3 | 23 | F | 158 | 2016-10-22 |
    | 3 | Henry | 2 | 23 | M | 185 | 2015-05-31 |
    | 4 | Jane | 1 | 22 | F | 162 | 2016-12-20 |
    | 5 | Jim | 1 | 24 | M | 175 | 2016-01-15 |
    | 6 | John | 2 | 21 | M | 172 | 2015-11-11 |
    | 7 | Lily | 6 | 22 | F | 165 | 2016-02-26 |
    | 8 | Susan | 4 | 23 | F | 170 | 2015-10-01 |
    | 9 | Thomas | 3 | 22 | M | 178 | 2016-06-07 |
    | 10 | Tom | 4 | 23 | M | 165 | 2016-08-05 |
    ±—±-------±--------±-----±-----±-------±-----------+
    10 rows in set (0.00 sec)

    mysql> SELECT * FROM v_students_info;
    ±-----±-------±-----±------±------±---------±-----------+
    | s_id | s_name | d_id | s_age | s_sex | s_height | s_date |
    ±-----±-------±-----±------±------±---------±-----------+
    | 1 | Dany | 1 | 25 | F | 160 | 2015-09-10 |
    | 2 | Green | 3 | 23 | F | 158 | 2016-10-22 |
    | 3 | Henry | 2 | 23 | M | 185 | 2015-05-31 |
    | 4 | Jane | 1 | 22 | F | 162 | 2016-12-20 |
    | 5 | Jim | 1 | 24 | M | 175 | 2016-01-15 |
    | 6 | John | 2 | 21 | M | 172 | 2015-11-11 |
    | 7 | Lily | 6 | 22 | F | 165 | 2016-02-26 |
    | 8 | Susan | 4 | 23 | F | 170 | 2015-10-01 |
    | 9 | Thomas | 3 | 22 | M | 178 | 2016-06-07 |
    | 10 | Tom | 4 | 23 | M | 165 | 2016-08-05 |
    ±-----±-------±-----±------±------±---------±-----------+
    10 rows in set (0.00 sec)

    (3)修改视图名称

    修改视图的名称可以先将视图删除,然后按照相同的定义语句进行视图的创建,并命名为新的视图名称。

    五,删除视图

    删除视图是指删除 MySQL 数据库中已存在的视图。删除视图时,只能删除视图的定义,不会删除数据。

    (1)基本语法

    可以使用 DROP VIEW 语句来删除视图。

    语法格式如下:

    DROP VIEW <视图名1> [ , <视图名2> …]

    其中:<视图名> 指定要删除的视图名。DROP VIEW 语句可以一次删除多个视图,但是必须在每个视图上拥有 DROP 权限。

    (2)删除视图

    【实例】

    删除 v_students_info 视图,输入的 SQL 语句和执行过程如下所示。

    mysql> DROP VIEW IF EXISTS v_students_info;
    Query OK, 0 rows affected (0.00 sec)
    mysql> SHOW CREATE VIEW v_students_info;
    ERROR 1146 (42S02): Table ‘test_db.v_students_info’ doesn’t exist

    可以看到,v_students_info 视图已不存在,将其成功删除。

    六,通过视图更新基本表数据

    前面内容中,使用视图进行了查询操作。其实视图还可以进行更新操作,包括增加(insert)、删除(delete)和更新(update)数据。更新操作的实际对象是基本表。

    (1)INSERT语句通过视图添加数据

    基本格式

    insert [into] 视图名 [(字段名1, 字段名2, …)] values | value (值1, 值2, …);

    【实例1】

    insert into view1_emp values (8000, ‘别怡情’, ‘职员’, 7564, ‘2020-05-20’, 20);

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

    (2)DELETE语句通过视图删除数据

    基本格式

    delete from 视图名 [where 条件语句]

    【实例2】

    delete from view1_emp where ename=‘别怡情’;

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

    (3)UPDATE语句通过视图更新数据

    基本格式

    update 视图名 set 字段名=值 [where 更新条件]

    【实例3】

    update view1_emp set jobrank=‘副处长’ where ename=‘王美美’;

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

    更多相关内容
  • PostgreSQL视图和物化视图

    千次阅读 2022-04-30 21:41:54
    我们常用说的视图一般是指 view,即普通视图;而物化视图则是materialized view(materialized 使物质化,使具体化(materialize 的过去式和过去分词))。两者都是视图,但是名称不一样,说明两者还有有所差异的。...


    我们常用说的视图一般是指 view,即普通视图;而物化视图则是materialized view(materialized 使物质化,使具体化(materialize 的过去式和过去分词))。两者都是视图,但是名称不一样,说明两者还有有所差异的。下面就来简单介绍一下PostgreSQL中的视图和物化视图的差异。

    1.视图

    对标实体表,视图其实是个虚拟的表,实际上一个SQL拼接而成的虚拟表(假表),可能是有一个表或者多个表、视图关联而成的复杂的SQL,而这个SQL一般都是select语句(当然也可能是 update、delete 等的语句,但是可能会有诸多限制,而且用视图进行这些操作也不安全,一般也不会这么用,这些不在本文讨论范围内。)。而视图的用途常常用于展示一些用户需要的信息,隐藏一些敏感或者是不重要的数据,汇总一些关键数据展示给用户。

    操作:可以像表一样查询视图的字段,也可以当做一个表进行关联查询。
    查询底层实现:通过创建视图的语句进行查询,就是每次实时查询底层的表,数据都是实时的。
    索引:走表的索引。

    2.物化视图

    基本功能和视图类型。对标实体表和普通视图,会比普通视图更像一个表。上面说到视图是一个虚拟的表,这个物化视图其实是一个物理表,它可以用自己的索引。

    操作:可以像表一样查询视图的字段,也可以当做一个表进行关联查询。可以创建索引。
    查询底层实现:创建后就真的被当做是表了,即结果都物化(固化)成了一个表,假如创建语句的底层表数据有变化,也不会影响到这个物化视图的数据,除非手动进行刷新。就是每次查询的都是固化的数据,不是实时的数据。
    索引:走自己的索引,可以创建索引。

    3.视图和物化视图的对比

    类型\对比项物理结构时效性有无索引
    视图虚拟表实时无索引
    物化视图物理表非实时可以创建索引

    4.示例:查询系统的用户表

    基础查询如下,后面我们会使用这个SQL来构造视图和物化视图。
    (简单介绍下pg_class :pgsql里面的一个内置系统表,是一个统计或者说是汇总的数据表。class就是类、对象,即pgsql里面的对象都会在这里面记录,比如实体表、视图、物化视图、索引、toast表等,详细信息可以查看官方文档。)

    select * from pg_class where relnamespace != '11' and relnamespace != '13887'  and relkind = 'r';
    
    -- 创建一个表,备用
    create table Sheet4(
    	id int8,
    	name varchar(100)
    );
    
    -- 查询该表的基础信息(元数据信息)
    select * from pg_class where relnamespace != '11' and relnamespace != '13887'  and relkind = 'r' and  relname = 'Sheet4';
    

    在这里插入图片描述

    4.1 视图

    4.1.1 创建视图

    CREATE VIEW "public"."v_user_tab"
    AS
    select * from pg_class where relnamespace != '11' and relnamespace != '13887'  and relkind = 'r';
    

    4.1.2 使用视图

    -- 普通查询
    select * from v_user_tab;
    select * from v_user_tab where relname = 'Sheet4';
    

    在这里插入图片描述

    -- 关联查询,找命名空间是啥(public默认的)
    select * from pg_namespace;
    select ns.nspname,vt.* from v_user_tab vt left join  pg_namespace ns on vt.relnamespace = ns.oid;
    select ns.nspname,vt.* from v_user_tab vt left join  pg_namespace ns on vt.relnamespace = ns.oid where relname = 'Sheet4';
    

    在这里插入图片描述

    4.1.3 查看视图的执行计划

    查看索引使用情况:上面提到了,实际上走的是底层的查询,索引走的也是原来基础表上的索引。下面我们来看下是不是。(注意一下,因为pgsql规则器有自己的考量,有时候即使有索引也不一定会走,和具体的表记录和查询语句有关系。因此可能explain结果和本文可能会有点不一致。)

    通过计划可以看到这个表名的简单SQL,使用了系统表 pg_class 上的索引 pg_class_relname_nsp_index 。

    explain select * from v_user_tab where relname = 'Sheet4';
    
    Index Scan using pg_class_relname_nsp_index on pg_class  (cost=0.28..8.31 rows=1 width=271)
      Index Cond: (relname = 'Sheet4'::name)
      Filter: ((relnamespace <> '11'::oid) AND (relnamespace <> '13887'::oid) AND (relkind = 'r'::"char"))
    

    下面这个使用了,两个索引:pg_class.pg_class_relname_nsp_index 和pg_namespace.pg_namespace_oid_index 。

    explain select ns.nspname,vt.* from v_user_tab vt left join  pg_namespace ns on vt.relnamespace = ns.oid where relname = 'Sheet4';
    
    Merge Left Join  (cost=0.43..12.02 rows=1 width=335)
      Merge Cond: (pg_class.relnamespace = ns.oid)
      ->  Index Scan using pg_class_relname_nsp_index on pg_class  (cost=0.28..8.31 rows=1 width=271)
            Index Cond: (relname = 'Sheet4'::name)
            Filter: ((relnamespace <> '11'::oid) AND (relnamespace <> '13887'::oid) AND (relkind = 'r'::"char"))
      ->  Index Scan using pg_namespace_oid_index on pg_namespace ns  (cost=0.14..18.81 rows=244 width=68)
    

    4.1.4 视图的时效性

    创建一个表,看能不能在这个视图里面查到。

    create table testv1(
    	id int8,
    	name varchar(100)
    );
    
    -- 有数据,说明数据是实时的。
    select * from v_user_tab where relname = 'testv1';
    

    4.1.5 尝试为视图创建索引

    create index idx_v_user_tab_relname on v_user_tab using btree (relname);
    -- 会报错:> 错误:  "v_user_tab" 不是一个表或物化视图
    

    4.1.6 删除视图

    drop view v_user_tab;
    

    4.2 物化视图

    4.2.1 创建物化视图

    CREATE MATERIALIZED VIEW "public"."mv_user_tab"
    AS
    select * from pg_class where relnamespace != '11' and relnamespace != '13887'  and relkind = 'r';
    

    4.2.2 使用物化视图

    -- 普通查询
    select * from mv_user_tab;
    select * from mv_user_tab where relname = 'Sheet4';
    

    在这里插入图片描述

    -- 关联查询
    select * from pg_namespace;
    select ns.nspname,vt.* from mv_user_tab vt left join  pg_namespace ns on vt.relnamespace = ns.oid;
    select ns.nspname,vt.* from mv_user_tab vt left join  pg_namespace ns on vt.relnamespace = ns.oid where relname = 'Sheet4';
    

    在这里插入图片描述
    基础使用,到目前为止好像都没有差异。

    4.2.3 查看物化视图的执行计划

    explain select * from mv_user_tab where relname = 'Sheet4';
    
    Seq Scan on mv_user_tab  (cost=0.00..55.53 rows=1 width=260)
      Filter: (relname = 'Sheet4'::name)	
    

    没有走索引,根据上面的查询我们可以知道其实 pg_class.relname 是有索引的,但是这里没有用到。
    其实不是这样的,这里和视图就有点不一样,当它创建后,我们应该把物化视图当做一个独立的个体(独立的表),它有索引,它只走自己的索引(等下我们尝试为这个字段创建索引)。

    explain select ns.nspname,vt.* from mv_user_tab vt left join  pg_namespace ns on vt.relnamespace = ns.oid where relname = 'Sheet4';
    
    Merge Right Join  (cost=55.76..55.86 rows=1 width=324)
      Merge Cond: (ns.oid = vt.relnamespace)
      ->  Index Scan using pg_namespace_oid_index on pg_namespace ns  (cost=0.14..18.81 rows=244 width=68)
      ->  Sort  (cost=55.54..55.54 rows=1 width=260)
            Sort Key: vt.relnamespace
            ->  Seq Scan on mv_user_tab vt  (cost=0.00..55.53 rows=1 width=260)
                  Filter: (relname = 'Sheet4'::name)
    

    这个也没有走索引,使用的是全表扫描。

    4.2.4 视图的时效性

    创建一个表,看能不能在这个物化视图里面查到。

    create table testv2(
    	id int8,
    	name varchar(100)
    );
    
    -- 没有数据,说明数据不是实时的。
    select * from mv_user_tab where relname = 'testv2';
    

    我们刷新一下物化视图

    refresh materialized view  mv_user_tab;
    
    -- 刷新后,我们就可以查到刚才那个表了
    select * from mv_user_tab where relname = 'testv2';
    

    4.2.5 尝试为物化视图创建索引

    create index idx_mv_user_tab_relname on mv_user_tab using btree (relname);
    

    这里我们再执行这个语句,发现是可以走索引的。

    explain select * from mv_user_tab where relname = 'Sheet4';
    
    Index Scan using idx_mv_user_tab_relname on mv_user_tab  (cost=0.28..8.29 rows=1 width=260)
      Index Cond: (relname = 'Sheet4'::name)
    
    --删除索引
    DROP index idx_mv_user_tab_relname;
    

    4.2.6 删除物化视图

    drop materialized view mv_user_tab;
    

    注意删除物化视图会同步删除对应的索引(和删除表会删除表对应的索引是一样的道理),但是刷新物化视图不会。

    4.3.物化视图延伸

    4.3.1并发刷新物化视图

    refresh (全量刷新)默认会为视图加上排它锁,会阻塞查询。

    生产上,我们为了安全,我们一般采用“并发的方式”刷新物化视图。并发刷新的意思就是我刷新的时候,你还可以查询对应的数据。(注意:如果逻辑表复制、数据比较多,并发刷新可能需要时间比较长,而且只能同时刷新一个物化视图,但是整理来说不影响。)

    -- 比如这样
    refresh materialized view concurrently mv_user_tab;
    > 错误:  不能同时刷新物化视图 "public.mv_user_tab"
    > HINT:  在物化视图的一个或多个列上创建不带WHERE子句的唯一索引.
    

    (因为还没研究过对应文档)个人理解,并发刷新就是根据唯一索引判断是新增还是更新数据到物化视图里面,因此需要先有唯一索引。

    -- 创建唯一索引
    create unique index idx_mv_user_tab_oid on mv_user_tab using btree (oid);
    -- 再次尝试并发刷新
    refresh materialized view concurrently mv_user_tab;
    

    4.3.2尝试修改物化视图的数据

    尝试删除数据

    select * from mv_user_tab where relname = 'testv2';
    
    DELETE from mv_user_tab where relname = 'testv2';
    
    > 错误:  不能改变物化视图 "mv_user_tab"
    
    

    尝试更新物化视图

    update  mv_user_tab set relname = 'testv21' where relname = 'testv2';
    
    > 错误:  不能改变物化视图 "mv_user_tab"
    

    经过尝试:发现除了刷新操作外,物化视图的数据是不能进行修改和删除操作的。

    展开全文
  • oracle视图

    千次阅读 2021-05-06 02:54:55
    手机评站网今天精心准备的是《oracle视图》,下面是详解!怎么在oracle中查询出所有的视图view?1、通过pl/sql,登录oracle数据库,2、敲入sql,可以查询本库的所有视图view,select * from all_views t,结果中owner...

    手机评站网今天精心准备的是《oracle视图》,下面是详解!

    怎么在oracle中查询出所有的视图view?

    1、通过pl/sql,登录oracle数据库,

    91b2cc6c78f186563489d74d544dcdd1.png

    2、敲入sql,可以查询本库的所有视图view,select * from all_views t,结果中owner代表不同的用户;

    76401e96c3103057affa137a181bc8fb.png

    3、如果查看本用户的所有视图view,执行sql,select * from user_views t,可以看到本用户并没有创建过视图,

    991d2cd48bbd6c2809f193a6102e5072.png

    4、如果要看本库,每个用户分别有多少视图view,执行sql,select owner, count(*) from all_views t group by owner,

    2c68a36f902c1b66ee854f16c401d5fa.png

    oracle 视图有什么用呢?

    谢谢...

    谢谢

    比如说图书馆有图书book(id,name,prise....)

    读者reader(id.....)

    借阅关系 borrow( bookid,readerid,date)

    显然存在一张表很不方便操作,分开又不方便查看

    那就建立个视图,view1:

    select * from book,reader,borrow where book.id=bookid and reader.id=readerid

    这样只要查询select * from view1 就可以看到谁借了什么书了,包括所有的详细内容。

    有时后会有非常复杂的逻辑,视图可以用来方便理解,可以当作中间层简化逻辑

    oracle视图的几个重要内容

    视图的定义:

    视图的优点:

    视图的分类:

    视图的作用:

    视图的创建:

    视图的定义原则:

    查询视图:

    删除视图:

    修改视图:

    查询视图定义:

    数据库 delete

    1、双击桌面plsql运行程序,启动软件,在命令窗口中先创建快照。

    d5bd223f5305c31e200bdbeabc7cfc1f.png

    2、然后执行@直接回车,在弹出的窗口中找到数据库安装目录找到相应要生成的视图脚本。

    edc19ab048b35b189a45befc8622e804.png

    3、然后在弹出的窗口中填写导出报告的格式。

    1b81084edc903ac8e2dbd4de0bb75b85.png

    4、然后接着在弹出的窗口中填写需要导出报告的日期范围,填写1代表当天的。

    960632d53efcef6ebc12d44f6c16ac19.png

    5、然后在接下来的窗口中输入开始快照id与结束快照id。

    d43ba6cd1d97b1d34d481370d92391f0.png

    6、然后填写导出报告的名称,完成导出即可。

    8f6e53cbbc6296a629d02bd1b22a2207.png

    如何单独导出ORACLE的视图?

    oracle怎么建视图...

    oracle怎么建视图

    基于表或其他视图来创建视图,目的将一些复杂的查询简化,提高查询速度 。如:

    CREATE VIEW v_name AS SELECT b.dname,a.ename FROM emp a,dept b

    WHERE a.deptno=b.deptno ;

    查询部门名和员工名 通过建立视图,v_name 视图就等同于SELECT b.dname,a.ename FROM emp a,dept b

    WHERE a.deptno=b.deptno 这样可以大大的简化程序

    oracle怎么建视图

    select* from dba_tables; 必须有DBA权限,可以查看全部的表信息

    select * from user_tables; 当前用户所有表信息

    select* from all_tables; 当前用户所有表信息 以及 当前用户所能看到的别的用户下的表信息。

    对应的也有视图信息:

    select * from dba_views;

    select * from user_views;

    select * from all_views;

    查看Oracle有哪些表或者视图

    (1)创建视图V_StudInfo,查询学生的学号,姓名,所修课程号,所修课程名称,成绩等级(90~100为优,80~89为良,70~79为中,60~69为及格,60分以下为不及)。(2)创建视图V_Stu...

    (1)创建视图V_StudInfo,查询学生的学号,姓名,所修课程号,所修课程名称,成绩等级(90~100为优,80~89为良,70~79为中,60~69为及格,60分以下为 不及)。

    (2)创建视图V_Stud,查询英语成绩大于75分的学生信息:学号,姓名,所修科目数,平均成绩。(提示:可用分几个视图,逐步实现)

    展开

    1

    create view V_StudInfo

    as

    select a.学号,a.姓名,b.课程号,b.课程名,

    case when c.成绩 between 90 and 100 then '优'

    when c.成绩 between 80 and 89 then '良'

    when c.成绩 between 70 and 79 then '中'

    when c.成绩 between 60 and 69 then '及格'

    else '不及格' end 成绩等级

    from 学生表 a,课程表 b, 成绩表 c where a.学号=c.学号

    and b.课程号=c.课程号

    2

    create view V_Stud

    as

    select a.学号,a.姓名,count(*) 所修科目数,avg(成绩) 平均成绩

    from 学生表 a,课程表 b, 成绩表 c where a.学号=c.学号

    and b.课程号=c.课程号

    and a.学号 in

    (select a.学号

    from 学生表 a,课程表 b, 成绩表 c where a.学号=c.学号

    and b.课程号=c.课程号 and b.课程名='英语' and c.成绩>75)

    表名和字段名,自己跟你实际的核对一下,不同的改一下

    oracle如何创建视图

    通过查询oracle提供的系统视图查询得到的结果,这个结果以后一直要用,能不能把这个查询结果建立一个视图,以后好查询,提示权限不足。我已经有了dba权限,难道还不行?...

    通过查询oracle提供的系统视图查询得到的结果,这个结果以后一直要用,能不能把这个查询结果建立一个视图,以后好查询,提示权限不足。我已经有了dba权限,难道还不行?

    可以的,但是会慢。有些复杂的可以通过函数实现,在视图里面调用函数可以加快些速度。

    扩展

    ffed7476400976eed708b380df96d9f7.png

    但是不行啊,您帮忙看看

    c62cc415e122802445c4d298fa6227b4.png

    f90882defd016c8cf1c447aefdbcaa89.png

    d3fd7c27b2cb824a7f62644cab6f749b.png

    补充

    权限不足应该是帐号的问题吧,你没用管理员权限登录吗?你直接select可以吗?

    oracle 可以在视图基础上 建立视图吗?

    Oracle中视图和同义词的区别如下:

    视图和同义词分别都是数据库中的对象名称,它们都不对应实际的数据存储,都依赖其他对象的存在而存在。

    一、视图:视图可以被看成是虚拟表或存储查询。除非是索引视图,否则视图的数据不会作为非重复对象存储在数据库中。一般是基于一个或多个数据表经数据查询语句构建而成;视图可以再被用于数据查询语句中。

    二、同义词:是架构范围内的对象的另一名称。通过使用同义词,客户端应用程序可以使用由一部分组成的名称来引用基对象,而不必使用由两部分、三部分或四部分组成的名称。可以理解为是对数据库中一个对象的快捷方式或者在特定范围内的别名;不限于数据表,几乎所有的数据库对象都可以建立同义词。

    1.视图可以对应一张或多张表,同义词只能对应一张表名称

    2.视图可以设置其他约束条件

    3.可以在同义词上建立视图:

    例如,已经存在一个名为synonym_city的同义词和一个名为table_citys的表,可以创建视图:CREATE OR REPLACE NOFORCE VIEW view_city AS SELECT * FROM synonym_city,table_citys;

    4.可以通过对同义词进行任何DML操作,对表数据进行插入、更新、删除,通过对视图只能进行更新和删除操作。

    值得注意的是:视图和同义词都可以屏蔽用户访问其他用户拥有的表。

    例如:现在存在两个用户:scott、sys,以sys用户登录

    创建跨用户表的同义词:

    CREATE OR REPLACE PUBLIC SYNONYM SYN_EMP for scott.emp;

    创建跨用户的表的视图:

    CREATE OR REPLACE VIEW view_EMP AS SELECT * FROM scott.emp

    然后进行查询操作:

    SELECT * FROM SYN_EMP ;

    SELECT * FROM view_EMP ;

    查询结果是一样的。

    Oracle中视图和同义词的区别

    如题。...

    如题。

    区别是:定义不同、内容不同、刷新方法不同。

    具体内容如下:物化视图是一种特殊的物理表,物化视图是相对普通视图而言的。普通视图是虚拟表,应用的局限性大,任何对视图的查询,都实际上转换为视图语句的查询。这样对整体查询性能的提高,并没有实质上的好处。

    普通视图和物化视图根本就不是一个东西,说区别都是硬拼到一起的,首先明白基本概念,普通视图是不存储任何数据的,他只有定义,在查询中是转换为对应的定义SQL去查询,而物化视图是将数据转换为一个表,实际存储着数据,这样查询数据,就不用关联一大堆表,如果表很大的话,会在临时表空间内做大量的操作。

    物化视图的类型:二者的区别在于刷新方法的不同,仅在该物化视图需要被刷新了,才进行刷新,即更新物化视图,以保证和基表数据的一致性;而是说,一旦基表有了,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。

    物化视图的创建本身是很复杂和需要优化参数设置的,特别是针对大型生产数据库系统而言。但允许以这种最简单的,类似于普通视图的方式来做,所以不可避免的会涉及到默认值问题。也就是说给物化视图的重要定义参数的默认值处理是我们需要特别注意的。

    物化视图在某种意义上说就是一个物理表,这通过其可以被查询出来,而得到佐证;物化视图也是一种段,所以其有自己的物理存储属性; 物化视图会占用数据库磁盘空间。

    在一般视图中,可看到文档的大部分(包括部分图形)内容,但看不见页眉、页脚、页码等,也不能编辑这些内容,不能显示图文内容、分栏效果等。

    43f3aca8e120db3885498f11dd6b144d.png

    展开全文
  • 数据库的视图

    千次阅读 2022-04-14 17:16:02
    一、什么是视图 百度百科的解释是: 视图是一个虚拟表,视图并不在数据库中存储数据值,数据库中只在数据字典中存储对视图的定义。 这显然是不能让我们满意的。 数据库中的视图是一个虚拟表,同真实的表一样,...

    目录

    一、什么是视图

    二、如何创建视图

    1.创建视图

    2.语法解析

    三、如何使用视图

    1.视图查询操作

    2.视图新增操作

    3.视图删除操作

    4.视图修改操作 

    四、如何修改视图

    五、如何删除视图

    六、如何查看视图


    一、什么是视图

    百度百科的解释是:

    视图是一个虚拟表,视图并不在数据库中存储数据值,数据库中只在数据字典中存储对视图的定义。

    这显然是不能让我们满意的。

    数据库中的视图是一个虚拟表,同真实的表一样,视图包含一系列带有名称的行和列数据,行和列数据来自定义视图查询所引用的表,并且在引用视图时动态生成。视图是从一个或者多个表中导出的,视图的行为与表非常相似,但视图是一个虚拟表。在视图中用户可以使用SELECT语句查询数据,以及使用INSERT、UPDATE和DELETE修改记录。视图可以使用户操作方便,而且可以保障数据库系统的安全。当对通过视图看到的数据进行修改时,相应的基本表的数据也要发生变化。同时,若基本表的数据发生变化,则这种变化也可以自动地反映到视图中。

    视图是一个”虚表”,用大白话说,就是从已经存在的表的全部字段或数据中,挑选出来一部分字段或数据,组成另一张”并不存在的表”,这张虚表被称之”视图”。视图中的字段与对应的数据均来自已经存在的表。对于视图来说,这些已经存在的表就被称为”基表”。基表可以是一张表,也可以是多张表。视图的本质可以理解为一条查询语句,视图中显示的结果,就是这条查询语句查询出的结果。

    上面这一段话来自另外的一个博主的文章,在下面给出了引用链接。他的最后一句话说是一条查询语句,其实是不妥当的,应该是增删改查的语句。

    这篇文章中有一段话说得很好:

    不使用视图的理由:

    mysql对于视图的优化并不完善,这样说并不准确,准确的说,应该是mysql对于子查询的优化不是很好,而使用视图本身往往就意味着使用子查询,所以,如果我们必须使用视图时,最好将视图中的sql语句尽量优化,或者说,数据量大的时候尽量避免使用视图。

    事实确实如此。在写本文之前,我这么多年工作中从未使用过视图,以至于都忘记视图是怎么创建使用的了。在银行的开发中,我所涉及的项目从未有使用过视图,因为在一般情况下,基本的SQL就可以满足了,为什么要使用视图呢?你说呢?我所了解的,在上海的这些银行中,比如,交行卡中心、交总行、交银金科、建行、建信金科、建信人寿,我是没有见到过视图的,而且也从未听说过哪一位同事使用了视图。除此之外,其他如中行、上海银行、浦发银行,我的了解也没有听在里面的同事朋友使用过。 

    好了,我们总结一下吧!

    1、视图是一个虚拟表(逻辑表);

    2、视图中的行和列的数据来自一到多张物理表,也可以来源自其他视图;

    3、可以通过视图进行增删改查;

    4、如果通过视图进行增删改,那么物理表的数据也会随之做出同样的增删改;反之亦然。

    5、视图的使用比较少,起码相对于一般SQL来说,不在一个数量级上;

    6、视图是一种”虚表”,所以不能与已经存在的表重名。

    二、如何创建视图

    在创建视图之前,请先确定当前登录的数据库用户是否拥有创建视图的权限。

    select create_view_priv,select_priv from mysql.user where user='root' and host='localhost';

    查询结果中,create_view_priv的值为Y,表示当前用户拥有创建视图的权利。

    如果我们查询另外的用户: 

    select create_view_priv,select_priv from mysql.user where user='dake' and host='localhost';

     

    说明 dake 这个用户是不具备创建视图的权限的。

    下面我们说说如何创建视图。 

    1.创建视图

    CREATE [OR REPLACE] [{FORCE|NOFORCE}] VIEW view_name
    
    AS
    
    SELECT查询
    
    [WITH READ ONLY CONSTRAINT]

    2.语法解析

    1. OR REPLACE:如果视图已经存在,则替换旧视图。

    2. FORCE:即使基表不存在,也可以创建该视图,但是该视图不能正常使用,当基表创建成功后,视图才能正常使用。

    3. NOFORCE:如果基表不存在,无法创建视图,该项是默认选项。

    4. WITH READ ONLY:默认可以通过视图对基表执行增删改操作,但是有很多在基表上的限制(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视图执行insert操作),WITH READ ONLY说明视图是只读视图,不能通过该视图进行增删改操作。现实开发中,基本上不通过视图对表中的数据进行增删改操作。

    接着,我们创建一个视图。

    首先,给出我的基表—STUDENT表的数据:

     然后,我们创建一个视图:

     CREATE VIEW VU_STUDENT AS SELECT * FROM STUDENT WHERE ID > 2;

     然后查看视图的情况,使用命令我们后续再讲。

    查看视图的数据:

    对比 STUDENT 这个基表,我们发现少了2行数据,这少的两行数据就是我们创建视图的时候的SQL中做了限制。

    下面我们再看看视图的原生语句。

     

    我把SQL贴出来:

    CREATE
    OR REPLACE
    VIEW `VU_STUDENT` AS select
        `STUDENT`.`ID` AS `ID`,
        `STUDENT`.`NAME` AS `NAME`,
        `STUDENT`.`GENDER` AS `GENDER`,
        `STUDENT`.`AGE` AS `AGE`,
        `STUDENT`.`CLASS_ID` AS `CLASS_ID`,
        `STUDENT`.`ADDRESS` AS `ADDRESS`
    from
        `STUDENT`
    where
        `STUDENT`.`ID` > 2

     我们看到,它自动增加了 OR REPLACE ,说明 Maria 创建视图时的默认设置。然后把 select * 自动变更为了需要查询的字段,这个是一般SQL的基本操作。

    这里说一下视图的命名。视图的命名最好也是比较规范的写法是加上一定的前缀,当然后缀也可以,这个按照项目要求或者项目统一规范即可。

    比如,我这里就是 VU_ 加上了表名,即 VU_STUDENT 。如果是两张表的话,可以是:

    VU_表1的名字_表2的名字

     这种方式,当然如果表名比较长,或者是多张表,你也可以使用这几张表的简写,或者根据你这个视图的业务逻辑来命名。

    示例视图命令解读

    上面我们创建的视图命令,可以分两部分来解读:

    1、CREATE VIEW VU_STUDENT AS

    2、SELECT * FROM STUDENT WHERE ID > 2;

    其中第一部分表示我们要创建一个视图,视图名为 VU_STUDENT,第二部分表示该视图的业务逻辑。两部分结合起来就是一个完整的视图了。

    上面我们创建的这个视图,得到的列名是和 STUDENT表是一样的,当然我们也可以自行定义列名。不过这个一般很少有人这么做,如果这么做是真的有点扯淡,闲得蛋疼了。不过事无绝对,如果你的视图要和另外的视图或表联合使用,而几张表中表示相同意义的字段名不一样,你使用的时候就有点麻烦。假设有表A和表B,两个表的某一个字段是一个意义,但是名字不一样。此时把你创建的这个视图(假设数据来源自表A)的这一列的列名,修改为和另一张表(表B)的这个列名相同,然后你的业务代码或SQL中对这个视图和表B的操作就方便很多了。

    这个给视图字段起别名的做法就像我们建表时类似。

    CREATE VIEW VU_STD (S_ID, S_NAME, S_GENDER, S_AGE, S_CLASS_ID, S_ADDRESS) AS SELECT * FROM STUDENT WHERE ID > 2;

    此时如果我们查看数据以及列名的话会发现:

     一目了然了吧!

    我们创建这个视图非常简单,其实是因为我们的SQL业务逻辑简单,也就是 示例视图命令解读

    2 中的SQL语句简单了。我们最开始说了,可以增删改查的,那么当然可以使用子查询、连接、分组等等SQL的操作,这个就看你自己的业务逻辑了骚年。

    三、如何使用视图

    1.视图查询操作

    在 二 中我们说了,视图就是一张虚标,你把他当做表即可。

    SELECT * FROM VU_STUDENT;

    我们上面说了,视图可以增删改查,那么增删改怎么使用呢?

    2.视图新增操作

    我们使用视图增加一条记录到 STUDENT 表中:

    CREATE VIEW VU_STD_DLT AS INSERT INTO STUDENT VALUES (14, '范冰冰', '01', 39, 5	, '上海浦东陆家嘴1124号');

     结果呢?

    报错了。是我们SQL有问题吗?

    我们执行SQL插入的逻辑:

    INSERT INTO STUDENT VALUES (14, '范冰冰', '01', 39, 5	, '上海浦东陆家嘴1124号');

    结果呢?

     insert 语句没问题啊!这是什么情况呢?是不是因为我们这个用户的原因呢?我们把登陆用户修改为root试试。

    再新增一条语句:

    CREATE VIEW VU_STD_DLT AS INSERT INTO STUDENT VALUES (15, '范蠡', '00', 50, 0	, '上海浦东陆家嘴1125号');

    结果:

     哈哈!错误是一样的。

    3.视图删除操作

    既然新增不行,那么我修改删除呢?我们先增加一条记录,然后执行删除:

    INSERT INTO STUDENT VALUES (15, '范蠡', '00', 50, 0	, '上海浦东陆家嘴1125号');

    视图删除:

    CREATE VIEW VU_STD_DLT AS DELETE FROM STUDENT WHERE ID = 15;

    删除报错:

    4.视图修改操作 

    那么修改呢?估计也一样。

    CREATE VIEW VU_STD_UPD AS UPDATE STUDENT SET ID = 16 WHERE ID = 15;

    结果:

     通过这几个操作我们得出了结论:

    1、视图的查询操作,可以直接在客户端使用,但是增删改却是不行的;

    2、视图和真实的物理表还是有一些区别的。

    四、如何修改视图

    ALTER VIEW VU_STUDENT AS SELECT * FROM STUDENT WHERE ID > 10; 

    然后查询视图的数据

    SELECT * FROM VU_STUDENT;

     其中第五行是我后面加上的。

    可以看到修改视图很简单。

    五、如何删除视图

    DROP VIEW VU_STUDENT;

     

     如果删除一个不存在的视图呢?

     报错了,那么我们可以使用下面的命令避免这种情况:

    DROP VIEW IF EXISTS VU_STUDENT;

     这样就不会报错了。

    六、如何查看视图

    查看视图的结构:

    DESC VU_STUDENT;

     查看某数据库中所有的视图:

    select * from information_schema.views where table_schema= 'study';

    本文参考:

    MariaDB 视图与触发器

    mysql/mariadb知识点总结 之 视图管理语句

    Oracle 视图详解(view)

    展开全文
  • 四、Oracle 视图

    千次阅读 2022-02-25 20:26:04
    视图 是一种数据库对象,是从一个或者多个数据表或视图中导出的 虚表。 视图所对应的 数据并不真正地存储在视图中,而是存储在所引用的数据表中。 视图的结构和数据,是对数据表进行查询的结果。
  • Oracle-视图

    千次阅读 2020-12-29 23:15:24
    Oracle-视图在项目开发中,有时候会用到多表查询,有很多种方法,比如关联,比如视图,但对于查询来说,视图查询是最快的,如果你的数据库的字段信息很多,那查询就得整表查,比如两表查询,我们就可以把要的字段...
  • 数据库视图 sql

    千次阅读 2021-01-28 08:08:21
    视图与表(有时为与视图区别,也称表为基本表——Base Table)不同,视图所对应的数据不进行实际存储,数据库中只存储视图的定义,在对视图的数据进行操作时,系统根据视图的定义去操作与视...文章萌萌怪兽2020-02-...
  • 文章目录1 视图概述2 创建视图3 修改视图4 删除视图 1 视图概述 视图就是将一个或多个表中的目标字段抽取出来形成的一个虚拟表。这个虚拟表和真实的表具有相同的功能。 2 创建视图 语法格式: create view view_name...
  • 视图

    千次阅读 2017-09-03 20:06:43
    Create Views 在S表中创建以学号、姓名、系为列的新视图(V_A)...在SC上定义视图V_B,当用UPDATE修改数据时,必须满足视图中SCORE>60的条件,否则不能被更改,并验证   更改成绩时不会有行受到影响 创建新视图V_C
  • MySQL数据库视图

    千次阅读 2021-02-02 14:05:09
    当表的数据修改后反映到视图。修改、查询、删除视图的命令跟建表时的一样。视图是从一个或多个表(或视图)导出的表。视图是数据库的用户使用数据库的观点。可以根据他们的不同需求,在物理的数据库上定义他们对数据库...
  • Oracle物化视图与物化视图日志

    万次阅读 多人点赞 2019-04-02 21:43:30
    文章目录物化视图物化视图与普通视图的区别创建一个存放person的表创建一个存放person的address的表初始化数据创建物化视图的语句1.build [immediate|deferred]2.refresh [fast|complete|force] 视图刷新的方式:3.MV...
  • MySQL高级篇之View视图讲解

    千次阅读 2022-02-18 19:29:14
    常见的数据库对象: 对象 说明 ...表是存储数据的逻辑单元,以行和...一个或者多个数据表里的数据的逻辑显示,视图并不存储数据 索引(INDEX) 用于提高查询性能,相当于书的目录 存储过程(PROCEDURE) 用于完成.
  • 视图学习 (Multi-View Learning)

    千次阅读 2022-03-08 10:12:22
    多视角/多视图学习(Multi-view learning)是陶大成提出的一个研究方向。我们都知道,在机器学习中样本可以用不同的特征(如图片可以用LBP、SIFT等特征)来表示,或者从不同的角度进行观察(如从前后左右观察一个...
  • odps进阶之参数化视图

    千次阅读 2022-04-16 23:11:57
    ODPS(MaxCompute) 里面也有一个阉割版的存储过程---参数化视图。我们知道视图是将固定的计算逻辑存储下来,通过调用视图简化代码。而参数化视图就是可以在视图代码里调用入参变量,从而达到更灵活的使用视图,一个...
  • MySQL视图

    万次阅读 多人点赞 2019-08-03 16:44:21
    1、视图概述 视图是由数据库中的一个表或多个表导出的虚拟表,是一种虚拟存在的表,方便用户对数据的操作。 1.1 视图的概念 视图是一个虚拟表,是从数据库中一个或多个表中导出来的表,其内容由查询定义。同真实...
  • 要想在 Xcode 中预览画布中的视图,或者与画布中的视图进行交互,需要 Mac 系统版本号不低于 macOS Catalina 10.15。 ② 步骤 打开 Xcode,在启动页面点击创建新工程,或者在菜单中选择文件->新建->项目: ...
  • 3.7视图

    千次阅读 2019-11-03 12:43:26
    视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以一旦基本表中的数据发生变化,从视图中查询出...
  • 视图聚类综述

    千次阅读 2021-11-22 20:53:05
    解决问题:虽然上述子空间方法已经取得了显著的改进,但仍然可以从以下两点进行改进:i)现有的大多数多多视图子空间聚类方法都是先学习一个共享的亲和矩阵或图,然后应用谱聚类得到最终的聚类结果。然而,直接从...
  • 视图的操作

    千次阅读 2021-11-17 22:43:20
    一、学习任务1:为什么使用视图 通过前面章节的知识可以发现,数据库中关于数据的查询有时候非常复杂,例如表连接、子查询等,这种査询会让程序员感到非常痛苦,因为它逻辑太复杂、编写语句比较多。当这种査询需要...
  • 动态性能视图2.1 概念2.2 常见的动态性能视图v$parameterv$processv$sessionv$sysstatv$logv$logfilev$lockv$transactionv$fixed_view_definition 一.数据字典 1.1 概念 数据字典记录数据库最基本的信息,包括数据...
  • word页面视图视图和web视图的区别

    千次阅读 2021-06-11 04:57:14
    在Word2007中提供了5种视图供用户选择,这5种视图包括页面视图、阅读版式视图、Web版式视图、大纲视图和普通视图。用户可以在“视图”功能区中自由切换文档视图,也可以在Word2007窗口的右下方单击视图按钮切换视图...
  • “4+1”视图包括逻辑视图、实现视图、进程视图、部署视图和用例视图。 最终用户关心的是系统的功能,因此会侧重于逻辑视图; 程序员关心的是系统的配置、装配等问题,因此会侧重于实现(开发)视...
  • Mysql视图

    千次阅读 多人点赞 2020-09-24 05:57:56
    1.初识视图 1.视图的概念和作用 什么是视图:是从一个或多个表中导出来的表,它是一种虚拟存在的表,表的结构和数据都依赖于基本表。 作用: 简化查询语句:简化用户的查询操作,使查询更加快捷。 安全性:更方便的进行...
  • MySQL——视图查询

    千次阅读 2022-04-25 20:12:06
    目录1、创建一个视图VIEW1,用于查询所有1990年以后出生的学生的学号、姓名、性别、入学成绩、以及他们所选修的课程号、课程名、任课教师姓名等信息2、 要求将视图VIEW1修改为用于查询所有男生的学生的学号、姓名、...
  • MySQL创建视图(CREATE VIEW)

    千次阅读 2021-11-22 15:22:57
    可以使用 CREATE VIEW 语句来创建视图。 语法格式如下: CREATE VIEW <视图名> AS <SELECT语句> 语法说明如下。 <视图名>:指定视图的名称。该名称在数据库中必须是唯一的,不能与其他表或视图...
  • 文章目录物化视图1. 出现背景2. 简介3. 创建选型3.1 刷新的2种模式:3.2 刷新的方法有四种:FAST、COMPLETE、FORCE和NEVER。3.3 查询重写(Query Rewrite):ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种4. 基于...
  • Oracle物化视图的刷新

    千次阅读 2021-06-15 11:25:14
    物化视图(MATERIALIZED VIEW)是一个包含查询结果的数据库对象。将经常使用的数据拷贝并存储下来,在查询时就可以直接返回数据。本质上是一个物理表,会占用磁盘空间。本文主要记录了物化视图刷新的方法、时机等...
  • 面向区块链的高效物化视图维护和可信查询 人工智能技术与咨询 来源:《软件学报》,作者蔡 磊等 摘 要:区块链具有去中心化、不可篡改和可追溯等特性,可应用于金融、物流等诸多行业.由于所有交易数据按照交易...
  • 创建视图SQL:在SQL Server中创建视图

    万次阅读 2020-07-17 13:42:32
    可以通过说出CREATE VIEW后跟一个具有WITH视图属性的名称来创建视图: ENCRYPTION – Using this attribute prevents the view from being published as part of SQL Server replication 加密 –使用此属性可防止...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,614,125
精华内容 645,650
关键字:

视图

友情链接: USB加湿器.zip