PostgreSQL-常用函数和操作符-2

0. WITH

在 PL/pgSQL 中,WITH 子句通常用于创建一个临时结果集,这个结果集在执行 SQL 查询时使用。这个临时结果集通常被称为一个公共表表达式(Common Table Expression, CTE)。CTE 允许您在查询中引用它,就像引用一个表一样。

基本语法:

WITH [RECURSIVE] cte_name AS ([query]
)
-- 使用
SELECT * FROM cte_name;
  • cte_name:您为 CTE 指定的名称。
  • [RECURSIVE]:可选的,用于标记递归 CTE。
  • [query]:定义 CTE 的查询。

案例:

  • 下面是一个使用 WITH 语句的简单具体案例。假设我们有一个名为orders的表,它记录了订单的信息,包括订单ID、客户ID、订单日期和订单金额。我们想要找出每个客户的总订单金额,并找出订单金额超过1000的客户。

  • 不使用 WITH 语句的查询可能会像这样:

SELECT customer_id, SUM(order_amount) AS total_amount  
FROM orders  
GROUP BY customer_id  
HAVING SUM(order_amount) > 1000;

要求:

  • 如果我们想要进一步筛选这些客户,比如只选择那些在某个日期之后下过订单的客户,我们可以使用 WITH 语句来使查询更清晰:
WITH customer_totals AS (  SELECT customer_id, SUM(order_amount) AS total_amount  FROM orders  GROUP BY customer_id  
)  
SELECT ct.customer_id, ct.total_amount  
FROM customer_totals ct  
JOIN orders o ON ct.customer_id = o.customer_id  
WHERE o.order_date > '2023-01-01' -- 假设我们只关心2023年1月1日之后的订单  
AND ct.total_amount > 1000; -- 订单金额超过1000

解析:

  • 在这个例子中,我们首先使用 WITH 语句创建了一个名为customer_totals的CTE,它包含了每个客户的总订单金额。然后,在主查询中,我们从这个CTE中选择数据,并与orders表进行连接,以找出在指定日期之后下过订单且总订单金额超过1000的客户。
  • 使用 WITH 语句可以使查询更加模块化,并提高可读性,特别是当查询变得复杂时。

1. WITH RECURSIVE - 递归结果集

具体案例:with recursive

  • 问题:
    我们有一个简单的员工表employees,其中包含了员工的ID、姓名、职位和经理ID(表示上级经理的ID)。
    我们想要构建一个CTE来找到某个员工的所有上级经理,直到CEO(假设CEO没有上级经理)。

  • 实现:
    表的结构可能如下:

employees table:
+----+-------+---------+----------+
| id | name  | title   | manager_id |
+----+-------+---------+----------+
| 1  | Alice | CEO     | NULL     |
| 2  | Bob   | Manager | 1        |
| 3  | Carol | Staff   | 2        |
| 4  | Dave  | Staff   | 2        |
| 5  | Eve   | Manager | 1        |
| 6  | Frank | Staff   | 5        |
+----+-------+---------+----------+

我们想要找到员工Carol的所有上级经理。我们可以使用WITH RECURSIVE语句和UNION来构建一个CTE,如下所示:

-- 创建查询过程
WITH RECURSIVE managers_chain AS (-- 非递归部分:找到Carol的直接上级SELECT manager_idFROM employeesWHERE id = 3 -- 假设Carol的ID是3UNION-- 递归部分:找到上级经理的上级,直到CEOSELECT e.manager_idFROM employees eINNER JOIN managers_chain mc ON e.id = mc.manager_idWHERE e.manager_id IS NOT NULL
)-- 查询
SELECT * FROM managers_chain;
  • 解析:
    这个CTE的工作原理如下:
    非递归部分(种子查询)选择了Carol的直接上级的ID。
    递归部分通过UNION与非递归部分合并,它会反复执行,每次都使用前一次查询结果中的manager_id来找到下一级的上级经理,直到达到CEO(即manager_id为NULL)。
    最终,CTE的结果将是一个包含Carol所有上级经理ID的列表。当我们执行SELECT * FROM managers_chain;时,我们将得到以下结果:
manager_id
-----------
2
1

这表示Carol的直接上级是Bob(ID为2),Bob的上级是Alice(ID为1),即CEO。

2. UNION

UNION 是 SQL(结构化查询语言)中的一个操作符,用于合并两个或多个 SELECT 语句的结果集。这些 SELECT 语句必须选择相同数量的列,并且这些列的数据类型也必须相似或兼容。UNION 会自动去除重复的行,而如果你想要包含重复的行,可以使用 UNION ALL。

基本语法:

SELECT column_name(s) FROM table1  
UNION  
SELECT column_name(s) FROM table2;

案例:
假设我们有两个表,employees_ny 和 employees_sf,分别存储纽约和旧金山的员工信息。这两个表的结构是相同的,都有 id、name 和 salary 三个字段。

  • 表结构

employees_ny 表:

id	name	salary
1	Alice	5000
2	Bob	6000
3	Carol	5500

employees_sf 表:

id	name	salary
4	Dave	7000
5	Eve	5000
6	Frank	6500
  • 问题:
    如果我们想要查询纽约和旧金山所有工资超过 5000 的员工,并合并结果,可以使用 UNION:
SELECT name, salary FROM employees_ny WHERE salary >= 5000  
UNION  
SELECT name, salary FROM employees_sf WHERE salary >= 5000;

注:
结果集可能如下(注意结果中的 “Alice” 和 “Eve” 工资都是 5000,但由于 UNION 会去除重复行,所以 “Alice” 只会出现一次):

  • 结果:
name	salary
Bob	6000
Carol	5500
Dave	7000
Eve	5000
Frank	6500

如果你想要保留所有行,包括重复的行,可以使用 UNION ALL:

SELECT name, salary FROM employees_ny WHERE salary >= 5000  
UNION ALL  
SELECT name, salary FROM employees_sf WHERE salary >= 5000;

这样,“Alice” 将会在两次结果中都出现,因为 UNION ALL 不会去除重复的行。

3. 持续更新中…

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

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

相关文章

Kerberos-梳理

服务端: yuminstall-ykrb5-server vim/var/kerberos/krb5kdc/kdc.conf [kdcdefaults] kdc_ports=88 kdc_tcp_ports=88 [realms] HADOOP.COM={#master_key_type=aes256-cts acl_file=/var/kerberos/krb5kdc/kadm5.acl dict_file=/usr/share/dict/words admin_keytab=/var/kerbe…

英伟达解码性能NVDEC

如果你能打开官网,请看这里: NVDEC Application Note 下面是摘录:

STL---排序模板参数

map 对map进行排序 首先一定要注意map模板类的第三个模板参数&#xff0c;这个参数决定元素按键值升序或者降序在map中的存储方式&#xff1a; 默认&#xff1a;less<key>升序----- < -----第一个小于取第一个 可设置&#xff1a;greater<key>降序-------…

VC 编程开发中的 封装类 :log日志类 和SQL server 操作类 源代码

VC 编程开发中的 封装类 &#xff1a;日志类 和SQL server 操作类 源代码 在VC&#xff08;Visual C&#xff09;开发中&#xff0c;日志文件输出是一个至关重要的环节&#xff0c;它对于程序调试、问题排查以及系统监控等方面都具有不可替代的作用。以下是对日志文件输出在VC开…

ASP.NET仪器设备管理系统设计与实现

摘 要 文中以某中小型企业的设备管理为例&#xff0c;对设备管理系统的设计与应用进行研究&#xff0c;旨在通过设备管理系统提高内部设备的利用率及实现其最大的经济效益。文中首先对设备管理的现状及其重要性进行了分析&#xff0c;分析实现设备管理信息系统的必要性与可行…

如何在windows server下安装mysql5.7数据库,并使用Navicat Premium 15可视化工具新建数据库并读取数据库信息。

如何在windows server下安装mysql5.7数据库&#xff1f; MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/点击↑&#xff0c;然后选择对应版本和平台↓下载 将下载后的安装包放入固定目录&#xff08;这里以D:…

AI学习指南概率论篇-随机变量和随机过程

AI学习指南概率论篇-随机变量和随机过程 随机变量和随机过程是概率论中重要的概念&#xff0c;也是在人工智能领域中经常应用的概念。本文将介绍随机变量和随机过程的概述&#xff0c;它们在AI中的使用场景&#xff0c;定义和意义&#xff0c;以及相关的公式讲解&#xff0c;并…

蓝桥杯备战17.bitset砝码称重

P2347 [NOIP1996 提高组] 砝码称重 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) bitset 用来存储二进制 #include<bits/stdc.h> using namespace std; #define endl \n #define int long long const int N 2e510; int w[] {0,1,2,3,5,10,20}; signed main() {std…

电商选品的数据是可以用爬虫进行采集的吗?

在电子商务领域&#xff0c;选品是一个至关重要的环节&#xff0c;它直接影响到商家的销售业绩和市场竞争力。为了做出更明智的选品决策&#xff0c;商家需要获取大量的市场数据和产品信息。那么&#xff0c;电商选品的数据是否可以通过爬虫进行采集呢&#xff1f; 爬虫在电商数…

更适合户外使用的开放式耳机,佩戴舒适音质悦耳,虹觅HOLME NEO体验

随着气温的逐渐升高&#xff0c;不管是在室内工作娱乐&#xff0c;还是到户外运动健身&#xff0c;戴上一款合适的耳机都会帮我们隔绝燥热与烦闷&#xff0c;享受音乐与生活。现在市面上的耳机类型特别多&#xff0c;我很喜欢那种分体式的开放耳机&#xff0c;感觉这种耳机设计…

亚信安慧AntDB:颠覆传统的开放创新数据库生态

亚信安慧AntDB是亚信科技自主研发的一款颠覆传统的开放创新数据库产品。它引入了分布式架构&#xff0c;通过数据的弹性伸缩、 容灾容错和负载均衡等技术手段&#xff0c;实现了高性能、高可靠性和高可扩展性的数据存储和处理能力。不仅如此&#xff0c;亚信安慧 AntDB还具备…

从头开始学Spring—02基于XML管理bean

目录 1.实验一&#xff1a;入门案例 2.实验二&#xff1a;获取bean 3.实验三&#xff1a;依赖注入之setter注入 4.实验四&#xff1a;依赖注入之构造器注入 5.实验五&#xff1a;特殊值处理 6.实验六&#xff1a;为类类型属性赋值 7.实验七&#xff1a;为数组类型属性赋值…

掌握决策之道:层次分析法(AHP)的步骤、应用与局限性

目录 一、层次分析法简介 举一个小例子&#xff1a; 评价类问题可用打分解决&#xff0c;比如&#xff1a;小华高考结束后&#xff0c;在华科和武大两所学校之间做抉择。 评价类问题可用打分解决 二、层次分析法的步骤 &#xff08;一&#xff09;一道引出层次分析法的例…

如何在创建之前检测 Elasticsearch 将使用哪个索引模板

作者&#xff1a;来自 Elastic Musab Dogan 概述 Elasticsearch 提供两种类型的索引模板&#xff1a;旧&#xff08;legacy&#xff09;索引模板和可组合 (composable) 索引模板。 Elasticsearch 7.8 中引入的可组合模板旨在替换旧模板&#xff0c;两者仍然可以在 Elasticsear…

深入理解MVCC与Read View:并发控制的关键要素

MVCC MVCC的几个问题1.update、insert、select和delete如何在MVCC中维护版本链&#xff1f;2.select读取&#xff0c;是读取最新的版本呢&#xff1f;还是读取历史版本&#xff1f;3.当前读和快照读4.那为什么要有隔离级别呢&#xff1f;5.如何保证&#xff0c;不同的事务&…

【go从入门到精通】golang单元测试

单元测试 随着软件开发变得越来越复杂,确保服务按预期运行至关重要。实现这一目标的方法之一是通过测试。在Go中,我们可以进行单元测试和集成测试,以确保我们的代码正确并满足要求。单元测试的最终目标是断言一小部分逻辑“单元”的行为符合预期。我们通过在测试中调用该函数…

Nginx - 配置文件结构(一)

安装Nginx 以 Ubuntu 为例&#xff0c;安装命令为 sudo apt install nginx常用指令 # 检查配置文件是否有问题 nginx -t# 热加载配置文件 nginx -s reload# 等待处理完当前请求并退出 nginx -s quit# 快速退出 nginx -s stop目录结构 nginx 默认安装位置一般在 /etc/nginx …

组件通信总结

组件通信是前端开发中的一个重要概念&#xff0c;它指的是组件之间通过某种方式来传递信息以达到某个目的。以下是对组件通信的总结&#xff1a; 一、组件间通信的分类 父子组件间通信&#xff1a;这是最常见的组件通信场景&#xff0c;主要使用自定义属性&#xff08;props&…

Automa:一键自动化,网页数据采集与工作流程优化专家

Automa&#xff1a;解锁自动化浏览器潜能&#xff0c;赋能工作效率&#xff0c;让复杂任务变得简单- 精选真开源&#xff0c;释放新价值。 概览 Automa是一款创新的网页自动化工具&#xff0c;专为寻求提升工作效率、简化数据收集过程的现代工作者设计。它融合了先进的数据抓取…

模板:vector(顺序表容器)

1.构造函数 explicit vector (const allocator_type& alloc allocator_type()); //默认构造函数explicit vector (size_type n, const value_type& val value_type(),const allocator_type& alloc allocator_type()); //n个重复的valtemplate <class Input…