热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

PostgreSQL数据库中视图的创建、使用和删除

PostgreSQL的一个主要特点就是创建自定义“视图”,这些视图仅仅是预先定义的SQL查询,它们存储在数据库中并可以在需要时重复使用。因此,以这种方式储存经常使用的SQL查询比每次都手工输入要更有效率而且更加灵活,因为通过视图生成的数据集本身就可以通过S

PostgreSQL的一个主要特点就是创建自定义“视图”,这些视图仅仅是预先定义的SQL查询,它们存储在数据库中并可以在需要时重复使用。因此,以这种方式储存经常使用的SQL查询比每次都手工输入要更有效率而且更加灵活,因为通过视图生成的数据集本身就可以通过SQL来操作。

这篇文章主要介绍了如何创建、使用和删除PostgreSQL数据库中的视图。

示例表格

使用以下的SQL命令来创建三个示例表格:

test=# CREATE TABLE stories (id INT, title VARCHAR, time TIMESTAMP);

test=# CREATE TABLE authors (id INT, name VARCHAR);

test=# CREATE TABLE stories_authors_link (story INT, author INT);
以上命令创建了三个表:一个用于小说标题、一个用于作者姓名,还有一个用于作者与小说的映射。使用列表A中的代码向表格中填充记录:

列表A:

test=# INSERT INTO authors VALUES (1, 'John Doe');
  test=# INSERT INTO authors VALUES (2, 'James White');
  test=# INSERT INTO authors VALUES (3, 'Ellen Sue');
  test=# INSERT INTO authors VALUES (4, 'Gina Haggelstrom');
  test=# INSERT INTO authors VALUES (5, 'Jane Ki');
  test=# INSERT INTO stories VALUES
  (100, 'All Tied Up', '2005-04-01 12:37:00');
  test=# INSERT INTO stories VALUES
  (112, 'Into Thin Air...', '2005-04-02 06:54:12');
  test=# INSERT INTO stories VALUES
  (127, 'The Oxford Blues', '2005-06-12 18:01:43');
  test=# INSERT INTO stories VALUES
  (128, 'Crash!', '2005-03-27 09:12:17');
  test=# INSERT INTO stories VALUES
  (276, 'Memories Of Malgudi', '2005-06-09 23:35:57');
  test=# INSERT INTO stories VALUES
  (289, 'The Big Surprise', '2005-05-30 08:21:02');
  test=# INSERT INTO stories VALUES
  (301, 'Indians and The Cowboy', '2005-04-16 11:19:28');
  test=# INSERT INTO stories_authors_link VALUES (112, 2);
  test=# INSERT INTO stories_authors_link VALUES (127, 1);
  test=# INSERT INTO stories_authors_link VALUES (128, 5);
  test=# INSERT INTO stories_authors_link VALUES (276, 5);
  test=# INSERT INTO stories_authors_link VALUES (289, 3);
  test=# INSERT INTO stories_authors_link VALUES (301, 5);
  test=# INSERT INTO stories_authors_link VALUES (100, 1);
下一步,假设我们要获取一份关于小说及其作者的完整报告,这最好是通过连接三个表的公用字段来实现,如列表B所示:

列表B:

test=# SELECT s.title, a.name, s.time
  test-# FROM stories AS s, authors AS a, stories_authors_link AS sa
  test-# WHERE s.id = sa.story
  test-# AND a.id = sa.author
  test-# ORDER BY s.time
  test-# DESC;
  title|name|time
  ------------------------+-------------+---------------------
  The Oxford Blues| John Doe| 2005-06-12 18:01:43
  Memories Of Malgudi| Jane Ki| 2005-06-09 23:35:57
  The Big Surprise| Ellen Sue| 2005-05-30 08:21:02
  Indians and The Cowboy | Jane Ki| 2005-04-16 11:19:28
  Into Thin Air...| James White | 2005-04-02 06:54:12
  All Tied Up| John Doe| 2005-04-01 12:37:00
  Crash!| Jane Ki| 2005-03-27 09:12:17
  (7 rows)
  很显然,如果一而再,再而三地输入这么长的查询是非常无效的,
   因此,将查询存储为视图是很有意义的,您可以这样做:
  test=# CREATE VIEW myview
  AS SELECT s.title, a.name, s.time
  FROM stories AS s, authors AS a, stories_authors_link
  AS sa WHERE s.id = sa.story
  AND a.id = sa.author ORDER BY s.time DESC;
 


创建一个视图的语法是CREATE VIEW name AS query,这将在数据库中以name为名称来存储query字符串的查询,您可以通过dv命令来检查输出,如下所示:



test=# dv


List of relations

Schema | Name | Type | Owner

--------+--------+------+-------

public | myview | view | pgsql

(1 row)
 

如果要重复使用一个视图,可以运行一个SELECT查询,就像一个正常的表一样,如列表C所示:

列表C:


  test=# SELECT * FROM myview;
  title|name|time
  ------------------------+-------------+-------------
  The Oxford Blues| John Doe| 2005-06-12 18:01:43
  Memories Of Malgudi| Jane Ki| 2005-06-09 23:35:57
  The Big Surprise| Ellen Sue| 2005-05-30 08:21:02
  Indians and The Cowboy | Jane Ki| 2005-04-16 11:19:28
  Into Thin Air...| James White | 2005-04-02 06:54:12
  All Tied Up| John Doe| 2005-04-01 12:37:00
  Crash!| Jane Ki| 2005-03-27 09:12:17
  (7 rows)
 


如列表C所示:从视图中进行选择实际上运行了原有的存储查询,很自然地,您可以在SELECT语句中使用SQL操作符来操作一个视图的输出,可以参考列表D中的示例。


列表D:



  test=# SELECT title, name FROM myview LIMIT 3;
  title|name
  ---------------------+-----------
  The Oxford Blues| John Doe
  Memories Of Malgudi | Jane Ki
  The Big Surprise| Ellen Sue
  (3 rows)
  验证原有的视图已经不存在可以通过dv命令的输出来检查:
  test=# dv
  No relations found.
 


注释:与以上的例子相同,视图提供了一个简便快捷的方式来完成经常使用的SELECT查询,而且还可以简单地获取相同数据的不同视角。


推荐阅读
  • 如何在Django框架中实现对象关系映射(ORM)
    本文介绍了Django框架中对象关系映射(ORM)的实现方式,通过ORM,开发者可以通过定义模型类来间接操作数据库表,从而简化数据库操作流程,提高开发效率。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • 本文详细介绍了在 Ubuntu 16.04 系统上安装和配置 PostgreSQL 数据库的方法,包括如何设置监听地址、启用密码加密、更改默认用户密码以及调整客户端访问控制。 ... [详细]
  • 本文作为《WM平台上使用Sybase Anywhere 11》系列的第二篇,将继续探讨在Windows Mobile (WM) 系统中如何高效地操作Sybase Anywhere 11数据库。继上一篇关于安装与基本测试的文章之后,本篇将深入讲解数据库的具体操作方法。 ... [详细]
  • 本文探讨了在SQL Server中处理几何类型列时遇到的INTERSECT操作限制,并提供了解决方案,包括通过转换数据类型和使用额外表结构的方法。 ... [详细]
  • 从CodeIgniter中提取图像处理组件
    本指南旨在帮助开发者在未使用CodeIgniter框架的情况下,如何独立使用其强大的图像处理功能,包括图像尺寸调整、创建缩略图、裁剪、旋转及添加水印等。 ... [详细]
  • 本文探讨了如何通过Service Locator模式来简化和优化在B/S架构中的服务命名访问,特别是对于需要频繁访问的服务,如JNDI和XMLNS。该模式通过缓存机制减少了重复查找的成本,并提供了对多种服务的统一访问接口。 ... [详细]
  • 本文记录了在Windows 8.1系统环境下,使用IIS 8.5和Visual Studio 2013部署Orchard 1.7.2过程中遇到的问题及解决方案,包括503服务不可用错误和web.config配置错误。 ... [详细]
  • 在处理大量联系人数据的批量插入操作时,发现现有方法的执行效率低下,尤其是在处理数十条记录以上时,与导出操作的速度形成鲜明对比。本文将探讨如何通过代码优化来提升批量插入联系人的效率。 ... [详细]
  • HTML:  将文件拖拽到此区域 ... [详细]
  • 在处理大数据量的SQL分页查询时,通常需要执行两次查询来分别获取数据和总记录数。本文介绍了一种优化方法,通过单次查询同时返回分页数据和总记录数,从而提高查询效率。 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • Bootstrap Paginator 分页插件详解与应用
    本文深入探讨了Bootstrap Paginator这款流行的JavaScript分页插件,提供了详细的使用指南和示例代码,旨在帮助开发者更好地理解和利用该工具进行高效的数据展示。 ... [详细]
  • 本文将详细介绍Mybatis Plus框架中@TableField注解的具体使用方法及其应用场景,帮助开发者更好地理解和利用这一强大工具进行高效的数据操作。 ... [详细]
  • java类名的作用_java下Class.forName的作用是什么,为什么要使用它?
    湖上湖返回与带有给定字符串名的类或接口相关联的Class对象。调用此方法等效于:Class.forName(className,true,currentLoader) ... [详细]
author-avatar
拍友2602909025
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有