postgresql-子查询

postgresql-子查询

  • 简介
  • 派生表
  • IN 操作符
  • ALL 操作符
  • ANY 操作符
  • 关联子查询
  • 横向子查询
  • EXISTS 操作符

简介

子查询(Subquery)是指嵌套在其他 SELECT、INSERT、UPDATE 以及 DELETE 语句中的
查询语句。
子查询的作用与多表连接查询有点类似,也是为了从多个关联的表中返回或者过滤数据。

例如,我们想要知道哪些员工的月薪大于平均月薪,可以通过子查询实现:

select e.first_name, e.last_name, e.salaryfrom employees e
where salary > (select avg(salary) from employees);

在这里插入图片描述
其中,WHERE 子句中使用了一个子查询,用于计算平均月薪。PostgreSQL 在执行以上语句
时,先执行子查询返回平均月薪;然后将该值传递给外查询使用。
子查询必须位于括号中,也称为内查询,包含子查询的查询语句被称为外查询。除了 WHERE
子句之外,其他子句中也可以使用子查询,例如 SELECT 列表、FROM 子句等。

派生表

FROM 子句中的子查询被称为派生表(Derived table),语法如下:

SELECT column1, column2, ...FROM (subquery) AS table_alias;

其中子查询相当于创建了一个临时表 table_alias。以下语句用于获取每个部门的总月薪:

select d.department_name,ds.sum_salaryfrom departments djoin (select department_id,sum(salary) as sum_salaryfrom employeesgroup by department_id) dson (d.department_id = ds.department_id);

在这里插入图片描述
其中,子查询返回了部门编号和部门月薪合计;然后再和 departments 表进行连接查询。

IN 操作符

如果 WHERE 子查询返回多个记录,可以使用 IN 操作符进行条件过滤:

SELECT d.department_id,d.department_nameFROM departments d
WHERE d.department_id in (SELECT department_id FROM employees WHERE
hire_date >= date '2008-01-01');

以上查询返回了存在 2008 年 01 月 01 日以后入职员工的部门。如果想要返回包含该日期之
前入职的员工的部门,可以使用 NOT IN 操作符。
除了 IN 之外,还有一些其他进行类似过滤的操作符。

ALL 操作符

ALL 操作符与比较运算符一起使用,可以将一个值与子查询返回的列表进行比较:

SELECT first_name, last_name, salaryFROM employees
WHERE salary > all (SELECT salary FROM employees WHERE department_id = 80);

以上语句返回了月薪比销售部门(department_id = 80)所有员工都高的员工。
其他比较运算符也可以与 ALL 进行组合,例如 salary < ALL 表示月薪比销售部门所有员工
都低的员工。

ANY 操作符

ANY 操作符和 ALL 操作符使用方法类似,只是效果不同:

SELECT first_name, last_name, salaryFROM employees
WHERE salary > any (SELECT salary FROM employees WHERE department_id = 80);

在这里插入图片描述
以上语句返回了月薪比销售部门(department_id = 80)任何员工高的员工。
ANY 也可以和其他比较运算符一起使用,例如= ANY 实际上和 IN 的作用相同。
另外,SOME 和 ANY 是同义词。

关联子查询

有一类子查询,它们会引用外部查询中的列,因而与外部查询产生关联,被称为关联子查询。

返回月薪大于所在部门平均月薪的员工:

select first_name, last_name, salary
from employees o
where o.salary > (select avg(salary) from employees i where i.department_id
= o.department_id);

在这里插入图片描述
可以看到,子查询中使用了外查询的字段(o.department_id)。对于外部查询中的每个
员工,运行子查询返回他/她所在部门的平均月薪,然后传递给外部查询进行判断。

关联子查询对于外查询中的每一行都会运行一次(数据库可能会对此进行优化),而非
关联子查询在整个查询运行时只会执行一次

以下语句在 SELECT 列表中使用关联子查询,返回每个部门的总月薪,和上文示例
相同:

SELECT d.department_name,(SELECT SUM(salary)FROM employees eWHERE e.department_id = d.department_id) AS sum_salaryFROM departments dORDER BY d.department_name;

横向子查询

子查询只能引用外查询中的字段,而不能使用同一层级中其他表中的字段

SELECT d.department_name,t.avg_salaryFROM departments dJOIN (SELECT avg(e.salary) AS avg_salaryFROM employees eWHERE e.department_id = d.department_id) t;
SQL Error [42601]: ERROR: syntax error at end of inputPosition: 209

以上语句在 JOIN 中引用了左侧 departments 表中的字段,产生了语法错误。为此,我们需
要使用横向子查询(LATERAL subquery)。通过增加 LATERAL 关键字,子查询可以引用左侧
表中的列:

select d.department_name,t.sum_salaryfrom departments d
cross join lateral (select sum(e.salary) as sum_salaryfrom employees ewhere e.department_id = d.department_id) t;

以上语句同样返回了每个部门的名称和总月薪。

EXISTS 操作符

EXISTS 操作符用于检查子查询结果的存在性。如果子查询返回任何结果,EXISTS 返回 True;
否则,返回 False。

返回了存在 2008 年 01 月 01 日以后入职员工的部门

select 
d.department_id ,
d.department_name 
from cps.public.departments d 
where exists (
select 1 from cps.public.employees e where e.hire_date >= date('2008-01-01')
);

在这里插入图片描述
NOT EXISTS 操作符执行相反的操作,即子查询不返回任何结果,NOT EXISTS 返回 True;
否则,返回 False。

[NOT] IN 用于检查某个值是否属于(=)子查询的结果列表,[NOT] EXISTS 只检查子查询
结果的存在性。如果子查询的结果中存在 NULL,NOT EXISTS 结果为 True;但是,NOT IN 结
果为 False,因为 NOT (X = NULL) 的结果为 NULL。例如:

在这里插入图片描述
以上语句查找没有任何员工的部门,结果返回了 16 条记录。如果使用 NOT IN 操作符:

select d.department_id,d.department_namefrom departments d
where d.department_id not in (select department_id from employees);

在这里插入图片描述
查询没有返回任何结果,因为有一个员工不属于任何部门,导致子查询的结果中包含 NULL:

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

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

相关文章

NTP时钟同步服务器

目录 一、什么是NTP&#xff1f; 二、计算机时间分类 三、NTP如何工作&#xff1f; 四、NTP时钟同步方式&#xff08;linux&#xff09; 五、时间同步实现软件&#xff08;既是客户端软件也是服务端软件&#xff09; 六、chrony时钟同步软件介绍 七、/etc/chrony.conf配置文件介…

JVM内存管理、内存分区:堆、方法区、虚拟机栈、本地方法栈、程序计数器

内存管理 内存分区 线程共享 堆 存放实例&#xff0c;字符串常量&#xff08;直接引用&#xff09;&#xff0c;静态变量&#xff0c;线程分配缓冲区&#xff08;TLAB线程私有&#xff09;。垃圾收集器管理的区域 方法区 非堆&#xff0c;和堆相对的概念。存储已被虚拟机加载的…

uniapp的 picker 日期时间选择器

效果图&#xff1a; dateTimePicker.js function withData(param){return param < 10 ? 0 param : param; } function getLoopArray(start,end){var start start || 0;var end end || 1;var array [];for (var i start; i < end; i) {array.push(withData(i))…

【ACM出版】第四届人工智能与计算工程国际学术会议(ICAICE 2023)

ACM出版|第四届人工智能与计算工程国际学术会议 The 4th International Conference on Artificial Intelligence and Computer Engineering 为了在人工智能技术应用与计算工程领域进一步的探索&#xff0c;与国内外学界和业界相关人员交流新问题、新发现、新成果、新应用&…

__call__函数

一、定义 在Python中&#xff0c;__call__函数是一个特殊的方法&#xff0c;用于使一个对象可以像函数一样被调用。当一个对象定义了__call__方法时&#xff0c;它就成为了一个可调用对象。 二、使用 class Counter:def __init__(self):self.count 0def __call__(self):sel…

查局域网所有占用IP

查局域网所有占用IP 按&#xff1a;winr 出现下面界面&#xff0c;在文本框中输入 cmd 按确定即可出现cmd命令界面 在cmd命令窗口输入你想要ping的网段&#xff0c;下面192.168.20.%i即为你想要ping的网段&#xff0c;%i代表0-255 for /L %i IN (1,1,254) DO ping -w 1 -n 1…

优化物料编码规则,提升物料管理效率

导 读 ( 文/ 2358 ) 物料是生产过程的必需品。对物料进行身份的唯一标识&#xff0c;可以更好的管理物料库存、库位&#xff0c;更方便的对物料进行追溯。通过编码规则的设计&#xff0c;可以对物料按照不同的属性、类别或特征进行分类&#xff0c;从而更好地进行库存分析、计划…

业务需要咨询?开发遇到 bug 想反馈?开发者在线提单功能上线!

大家是否遇到过下列问题—— 在开发的时候&#xff0c;遇到 bug 需要反馈… 有合作意向的时候&#xff0c;想更多了解业务和相关产品… 在接入的时候&#xff0c;需要得到专业技术支持… 别急&#xff0c;荣耀开发者服务平台在线提单功能上线了~ 处理问题分类说明&#xff1…

ElasticSearch(一)数据类型

ElasticSearch&#xff08;一&#xff09;数据类型 1.简述 Es数据类型分为基础数据类型和复杂类型数据&#xff0c;掌握ES数据类型才能进一步使用ES检索数据内容。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot…

阿里云申请免费SSL证书的两种验证方式及配置服务器Tomcat升级HTTPS协议

通用教程&#xff0c;其他服务商的免费 SSL 证书也差不多是这个流程。&#xff08;至少腾讯云的操作步骤和本文是一致&#xff0c;嘻嘻&#xff01;&#xff09; 申请 SSL 证书 首先在阿里云上创建并申请 SSL 证书&#xff0c;之后选择 DNS 验证的方式&#xff0c;一种是手动配…

【Go 基础篇】Go语言结构体详解:打开自定义类型的大门

嗨&#xff0c;Go语言学习者们&#xff01;在编程的世界里&#xff0c;数据是核心&#xff0c;而结构体&#xff08;Struct&#xff09;是一种能够帮助我们更有组织地存储和操作数据的重要工具。在本篇博客中&#xff0c;我们将深入探讨Go语言中结构体的概念、定义、初始化、嵌…

PYTHON链家租房数据分析:岭回归、LASSO、随机森林、XGBOOST、KERAS神经网络、KMEANS聚类、地理可视化...

全文下载链接:http://tecdat.cn/?p29480 作者&#xff1a;Xingsheng Yang 1 利用 python 爬取链家网公开的租房数据&#xff1b; 2 对租房信息进行分析&#xff0c;主要对房租相关特征进行分析&#xff0c;并搭建模型用于预测房租&#xff08;点击文末“阅读原文”获取完整代码…

自动化运维:Ansible脚本之playbook剧本

目录 一、理论 1.playbooks 2.YAML 3.使用ansible批量安装apache服务 4.定义、引用变量 5.指定远程主机sudo切换用户 6.when条件判断 7.迭代 8.Templates 模块 9.tags 模块 10.Roles 模块 二、实验 1.使用ansible批量安装apache服务 2.定义、引用变量…

k8s之存储篇---数据卷Volume

数据卷概述 Kubernetes Volume&#xff08;数据卷&#xff09;主要解决了如下两方面问题&#xff1a; 数据持久性&#xff1a;通常情况下&#xff0c;容器运行起来之后&#xff0c;写入到其文件系统的文件暂时性的。当容器崩溃后&#xff0c;kubelet 将会重启该容器&#xff…

深度学习4. 循环神经网络 – Recurrent Neural Network | RNN

目录 循环神经网络 – Recurrent Neural Network | RNN 为什么需要 RNN &#xff1f;独特价值是什么&#xff1f; RNN 的基本原理 RNN 的优化算法 RNN 到 LSTM – 长短期记忆网络 从 LSTM 到 GRU RNN 的应用和使用场景 总结 百度百科维基百科 循环神经网络 – Recurre…

无涯教程-Android - List View函数

Android ListView 是垂直滚动列表中显示的视图&#xff0c;使用 Adapter 从列表(如数组或数据库)中获取内容的列表项会自动插入列表中。 适配器(Adapter)实际上是UI组件和将数据填充到UI组件中的数据源之间的桥梁&#xff0c;适配器保存数据并将数据发送到适配器视图&#xff0…

75 # koa 基本逻辑实现以及属性的扩展

准备工作 新建自己的 kaimo-koa 文件夹&#xff0c;结构如下&#xff1a; lib application.js&#xff1a;创建应用context.js&#xff1a;上下文request.js&#xff1a;koa 中自己实现的 request 的对象response.js&#xff1a;koa 中自己实现的 response 的对象 package.js…

有序充电运营管理平台是基于物联网和大数据技术的充电设施管理系统-安科瑞黄安南

随着我国能源战略发展以及低碳行动的实施&#xff0c;电动汽车已逐步广泛应用&#xff0c;而电动汽车的应用非常符合当今社会对环保意识的要求&#xff0c;以及有效节省化石燃料的消耗。 由于其没有污染排放的优点以及政府部门的关注&#xff0c;电动汽车将成为以后出行的重要…

设计模式行为型-状态模式

文章目录 简介状态模式基础定义状态接口或抽象类实现具体状态类 上下文类与状态转换上下文类的定义和作用状态转换及触发条件 状态模式的优势与适用性优点一&#xff1a;可维护的代码优点二&#xff1a;清晰的状态管理适用场景一&#xff1a;对象拥有多个状态适用场景二&#x…

(二十)大数据实战——Flume数据采集的基本案例实战

前言 本节内容我们主要介绍几个Flume数据采集的基本案例&#xff0c;包括监控端口数据、实时监控单个追加文件、实时监控目录下多个新文件、实时监控目录下的多个追加文件等案例。完成flume数据监控的基本使用。 正文 监控端口数据 ①需求说明 - 使用 Flume 监听一个端口&am…