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
子句之外,其他子句中也可以使用子查询,例如 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 操作符进行条件过滤:

-- in 
-- 存在 2008 年 01 月 01 日以后入职员工的部门
select *
from cps.public.departments d 
where d.department_id in 
(
select distinct e.department_id 
from cps.public.employees e 
where e.hire_date >= date '2008-01-01'
);

在这里插入图片描述

ALL 操作符

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

-- all
-- 返回了月薪比销售部门(department_id = 80)所有员工都高的员工
select e.first_name ,
e.salary 
from cps.public.employees e 
where e.salary > all
(select e2.salary from cps.public.employees e2 where e2.department_id= 80);

上述sql等价于下面的sql

-- all
-- 返回了月薪比销售部门(department_id = 80)所有员工都高的员工
select e.first_name ,
e.salary 
from cps.public.employees e 
where e.salary > 
(select max(e2.salary)  from cps.public.employees e2 where e2.department_id= 80);

在这里插入图片描述

ANY 操作符

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

-- any
-- 返回了月薪比销售部门(department_id = 80)任何一个员工都高的员工
select e.first_name ,
e.salary 
from cps.public.employees e 
where e.salary > 
(select min(e2.salary)  from cps.public.employees e2 where e2.department_id= 80);

上述sql等价于下面的sql

-- any
-- 返回了月薪比销售部门(department_id = 80)任何一个员工都高的员工
select e.first_name ,
e.salary 
from cps.public.employees e 
where e.salary > any
(select e2.salary  from cps.public.employees e2 where e2.department_id= 80);

在这里插入图片描述
另外,SOME 和 ANY 是同义词。some的效果和any是一样的

关联子查询

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

/** 子查询中使用了外查询的字段(e.department_id)。对于外部查询中的每个员工,* 运行子查询返回他/她所在部门的平均月薪,然后传递给外部查询进行判断* */
-- 返回月薪大于所在部门平均月薪的员工
select 
e.first_name,
e.salary 
from cps.public.employees e 
where e.salary >
(select avg(e2.salary) from cps.public.employees e2 where e2.department_id  = e.department_id);

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

横向子查询

一般来说,子查询只能引用外查询中的字段,而不能使用同一层级中其他表中的字段。例如:

/**/
select 
d.department_name ,t.sum_sal
from cps.public.departments d 
join (
select sum(e.salary) sum_sal from cps.public.employees e where e.department_id = d.department_id 
) t on true;

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

/** 每个部门的名称和总月薪* */
select 
d.department_name ,t.sum_sal
from cps.public.departments d 
cross join lateral (
select sum(e.salary) sum_sal from cps.public.employees e where e.department_id = d.department_id 
) t;

在这里插入图片描述

EXISTS 操作符

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

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

在这里插入图片描述

-- not exists不存在
select * 
from cps.public.departments d 
where not exists 
(select 1 from cps.public.employees e
where e.department_id = d.department_id 
and e.hire_date > date '2008-01-01'
);

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

-- in 在什么取值范围内
select *
from cps.public.departments d 
where d.department_id  in 
(select distinct e.department_id  from cps.public.employees e)

在这里插入图片描述

-- not in 不属于子查询结果列
select *
from cps.public.departments d 
where d.department_id not in 
(select distinct e.department_id  from cps.public.employees e)

在这里插入图片描述

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

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

相关文章

基于Python机器学习、深度学习提升气象、海洋、水文应用教程

详情点击链接:基于Python机器学习、深度学习提升气象、海洋、水文应用教程 前沿 Python是功能强大、免费、开源,实现面向对象的编程语言,能够在不同操作系统和平台使用,简洁的语法和解释性语言使其成为理想的脚本语言。除了标准…

链表例题小总结:

链表: 第一种题型:双指针 力扣203:移除链表元素 力扣题目链接 题意:删除链表中等于给定值 val 的所有节点。示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5]示例 2&#xff1…

MySQL——数据类型以及对表结构的修改

MySQL的数据类型 刚才我们在创建表的时候,说到了一个字段类型,所谓的字段类型就是这个字段能存放的数据的数据类型,在MySQL中有以下几种数据类型: 数据类型 大小(字节) 用途 格式 INT 4 整数 FLOAT…

RabbitMQ从入门到精通之安装、通讯方式详解

文章目录 RabbitMQ一、RabbitMQ介绍1.1 现存问题 一、RabbitMQ介绍二、RabbitMQ安装三、RabbitMQ架构四、RabbitMQ通信方式4.1 RabbitMQ提供的通讯方式4.2 Helloworld 方式4.2Work queues4.3 Publish/Subscribe4.4 Routing4.5 Topics4.6 RPC (了解) 五、Springboot 操作RabbitM…

【MyBatisⅡ】动态 SQL

目录 🎒1 if 标签 🫖2 trim 标签 👠3 where 标签 🦺4 set 标签 🎨5 foreach 标签 动态 sql 是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接。 在 xml 里面写判断条件。 动态SQL 在数据库里…

LeetCode 202 快乐数

题目链接 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 法一:哈希 使用哈希表循环判断每次经过平方和的数,如果为1则直接返回true,若之前存在过但不为1则直接返回false 代码 class Solution { public:// 计算…

【MySQL基础|第一篇】——谈谈SQL中的DDL语句

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】🎈 本专栏旨在分享学习MySQL的一点学习心得,欢迎大家在评论区讨论💌 前言&#xff…

力扣(LeetCode)算法_C++——有效的数独

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) …

ChatGPT AIGC 完成多维分析雷达图

我们先让ChatGPT来帮我们总结一下多维分析雷达图的功能与作用。 同样ChatGPT AIGC完成的动态雷达图效果如下; 这样的一个多维分析动态雷达图是用HTML,JS,Echarts 来完成的。 将完整代码复制如下: <!DOCTYPE html> <html style="height: 100%"><h…

PHP8内置函数中的变量函数-PHP8知识详解

在php8中&#xff0c;与变量相关的内置函数比较多&#xff0c;本文说一些比较重要的、常见的内置函数。今日着重讲解了5个&#xff0c;分别是&#xff1a;检测变量是否为空的函数empty()、判断变量是否定义过的函数isset()、销毁指定的变量的函数unset()、获取变量的类型的函数…

通过Siri打造智能爬虫助手:捕获与解析结构化数据

在信息时代&#xff0c;我们经常需要从互联网上获取大量的结构化数据。然而&#xff0c;传统的网络爬虫往往需要编写复杂代码和规则来实现数据采集和解析。如今&#xff0c;在苹果公司提供的语音助手Siri中有一个强大功能可以帮助我们轻松完成这项任务——通过使用自定义指令、…

MySQL表的CURD

CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; Create 语法 INSERT [INTO] table_name [(column [, column] ...)] VALUES (value_list) [, (value_list)] ... value_list: value, [, value] ... 示例&#x…

鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…

基于Hata模型的BPSK调制信号小区覆盖模拟matlab完整程序分享

基于Hata信道模型的BPSK调制信号小区覆盖模拟matlab仿真&#xff0c;对比VoIP, Live Video,FTP/Email 完整程序&#xff1a; clc; clear; close all; warning off; addpath(genpath(pwd)); % Random bits are generated here. bits randi([0, 1], [50,1]); M 2; t 1:1:50; …

Lesson5-2:OpenCV视频操作---视频追踪

学习目标 理解meanshift的原理知道camshift算法能够使用meanshift和Camshift进行目标追踪 1.meanshift 1.1原理 m e a n s h i f t meanshift meanshift算法的原理很简单。假设你有一堆点集&#xff0c;还有一个小的窗口&#xff0c;这个窗口可能是圆形的&#xff0c;现在你可…

【算法】堆排序 详解

堆排序 详解 堆排序代码实现 排序&#xff1a; 排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a; 假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c…

企业架构LNMP学习笔记18

nginx的日志&#xff1a; 日志类型&#xff1a; access.log 访问日志、查看统计用户的访问信息&#xff0c;流量。 error.log 错误日志&#xff0c;错误信息&#xff0c;重写信息。 access.log日志文件内容示例&#xff1a; 192.168.17.1 - - [06/Sep/2023:20:37:39 0800] …

前端开发从 0 到 1 掌握 docker

文章目录 前端从 0 到 1 掌握 docker一、docker 的一些基础概念概念定义question&#xff1a;什么是docker&#xff1f; 为什么要使用docker&#xff1f; 二、实战操作 (墙裂建议读者实操一遍)Part1 - Linux CentOS 服务安装 DockerPart2 - 启动、使用、查看等命令Part3 - 示例…

循迹小车原理介绍和代码示例

目录 循迹小车 1. 循迹模块使用 2. 循迹小车原理 3. 循迹小车开发和调试代码 循迹小车 1. 循迹模块使用 TCRT5000传感器的红外发射二极管不断发射红外线当发射出的红外线没有被反射回来或被反射回来但强度不够大时红外接收管一直处于关断状态&#xff0c;此时模块的输出…

智能小车—PWM方式实现小车调速和转向

目录 1. 让小车动起来 2. 串口控制小车方向 3. 如何进行小车PWM调速 4. PWM方式实现小车转向 1. 让小车动起来 电机模块开发 L9110s概述 接通VCC&#xff0c;GND 模块电源指示灯亮&#xff0c; 以下资料来源官方&#xff0c;具体根据实际调试 IA1输入高电平&#xff0c…