跳到主要内容

视图

前言

当SQL语句比较复杂且需要反复执行时,如果每次都要重新编写SQL就会比较麻烦,可以用视图(View)来简化SQL。

查看视图

  • psql查看单个视图
\d view_name
  • 列出当前schema中的所有视图
SELECT table_name
FROM information_schema.tables
WHERE table_type = 'VIEW'
AND table_schema = current_schema();

创建视图

create view view_name as
select col1, col2 ...
from table_name
where [condition];

删除视图

DROP VIEW IF EXISTS view_name;

更新视图

视图只是逻辑概念,如果要更新视图的定义,可以直接删掉再重新创建。

可以通过视图执行DML操作,但不是所有的视图都可以执行DML,视图定义稍微复杂点就执行不了。

-- 简单的视图还能执行DML
update view1 set sal=sal+100

临时视图

Postgres中有临时视图,在当前会话结束时,临时视图就会被自动删除。

create or replace temporary tempview as ...

物化视图

视图本身是一个虚表,并不包含数据。如果视图可以缓存数据,那么通过视图进行查询可以提高查询的性能。

创建物化视图

create or replace materialized view mview as ...

物化视图创建时查询结果会被缓存起来,后来再查询物化视图就会直接返回缓存的结果集。物化视图的数据需要手动刷新

refresh materialized view mview;

在刷新物化视图时会锁表,如果物化视图上有唯一索引,可以使用concurrently关键字避免锁表

-- 在物化视图上创建唯一索引
create unique index myview_unique on mview(<column name>);

-- 刷新物化视图
refresh materialized view concurrently mview;

删除物化视图

drop materialized view mview;