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" // 定义…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...