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:
相关文章:
postgresql-子查询
postgresql-子查询 简介派生表IN 操作符ALL 操作符ANY 操作符关联子查询横向子查询EXISTS 操作符 简介 子查询(Subquery)是指嵌套在其他 SELECT、INSERT、UPDATE 以及 DELETE 语句中的 查询语句。 子查询的作用与多表连接查询有点类似,也是为…...
Linux 系统运维工具之 OpenLMI
一、前要 OpenLMI(全称 Open Linux Management Infrastructure)即开放式的 Linux 管理基础架构。OpenLMI 是一个开源项目,用于管理 Linux 系统管理的通用基础架构。它建立在现有工具基础上,充当抽象层,以便向系统管理…...
8天长假快来了,Python分析【去哪儿旅游攻略】数据,制作可视化图表
目录 前言环境使用模块使用数据来源分析 代码实现导入模块请求数据解析保存 数据可视化导入模块、数据年份分布情况月份分布情况出行时间情况费用分布情况人员分布情况 前言 2023年的中秋节和国庆节即将来临,好消息是,它们将连休8天!这个长假…...
【HSPCIE仿真】输入网表文件(5)基本仿真输出
仿真输出 1. 概述1.1 输出变量1.2 输出分析类型 2. 显示仿真结果2.1 .print语句基本语法示例 2.2 .probe 语句基本语法示例 2.3 子电路的输出2.4 打印控制选项.option probe.option post.option list.option ingold 2.5 .model_info打印模型参数 3. 仿真输出参数的选择3.1 直流…...
uni-app中使用iconfont彩色图标
uni-app中使用iconfont彩色图标 大家好,今天我们来学习一下uni-app中使用iconfont彩色图标,好好看,好好学,超详细的 第一步 首先,从iconfont官网(iconfont-阿里巴巴矢量图标库)选择自己需要的图…...
Hystrix: Dashboard流监控
接上两张服务熔断 开始搭建Dashboard流监控 pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocat…...
iconfont 图标在vue里的使用
刚好项目需要使用一个iconfont的图标,所以记录一下这个过程 1、iconfont-阿里巴巴矢量图标库 这个注册一个账号,以便后续使用下载代码时需要 2、寻找自己需要的图标 我主要是找两个图标 ,一个加号,一个减号,分别加入到…...
QT登陆注册界面练习
一、界面展示 二、主要功能界面代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QMainWindow(parent), ui(new Ui::Widget) {ui->setupUi(this);this->setFixedSize(540,410); //设置固定尺寸th…...
MySQL DATE_SUB的实践
函数简介DATE_SUB()函数从DATE或DATETIME值中减去时间值(或间隔)。 下面说明了DATE_SUB()函数的语法: DATE_SUB(start_date,INTERVAL expr unit); DATE_SUB()函数接受两个参数: start_date是DATE或DATETIME的起始值。 expr是一个字符串,用于确…...
OpenCV最常用的50个函数
Python版:OpenCV提供了众多图像处理算子和函数,涵盖了各种任务和技术。以下是OpenCV中一些常用的50个算子和函数: cv2.imread:用于读取图像文件。cv2.imshow:用于显示图像。cv2.imwrite:用于保存图像。cv2…...
Android AGP8.1.0组件化初探
Android AGP8.1.0组件化初探 前言: 前面两篇完成了从AGP4.2到 AGP8.1.0的升级,本文是由于有哥们留言说在AGP8.0中使用ARouter组件化有问题,于是趁休息时间尝试了一下,写了几个demo,发现都没有问题,跳转和传…...
文件修改时间能改吗?怎么改?
文件修改时间能改吗?怎么改?修改时间是每个电脑文件具备的一个属性,它代表了这个电脑文件最后一次的修改时间,是电脑系统自动赋予文件的,相信大家都应该知道。我们右击鼠标某个文件,然后点击弹出菜单里面的…...
2023年下半年软考报名注意事项!
考试注意事项: 分数线:所有科目成绩全部在45分以上(含45分)通过考试;三科目的话,必须每科目都及格才算通过考试,只有一个不合格的,本次考试其他两个无效。 出成绩时间:预…...
【LeetCode每日一题】——274.H指数
文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 排序 二【题目难度】 中等 三【题目编号】 274.H指数 四【题目描述】 给你一个整数数组 ci…...
网络编程 day 4
1、多进程并发服务器根据流程图重新编写 #include <myhead.h>#define ERR_MSG(msg) do{\fprintf(stderr, "__%d__:", __LINE__); \perror(msg);\ }while(0)#define PORT 8888 //端口号,范围1024~49151 #define IP "192.168.11…...
【Java架构-版本控制】-Git基础
本文摘要 Git作为版本控制工具,使用非常广泛,在此咱们由浅入深,分三篇文章(Git基础、Git进阶、Gitlab搭那家)来深入学习Git 文章目录 本文摘要1.Git仓库基本概念1.1 远程仓库(Remote)1.2 本地库(Repository) 2. Git仓库…...
ubuntu 挂载硬盘操作
1. 查看磁盘 sudo fdisk -l 2. 查看UUID sudo blkid记录下待挂载硬盘的UUID, 后面要使用 ps. 如果报错,检查是否已格式化硬盘 查看新硬盘的盘符,我的是/dev/sda,用下述命令格式化 sudo mkfs -t ext4 /dev/sda3. 创建挂载点 我的是在/mnt…...
关于商品活动的H5页面技术总结
背景 在单个html文件里面使用vue3、jquery等其他第三方js库,实现规定的页面效果,其中主要功能是从商品json数据中读取数据,然后可以通过搜索框、下拉框、左侧菜单来筛选商户信息。 页面布局 技术要点: 1、通过路由来进行页面布…...
前端:横向滚动条,拖动进行左右滚动(含隐藏滚动条)
效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width, i…...
Android JNI Bitmap指定颜色值替换
#include <jni.h> #include <string> #include <android/bitmap.h> #include <cmath> #include <android/log.h> //定义TAG之后,我们可以在LogCat通过TAG过滤出NDK打印的日志 #define TAG "BitmapOperationNative" // 定义…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...
