PostgreSQL 视图、子查询

视图

表里面保存的是实际数据,视图里面保存的是SELECT语句(视图本身不存储数据)。

从视图中读取数据,此时视图在内部执行SELECT语句,创建一张临时表。

使用视图的好处:其一,视图不保存数据,节省存储设备容量。其二,将频繁使用的SELECT语句保存成视图,每次使用这些语句时候,不用重复书写,只需调用视图。其三,数据保存到表中,要显式的执行SQL更新语句才能更新数据,而视图中的数据会随着原表的变化自动更新。

创建视图

格式:

CREATE VIEW 视图名称(<视图列名1>,<视图列名2>,...)
AS
<SELECT语句>

例子:

CREATE VIEW ProductSum (product_type, cnt_product)
AS
SELECT product_type, COUNT(*)FROM ProductGROUP BY product_type;

使用视图

可见,如果使用视图,不用每次都写GROUP BY等一些语句从Product表中取数据。

并且,如果Product表中数据更新,视图也自动更新。

这是因为,视图就是保存好的SELECT语句。

SELECT product_type, cnt_productFROM ProductSum;

在这里插入图片描述

多重视图:以视图为基础创建视图。但是这样会降低SQL性能。

CREATE VIEW ProductSumA (product_type, cnt_product)
AS
SELECT product_type, cnt_productFROM ProductSumWHERE product_type = '办公用品';

在这里插入图片描述

定义视图时,不能用ORDER BY子句。因为视图和表,数据行都没有顺序。

(PostgreSQL里面,定义视图时候可以用ORDER BY子句,有些DBMS不行)

视图更新:

如果定义视图的SELECT语句满足一些条件,视图可以被更新。

SELECT子句没用DISTINCT、FROM子句只有一张表、没用GROUP BY、没用HAVING。

通过汇总得到的数据无法更新,这是因为视图和表要同时更新。

如果给上面的ProductSum中添加(‘食物’,3)的数据,原表就需要增加三行种类为食物的数据,但是这些数据我们都不知道,因此没法更新表中的数据。

可以更新下面这样,不通过汇总得到的视图。

CREATE VIEW ProductA (product_id, product_name, product_type, sale_price, purchase_price, regist_date)
AS 
SELECT *FROM ProductWHERE product_type = '办公用品';

向视图插入数据。

INSERT INTO ProductA VALUES ('0009', '铅笔', '办公用品', 95, 10, '2222-10-1');

此时可看到,视图和表都更新了。

在这里插入图片描述

删除视图:

格式

DROP VIEW 视图名称(<视图列名1>,<视图列名2>,...)

例子

DROP VIEW ProductSum;

然后报错

ERROR:  cannot drop view productsum because other objects depend on it
描述:  view productsuma depends on view productsum
提示:  Use DROP ... CASCADE to drop the dependent objects too.

这是因为前面以ProductSum为基础,创建了一个ProductSumA视图。

可以像下面这样删除ProductSum和与之关联的视图。

DROP VIEW ProductSum CASCADE;

子查询

子查询,相当于一次性视图。

定义视图ProductSum

CREATE VIEW ProductSum (product_type, cnt_product)
AS
SELECT product_type, COUNT(*)FROM ProductGROUP BY product_type;

子查询:将定义视图的SELECT语句直接用到FROM子句里面。

AS ProductSum,ProductSum是子查询的名称。执行完外边的SELECT语句,子查询就消失了。

下面代码,执行顺序,先是FROM子句里面的SELECT语句,然后是外边的SELECT语句。

SELECT product_type, cnt_productFROM (SELECT product_type, COUNT(*) AS cnt_productFROM ProductGROUP BY product_type) AS ProductSum;

下面再次查看ProductSum发现,ProductSum已经不存在了。由此看出,子查询是一次性的,并不像视图一样保存到硬盘里面。

在这里插入图片描述

在子查询的FROM子句里面,可以继续使用子查询。

下面就是把ProductSum里面cnt_product = 4的数据选出来了。

SELECT product_type, cnt_productFROM (SELECT *FROM (SELECT product_type, COUNT(*) AS cnt_productFROM ProductGROUP BY product_type) AS ProductSumWHERE cnt_product = 4) AS ProductSum2;

在这里插入图片描述

标量子查询scalar subquery,返回表中某一行某一列的值(单一值)的子查询。

可以在WHERE子句中使用标量子查询。

由于WHERE子句中无法使用聚合函数,像下面的语句就是错误的。

SELECT product_id, product_name, sale_priceFROM ProductWHERE sale_price > AVG(sale_price);

可以通过下面这样去实现。

SELECT product_id, product_name, sale_priceFROM ProductWHERE sale_price > (SELECT AVG(sale_price)FROM Product);

在任何使用单一值的地方,都可以使用标量子查询。

在SELECT子句中使用标量子查询:

SELECT product_id, product_name, sale_price,(SELECT AVG(sale_price)FROM Product) AS avg_priceFROM Product;

在HAVING子句中使用标量子查询:

不同商品种类的平均销售单价与全部商品的销售单价相比。

SELECT product_type, AVG(sale_price)FROM ProductGROUP BY product_type
HAVING AVG(sale_price) > (SELECT AVG(sale_price)FROM Product);

标量子查询不能返回多行结果,如果返回多行结果,那就是一个普通的子查询,不能用到需要单一输入值的地方了。

关联子查询

现在要选取各个商品种类里面,高于该商品种类平均销售价的商品。

按照商品种类计算平均价格:

SELECT AVG(sale_price)FROM ProductGROUP BY product_type;

因为有三种商品,上面这个查询返回三个结果。

在这里插入图片描述

那么就不能用下面这种方法了。因为子查询不是标量子查询,不能在WHERE子句里面用。

SELECT product_id, product_name, sale_priceFROM ProductWHERE sale_price > (SELECT AVG(sale_price)FROM ProductGROUP BY product_type);

在细分的组内进行比较的时候,用到关联子查询。

在子查询里面添加了一个WHERE子句。目的是在同一商品种类中对各商品销售单价和平均单价比较。

由于比较对象是同一个Product表,所以用了P1、P2两个别名。

使用关联子查询,用<表名>.<列名>形式,限定product_type,对平均单价比较。

SELECT product_type, product_name, sale_priceFROM Product AS P1WHERE sale_price > (SELECT AVG(sale_price)FROM Product AS P2WHERE P1.product_type = P2.product_typeGROUP BY product_type);

在这里插入图片描述

而且,不加GROUP BY,也能得到相同结果:

SELECT product_type, product_name, sale_priceFROM Product AS P1WHERE sale_price > (SELECT AVG(sale_price)FROM Product AS P2WHERE P1.product_type = P2.product_type);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/560150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GD32F307 DAC 输出波形

文章目录DACDAC_CTL 控制寄存器定时器TIMERx_CTL1 控制寄存器改变波形频率DMADMA和外设配合DMA_CHxCNT计数寄存器波形曲线总结源码DAC 如下面框图所示&#xff0c;使能外部触发后&#xff08;通过设置 DAC_CTL 寄存器的 DTENx 位&#xff09;&#xff0c; 当已经选择的触发事件…

GD32 ADC采集电压

文章目录ADCTIMDMA其他一些初始化main总结使用芯片为GD32F307 ADC 连续转换模式&#xff0c;可以运行在规则组通道上&#xff0c;一旦相应软件触发或者外部触发产生&#xff0c;ADC就会采样和转换规定的通道。 采样时间&#xff0c;每个通道可以用不同的时间采样。ADC使用若…

DAC、ADC、FFT使用总结

目录计算公式波形生成DAC波形频率ADC采样时间离散傅里叶变换DFTFFT计算公式 DAC、ADC、FFT之间有些参数环环相扣&#xff0c;所以先整合一下公式。 1.系统时钟周期72MHZ。 2.定时器的单个时钟周期。 3.定时器的触发周期。 4.正弦波一个周期的时间&#xff0c;其中N为正弦波一…

c++代码根据点位连线_邹军:数控车倒角C与自动倒圆角R编程方法

提示&#xff1a;点击上方↑↑"数控达人"即可每天免费订阅【邹军&#xff0c;十多年数控工作经验&#xff0c;现自创一套有理论&#xff0c;有干货&#xff0c;还有方法论做支撑的实战编程教程(PDF)&#xff0c;从而让你编写程序就像做填空题一样简单。在没有人指引你…

不愿意和别人打交道_始终和人保持距离,最不合群的3星座,孤僻却有真本事,能成大事...

始终和人保持距离&#xff0c;最不合群的3星座&#xff0c;孤僻却有真本事&#xff0c;能成大事巨蟹座巨蟹座的人真的是天生孤僻&#xff0c;他们始终和人保持距离&#xff0c;也不喜欢跟别人打交道&#xff0c;最怕就是应酬的事&#xff0c;看起来很不合群&#xff0c;但是巨蟹…

stc15w4k32s4芯片引脚图片_单片机引脚功能初识及提高(3)

40个接口我们已经了解了29个了&#xff0c;在开始我们 今天的内容之前&#xff0c;我们先对之前的内容总结一下。图片来源网络最小系统电源部分(20脚GND,40脚VCC[5v])复位部分(9脚&#xff0c;给高电平进行复位)下载部分(ISP下载接6&#xff0c;7&#xff0c;8脚&#xff0c;ch…

tsd3dmapper软件使用方法_TOYO模组选型软件使用方法

直线模组选型对于机械工程师和采购人员来说&#xff0c;是最基础的硬性要求。直线滑台模组选型中性能是其中之一&#xff0c;还要根据需求考虑&#xff1a;相对应的&#xff0c;在选购直线滑台模组时&#xff0c;先根据下面几点需求来断定直线滑台模组的详细参数需求。可以参考…

pdf从结构新建书签_强力推荐一款PDF神器

某阅读器作为一款在全球范围内流行的PDF阅读器&#xff0c;能够快速打开、浏览、审阅、注释、签署及打印任何PDF文件&#xff0c;具有轻快、高效、安全等特性&#xff0c;是目前一款带有PDF创建功能的阅读器。此外&#xff0c;它以安全著称&#xff0c;从底层技术、应用设计、功…

二元相图软件_Materials Studio 领先的材料模拟软件

BIOVIA MATERIALS STUDIO拥有完善的建模和模拟工具&#xff0c;能够帮助材料科学与化学领域的研究者对材料中原子、分子结构与性质、性能间的关系进行预测。利用Materials Studio&#xff0c;各工业领域的研究者能够对诸多类型的材料&#xff0c;如制药、催化剂、高分子及复合材…

java8 stream 做累加_《Java 8 in Action》Chapter 1:为什么要关心Java 8

自1998年 JDK 1.0(Java 1.0) 发布以来&#xff0c;Java 已经受到了学生、项目经理和程序员等一大批活跃用户的欢迎。这一语言极富活力&#xff0c;不断被用在大大小小的项目里。从 Java 1.1(1997年) 一直到 Java 7(2011年)&#xff0c;Java 通过增加新功能&#xff0c;不断得到…

fabric go sdk 依赖的安装_从这些角度看 Go 是一门很棒的语言

Go 当前引起了很多关注。让我们看一下 Go 好的部分。我最近用 Go 写了一个 SSH 服务器[1]&#xff0c;在其中启动容器。该项目已经发展到很大规模&#xff0c;并且我向 Go 发起了 PR[2]&#xff0c;以修复我发现的错误。在积累了比 “Hello world&#xff01;” 更多的经验之后…

程序win10_win10该文件没有与之关联的程序来执行操作

当初我遇到这个问题的时候&#xff0c;也是一脸懵&#xff01;在度娘那里尝试了许多种方法&#xff0c;都没有得到解决&#xff01;那些方法我就不一一介绍了&#xff0c;百度一大堆&#xff01;下面就来分享一下我解决的办法&#xff01;1.打开默认程序2.找到设置程序访问和计…

node工程默认url_node 爬虫入门实例,简单易懂

前言本文介绍一个 koa 的爬虫项目&#xff0c;受众对象为初学前端不久的小伙伴&#xff0c;通过这个项目能对 node 爬虫有一个简单的认识&#xff0c;也能自己动手写一些简单的爬虫。项目地址&#xff1a;Fe-Icy/firm-spider​github.com启动 koa 服务Koa (koajs) -- 基于 Node…

xshell6 不更新无法使用_世纪金花商联卡无法正常使用 客服:因门店面临改造,涉及品牌、规则每天都在更新...

有效期10年、无消费限制的世纪金花商联卡在半年前开始无法正常使用&#xff0c;11月22日&#xff0c;世纪金花赛高店内200多个零售品牌&#xff0c;只有一个品牌可以无金额限制地正常使用商联卡&#xff0c;世纪金花各门店每日可使用的品牌数量、规则都在变化&#xff0c;什么时…

linux ls 中文乱码_每天一个linux命令:Linux文件类型与扩展名

Linux文件类型和Linux文件的文件名所代表的意义是两个不同的概念。我们通过一般应用程序而创建的比如file.txt、file.tar.gz &#xff0c;这些文件虽然要用不同的程序来打开&#xff0c;但放在Linux文件类型中衡量的话&#xff0c;大多是常规文件&#xff08;也被称为普通文件&…

linux中cooy命令_Linux:CentOS 7中常用的基础命令

对于学习Linux系统来说&#xff0c;命令是必须熟练掌握的第一个部分。Linux系统中的命令有600多个&#xff0c;但常用的基础命令并不多。虽然不同版本的Linux系统的命令稍有不同&#xff0c;但命令的语法与使用方法基本相同&#xff0c;因此读者只要掌握了CentOS 7中常用的基础…

730阵列卡支持多大硬盘_3分钟告诉你:OPPO Reno普通版和旗舰版的差距到底有多大...

昨天OPPO正式发布了Reno系列手机&#xff1a;分为标准版和旗舰版两款。宣传普通版的售价和旗舰版的卖点是手机厂商一贯的传统。为了搞清楚普通版和旗舰版的差距到底有多大&#xff0c;今天我和大家一起扒一扒这两款手机之间的区别到底有多大&#xff0c;供大家在选机时做一个参…

查看list的形状_用Wordcloud生成指定形状的词云图

wordcloud是Python扩展库中一种将词语用图片表达出来的一种形式&#xff0c;通过词云生成的图片&#xff0c;我们可以更加直观的看出某篇文章的故事梗概。首先贴出一张词云图(以哈利波特小说为例)&#xff1a;在生成词云图之前&#xff0c;首先要做一些准备工作1.安装结巴分词库…

oc引导win方法_[OC更新]机械革命8代、9代标压稳定版更新

加关注这种话银家怎么好意思说出口嘛更新机型机械革命Z2G机械革命Z2AIRG机械革命X3(9th ver)机械革命umi air(1080p ver)机械革命X9TI机械革命X8TI-R机械革命X8TI-G机械革命Z2机械革命Z2AIR机械革命X8TI机械革命X8TI PLUS机械革命X3(8th ver)机械革命S1PLUS(8750H)机械革命X2更…

有机晶体数据库_Cambridge Structural Database 2017 晶体结构分析软件分享

文 / 利刃君微信ID / ziyuanliren666全文共2024字&#xff0c;推荐阅读时间6分钟。剑桥结构数据库系统(The Cambridge Structural Database System&#xff0c;简写为CSDS)是基于X光和中子衍射实验唯一的小分子及金属有机分子晶体的结构数据库&#xff0c;收录了全世界范围内所…