首页 > 数据库 >43. SQL--视图:create view

43. SQL--视图:create view

时间:2022-09-02 14:36:34浏览次数:59  
标签:salary customers name -- create 视图 插入 view

1. 前言

视图(view)是一个由 select 查询所定义出来的虚拟表。

我们知道,select 查询会产生一个包含行和列的结果集,它在结构上和真实的物理表是类似的,您可以把这个结果集看做一个临时表或者虚拟表;给结果集起一个名字,放在数据库中供大家使用,它就叫做“视图”了。

2. 语法

在 SQL 中,您可以基于一个表、多个表或者另外一个视图来创建新的视图,被视图引用的表通常称为“基础表”。

注意,用户必须拥有足够的权限才能创建视图。

SQL 使用 create view 语句用来创建视图,基本的语法格式如下:

create view view_name as
select column1, column2.....
from table_name
where [condition];

view_name 是视图的名字,以后可以通过 view_name 来使用此视图。您看,所谓的视图,就是给某个普通的 SELECT 查询起了一个名字,方便以后使用而已。

3. 示例

有包含如下记录的 customes 表:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

基于 CUSTOMERS 表创建一个名为 CUSTOMERS_VIEW 的视图,该视图用于在 CUSTOMERS 表中获取薪水大于 2000 的客户的 ID、姓名和年龄,具体代码如下所示:

sql > create view customers_view as
select id, name, age
from  customers
where salary > 2000;

现在,您可以像普通表一样使用 SELECT 语句来查询 CUSTOMERS_VIEW 中的数据,如下所示:

sql > select * from customers_view;

执行结果:

+----+----------+-----+
| id | name     | age |
+----+----------+-----+
|  4 | Chaitali |  25 |
|  5 | Hardik   |  27 |
|  6 | Komal    |  22 |
|  7 | Muffy    |  24 |
+----+----------+-----+

4. 视图的修改

用户在通过视图修改数据(insert、update、delete 操作)时,需要满足以下两点:

  • 视图既然被看做一张虚拟表,它的行为也应该和普通表类似,通过视图进行的修改,也必须能够通过该视图看到修改后的结果。
  • 视图只是基础表的一种映射,视图中的数据依赖于基础表,通过视图修改的数据必须能被基础表接受,不能被基础表接受的数据没有理由呈现到视图中。


但是在默认情况下,视图并没有第二点限制,对于视图的修改,只要满足基础表的要求即可,不用在视图中呈现出来。为了使得修改操作在视图中同步呈现,需要在创建视图时增加WITH CHECK OPTION子句。

下面我们通过举例来进一步说明。

1) 通过视图修改的数据也必须呈现到视图中

使用insert 语句向视图中插入数据时,该条数据被成功插入基础表以后,也必须能够在视图中看到;这意味着,该条数据必须满足创建视图时的 where子句设定的条件。通过视图插入的数据却不能在视图中呈现,是一种奇怪的行为。

对于上面的视图 customers_view,插入一条 salary 为 1800 的数据是不应该被允许的,因为视图要求 salary 大于 2000,该条数据被插入到基础表以后,不能出现在视图中。

使用 update 更新数据,或者使用 delete 删除数据时,也应该受到类似的限制。

修改上面示例中的代码,在创建 customers_view 视图时增加 with check option 子句:

sql > create view customers_view as
select id, name, age, address, salary
from  customers
where salary > 2000
with check option;

执行完该语句,视图内容如下:

+----+----------+-----+---------+--------+
| id | name     | age | address | salary |
+----+----------+-----+---------+--------+
|  4 | Chaitali |  25 | Mumbai  |   6500 |
|  5 | Hardik   |  27 | Bhopal  |   8500 |
|  6 | Komal    |  22 | MP      |   4500 |
|  7 | Muffy    |  24 | Indore  |  10000 |
+----+----------+-----+---------+--------+

使用 insert 语句向视图中插入一条数据,它的 salary 为 3300,如下所示:

insert into customers_view (name, age, address, salary)
values ('tom', 30, 'mp', 3300.00 );

该语句可以执行成功,在视图中也可以看到插入的数据。

如果将插入数据的 salary 修改为 1800,看看有什么结果呢?

insert into customers_view (name, age, address, salary)
values ('abel', 30, 'mp', 1800.00 );

该语句将执行失败,数据库引擎将给出错误提示,类似于:

check option failed 'test.customers_view'

2) 视图中的数据必须满足基础表的要求

重新创建一个 customers_view 视图,代码如下:

sql > create view customers_view as
select id, name, age, salary
from  customers
where salary > 2000
with check option;

相比于基础表,视图没有选取 address 字段,这意味着通过视图插入数据时也无法为 address 字段赋值,此时如果基础表中的 address 字段没有默认值,那么将无法插入数据。例如:

insert into customers_view (name, age, salary) values ('abel', 30, 2800.00 );

该语句将执行失败,数据库引擎给出错误提示,类似于:

field of view 'test.customers_view' underlying table doesn't have a default value

对于视图的插入,最终是对于基础表的插入,如果基础表不接受插入的数据,那么该数据在视图中也不能插入成功。

5. 删除视图

当不需要视图时可以删除,删除视图的基本语法为:

drop view view_name;

view_name 为视图的名字。

例如,删除上面创建的 customers_view 视图:

drop view customers_view;

注意,删除视图仅仅是删除创建视图的 SELECT 查询语句,并不会删除基础表中的数据。

 

 

标签:salary,customers,name,--,create,视图,插入,view
From: https://www.cnblogs.com/jiajunling/p/16649743.html

相关文章

  • 协议可选方法 swift
    @optional和@required是Objective-C中特有的关键字。Swift中,默认所有方法在协议中都是必须实现的。而且,协议里方法不可以直接定义optional。先给出两种解决方案:......
  • 马走日
    https://www.acwing.com/problem/content/1118/#include<cstring>#include<iostream>#include<algorithm>usingnamespacestd;constintN=10;intn,m;bo......
  • 学习 python进阶 面向对象
    python中一切皆对象  绑定方法和非绑定方法  类装饰器property       函数只能有一个self,如果多个变量不能加property装饰器用途二  ......
  • Qt 程序发布以及打包成exe安装包
    一、简述Qt项目开发完成之后,需要打包发布程序,而因为用户电脑上没有Qt配置环境,所以需要将release生成的exe文件和所依赖的dll文件复制到一个文件夹中,然后再用Inn......
  • 纯css做进度条
    ......
  • AirServer 7 for Mac(Mac专用投屏工具)
    Mac投屏软件怎么安装?AIrServer是一款ios投屏到mac的专用软件,可将iOS上的音频,视频,照片,幻灯片和镜像接收功通过AIrPlay投射到Mac。AIrserver7mac版可以实现将手机上的媒体......
  • 原生js处理数组数据小方法
    <ulid="ul"></ul><script>//假设这是一组数据,要渲染到页面页面vararr=[{msg:"nisjsiqi",img:"https://img1.baidu.com/it......
  • Electron 打包vue 桌面应用 :eosforce github代码 编译遇到很多问题
    eosforce/wallet-desktop:eosforce桌面钱包https://github.com/eosforce/wallet-desktop要会的知识永久使用淘宝镜像代理npmconfigsetregistryhttps://registr......
  • Educational Codeforces Round 134 (Rated for Div. 2) D Maximum AND
    MaximumAND贪心从高位开始,尽可能地让\(a\)中该位为\(0\)的和\(b\)中该位为\(1\)的配对在一起,换句话说,可以让\(a\)由小到大排序,\(b\)由大到小排序如果当......
  • docker部署服务
    数据卷挂载启动时进行挂载数据卷同步:对共享目录进行拷贝,每个容器都有数据dockerrun-it--name启动的容器名--volumes-from父容器名称镜像名dockerFiledockerFi......