教程 > sql 教程 > 阅读:34

sql views(视图)——迹忆客-ag捕鱼王app官网

视图只不过是存储在数据库中并具有关联名称的 sql 语句。视图实际上是预定义 sql 查询形式的表的一种组合。

视图可以包含表的所有行或表中某些行。也可以从一个或多个表创建视图,这取决于我们所写的 sql 查询语句。

视图是一种虚拟表,允许用户执行以下操作

  • 以用户认为自然或直观的方式构建数据。
  • 以这样一种方式限制对数据的访问,即用户可以看到和(有时)修改他们需要的东西。
  • 汇总可用于生成报告的各种表格中的数据。

创建视图

数据库视图是使用create view语句创建的。可以从单个表、多个表或另一个视图创建视图。

要创建视图,用户必须根据具体实现具有相应的系统权限。

基本的create view语法如下

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

我们可以按照在普通 sql select 查询中使用它们的类似方式在 select 语句中包含多个表。

示例

customers 表数据记录如下

 ---- ---------- ----- ----------- ---------- 
| 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 表中获取客户姓名和年龄。

sql > create view customers_view as
select name, age
from  customers;

现在,可以使用与查询实际表类似的方式来查询 customers_view。如下所示。

sql > select * from customers_view;

结果如下。

 ---------- ----- 
| name     | age |
 ---------- ----- 
| ramesh   |  32 |
| khilan   |  25 |
| kaushik  |  23 |
| chaitali |  25 |
| hardik   |  27 |
| komal    |  22 |
| muffy    |  24 |
 ---------- ----- 

with check option

with check option 是一个 create view 语句选项。with check option 的目的是确保所有 update 和 insert 满足视图定义中的条件。

如果它们不满足条件,则 update 或 insert 返回错误。

以下是一个使用 with check option 创建相同视图 customers_view 的示例。

create view customers_view as
select name, age
from  customers
where age is not null
with check option;

在这种情况下,with check option 应该拒绝在视图的 age 列中输入任何 null 值,因为视图是由在 age 列中没有 null 值的数据定义的。


更新视图

可以在下面给出的某些条件下更新视图

  • select 语句不能包含关键字 distinct。
  • select 语句可能不包含汇总函数。
  • select 语句可能不包含集合函数。
  • select 语句可能不包含集合运算符。
  • select 语句不能包含 order by 子句。
  • from 子句不能包含多个表。
  • where 子句不能包含子查询。
  • 查询可能不包含 group by 或 having。
  • 可能不会更新计算列。
  • 基表中的所有 not null 列都必须包含在视图中,以便 insert 查询起作用。

因此,如果视图满足上述所有规则,则可以更新该视图。下面是一个更新ramesh的年龄的例子。

sql > update customers_view
   set age = 35
   where name = 'ramesh';

这将最终更新基表 customers 并且同样会反映在视图本身中。现在,尝试查询基表,select 语句的结果如下所示。

 ---- ---------- ----- ----------- ---------- 
| id | name     | age | address   | salary   |
 ---- ---------- ----- ----------- ---------- 
|  1 | ramesh   |  35 | 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 |
 ---- ---------- ----- ----------- ---------- 

在视图中插入行

可以将数据行插入到视图中。适用于 update 命令的相同规则同样也适用于 insert 命令。

在这里,我们不能在 customers_view 中插入行,因为我们没有在此视图中包含所有 not null 列,否则就可以在视图中插入行,就像在表中插入行一样。

在视图中删除行

可以从视图中删除数据行。适用于 update 和 insert 命令的相同规则同样也适用于 delete 命令。

以下是删除 age = 22 的记录的示例。

sql > delete from customers_view
   where age = 22;

这最终会从基表 customers 中删除一行,并且同样会反映在视图本身中。现在,尝试查询基表,select 语句的结果如下所示。

 ---- ---------- ----- ----------- ---------- 
| id | name     | age | address   | salary   |
 ---- ---------- ----- ----------- ---------- 
|  1 | ramesh   |  35 | 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 |
|  7 | muffy    |  24 | indore    | 10000.00 |
 ---- ---------- ----- ----------- ---------- 

删除视图

显然,在拥有视图的地方,如果不再需要该视图,则需要一种方法来删除该视图。语法非常简单,如下所示

drop view view_name;

以下是从 customers 表中删除 customers_view 的示例。

drop view customers_view;

查看笔记

扫码一下
查看教程更方便
网站地图