43. SQL--视图:create view
2022/9/3 2:22:46
本文主要是介绍43. SQL--视图: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 查询语句,并不会删除基础表中的数据。
这篇关于43. SQL--视图:create view的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享
- 2024-11-22ansible 的archive 参数是什么意思?-icode9专业技术文章分享
- 2024-11-22ansible 中怎么只用archive 排除某个目录?-icode9专业技术文章分享
- 2024-11-22exclude_path参数是什么作用?-icode9专业技术文章分享
- 2024-11-22微信开放平台第三方平台什么时候调用数据预拉取和数据周期性更新接口?-icode9专业技术文章分享
- 2024-11-22uniapp 实现聊天消息会话的列表功能怎么实现?-icode9专业技术文章分享
- 2024-11-22在Mac系统上将图片中的文字提取出来有哪些方法?-icode9专业技术文章分享
- 2024-11-22excel 表格中怎么固定一行显示不滚动?-icode9专业技术文章分享
- 2024-11-22怎么将 -rwxr-xr-x 修改为 drwxr-xr-x?-icode9专业技术文章分享
- 2024-11-22在Excel中怎么将小数向上取整到最接近的整数?-icode9专业技术文章分享