PostgreSQL 高阶函数详解:全面深入的功能与实用示例
PostgreSQL 高阶函数详解
PostgreSQL 是一款功能强大的开源关系数据库管理系统,以其丰富的功能和高扩展性著称。在数据处理和分析方面,PostgreSQL 提供了一系列高阶函数,可以极大地简化和优化各种复杂操作。本文将详细介绍 PostgreSQL 的高阶函数,涵盖递归查询、数学函数、集合操作符、字符串函数、JSON 函数、时间函数、聚合函数以及地理空间函数。通过全面的示例和详尽的解释,帮助你深入理解和灵活运用这些高阶函数,提高数据处理的效率和效果。
1. 递归查询(Recursive Queries)
递归查询用于处理层次结构数据,如组织结构或目录树。
1.1 WITH RECURSIVE
-
示例: 计算组织结构的所有下属员工。
WITH RECURSIVE org_chart AS (SELECTemployee_id,manager_id,employee_nameFROMemployeesWHEREmanager_id IS NULLUNION ALLSELECTe.employee_id,e.manager_id,e.employee_nameFROMemployees eINNER JOINorg_chart oONe.manager_id = o.employee_id ) SELECT* FROMorg_chart;
解释:
WITH RECURSIVE
:定义递归查询。UNION ALL
:将递归结果与基本结果合并。- 第一部分选择顶级员工(没有经理的员工),第二部分递归地选择所有下属员工。
1.2 LATERAL
-
示例: 使用 LATERAL 展开一个数组。
SELECTemployee,unnest(departments) AS department FROMemployees CROSS JOIN LATERALunnest(departments);
解释:
CROSS JOIN LATERAL
:允许在查询的每一行中引用前面的列。unnest(departments)
:将数组展开成多行。
2. 数学函数(Mathematical Functions)
数学函数用于执行各种数学计算。
2.1 ABS
-
示例: 计算工资的绝对值。
SELECTemployee,salary,ABS(salary) AS abs_salary FROMemployees;
解释:
ABS(salary)
计算工资的绝对值。
2.2 ROUND
-
示例: 将工资四舍五入到最近的整数。
SELECTemployee,salary,ROUND(salary) AS rounded_salary FROMemployees;
解释:
ROUND(salary)
将工资四舍五入到最近的整数。
2.3 CEIL
和 FLOOR
-
示例: 计算工资的天花板值和地板值。
SELECTemployee,salary,CEIL(salary) AS ceil_salary,FLOOR(salary) AS floor_salary FROMemployees;
解释:
CEIL(salary)
:向上取整工资。FLOOR(salary)
:向下取整工资。
2.4 POWER
-
示例: 计算工资的平方。
SELECTemployee,salary,POWER(salary, 2) AS salary_squared FROMemployees;
解释:
POWER(salary, 2)
计算工资的平方。
2.5 SQRT
-
示例: 计算工资的平方根。
SELECTemployee,salary,SQRT(salary) AS salary_sqrt FROMemployees;
解释:
SQRT(salary)
计算工资的平方根。
2.6 RANDOM
-
示例: 生成一个随机数。
SELECTemployee,salary,RANDOM() AS random_value FROMemployees;
解释:
RANDOM()
生成一个 0 到 1 之间的随机浮点数。
2.7 TRUNC
-
示例: 截断工资到小数点后的指定位置。
SELECTemployee,salary,TRUNC(salary, 2) AS truncated_salary FROMemployees;
解释:
TRUNC(salary, 2)
将工资截断到小数点后 2 位。
3. 集合操作符(Set Operators)
集合操作符用于处理和组合结果集。
3.1 UNION
-
示例: 合并两个不同部门的员工列表。
SELECTemployee_name FROMemployees WHEREdepartment = 'Sales' UNION SELECTemployee_name FROMemployees WHEREdepartment = 'Marketing';
解释:
UNION
合并两个结果集,并自动去重。
3.2 UNION ALL
-
示例: 合并两个部门的员工列表,包括重复的员工。
SELECTemployee_name FROMemployees WHEREdepartment = 'Sales' UNION ALL SELECTemployee_name FROMemployees WHEREdepartment = 'Marketing';
解释:
UNION ALL
合并两个结果集,包括重复的行。
3.3 INTERSECT
-
示例: 查找两个部门共有的员工。
SELECTemployee_name FROMemployees WHEREdepartment = 'Sales' INTERSECT SELECTemployee_name FROMemployees WHEREdepartment = 'Marketing';
解释:
INTERSECT
返回两个结果集的交集。
3.4 EXCEPT
-
示例: 查找只在销售部门工作的员工,不在市场部门工作的员工。
SELECTemployee_name FROMemployees WHEREdepartment = 'Sales' EXCEPT SELECTemployee_name FROMemployees WHEREdepartment = 'Marketing';
解释:
EXCEPT
返回第一个结果集中的行,但不在第二个结果集中出现的行。
4. 窗口函数(Window Functions)
窗口函数用于对结果集的一个窗口进行计算,而不会改变结果集的行数。
4.1 ROW_NUMBER
-
示例: 给每个员工分配一个唯一的序号。
SELECTemployee_name,salary,ROW_NUMBER() OVER (ORDER BY salary DESC) AS row_num FROMemployees;
解释:
ROW_NUMBER() OVER (ORDER BY salary DESC)
为员工按工资降序排序并分配一个唯一的序号。
4.2 RANK
-
示例: 给每个员工分配一个排名,处理重复值时赋相同排名。
SELECTemployee_name,salary,RANK() OVER (ORDER BY salary DESC) AS rank FROMemployees;
解释:
RANK() OVER (ORDER BY salary DESC)
为员工按工资降序排序并分配排名,处理重复值时赋相同排名。
4.3 DENSE_RANK
-
示例: 与
RANK
类似,但没有排名的空缺。SELECTemployee_name,salary,DENSE_RANK() OVER (ORDER BY salary DESC) AS dense_rank FROMemployees;
解释:
DENSE_RANK() OVER (ORDER BY salary DESC)
为员工按工资降序排序并分配排名,处理重复值时不跳过排名。
4.4 NTILE
-
示例: 将员工分为四组,并为每个组分配一个组号。
SELECTemployee_name,salary,NTILE(4) OVER (ORDER BY salary DESC) AS quartile FROMemployees;
解释:
NTILE(4) OVER (ORDER BY salary DESC)
将员工按工资降序排序并分为四组。
4.5 LEAD
和 LAG
-
示例: 比较当前工资与下一个员工工资的差异。
SELECTemployee_name,salary,LEAD(salary, 1) OVER (ORDER BY salary) AS next_salary,LAG(salary, 1) OVER (ORDER BY salary) AS prev_salary FROMemployees;
解释:
LEAD(salary, 1)
:返回当前行之后指定偏移量的值。LAG(salary, 1)
:返回当前行之前指定偏移量的值。
5. 字符串函数(String Functions)
字符串函数用于处理和操作文本数据。
5.1 CONCAT
-
示例: 将名字和姓氏连接在一起。
SELECTCONCAT(first_name, ' ', last_name) AS full_name FROMemployees;
解释:
CONCAT(first_name, ' ', last_name)
将名字和姓氏连接在一起。
5.2 TRIM
-
示例: 去掉名字中的多余空格。
SELECTTRIM(employee_name) AS trimmed_name FROMemployees;
解释:
TRIM(employee_name)
去掉名字中的前后空格。
5.3 SUBSTRING
-
示例: 提取员工名字的前两个字符。
SELECTemployee_name,SUBSTRING(employee_name FROM 1 FOR 2) AS name_prefix FROMemployees;
解释:
SUBSTRING(employee_name FROM 1 FOR 2)
提取员工名字的前两个字符。
5.4 REPLACE
-
示例: 替换名字中的中间名。
SELECTemployee_name,REPLACE(employee_name, 'MiddleName', 'NewMiddleName') AS updated_name FROMemployees;
解释:
REPLACE(employee_name, 'MiddleName', 'NewMiddleName')
替换名字中的中间名。
6. JSON 函数(JSON Functions)
JSON 函数用于处理 JSON 数据类型。
6.1 JSON_AGG
-
示例: 聚合员工数据为 JSON 数组。
SELECTJSON_AGG(employee) AS employees_json FROMemployees;
解释:
JSON_AGG(employee)
聚合员工数据为 JSON 数组。
6.2 JSON_BUILD_OBJECT
-
示例: 将员工信息构建为 JSON 对象。
SELECTJSON_BUILD_OBJECT('employee_name', employee_name,'salary', salary) AS employee_json FROMemployees;
解释:
JSON_BUILD_OBJECT
将员工信息构建为 JSON 对象。
6.3 JSONB_SET
-
示例: 更新 JSONB 列中的字段。
UPDATEemployees SETdetails = JSONB_SET(details, '{salary}', '60000') WHEREemployee_id = 1;
解释:
JSONB_SET(details, '{salary}', '60000')
更新 JSONB 列中的工资字段。
7. 时间函数(Date and Time Functions)
时间函数用于处理日期和时间数据。
7.1 AGE
-
示例: 计算员工从某日期起的年龄。
SELECTemployee_name,AGE(hire_date) AS age FROMemployees;
解释:
AGE(hire_date)
计算员工从雇佣日期起的年龄。
7.2 DATE_TRUNC
-
示例: 将日期截断到月份级别。
SELECTDATE_TRUNC('month', hire_date) AS start_of_month FROMemployees;
解释:
DATE_TRUNC('month', hire_date)
将日期截断到月份的开始。
7.3 NOW
和 CURRENT_TIMESTAMP
-
示例: 获取当前日期和时间。
SELECTNOW() AS current_time,CURRENT_TIMESTAMP AS current_timestamp;
解释:
NOW()
:获取当前日期和时间。CURRENT_TIMESTAMP
:获取当前日期和时间。
8. 聚合函数(Aggregate Functions)
聚合函数用于对数据集进行汇总。
8.1 SUM
-
示例: 计算员工的总工资。
SELECTSUM(salary) AS total_salary FROMemployees;
解释:
SUM(salary)
计算员工的总工资。
8.2 AVG
-
示例: 计算员工的平均工资。
SELECTAVG(salary) AS average_salary FROMemployees;
解释:
AVG(salary)
计算员工的平均工资。
8.3 COUNT
-
示例: 计算员工的总数。
SELECTCOUNT(*) AS employee_count FROMemployees;
解释:
COUNT(*)
计算员工的总数。
8.4 GROUP_CONCAT
-
示例: 计算每个部门的员工名字列表。
SELECTdepartment,STRING_AGG(employee_name, ', ') AS employee_names FROMemployees GROUP BYdepartment;
解释:
STRING_AGG(employee_name, ', ')
连接每个部门的员工名字。
9. 地理空间函数(Geospatial Functions)
地理空间函数用于处理地理数据。
9.1 ST_Distance
-
示例: 计算两个地理点之间的距离。
SELECTST_Distance(ST_MakePoint(longitude1, latitude1),ST_MakePoint(longitude2, latitude2)) AS distance FROMlocations;
解释:
ST_Distance
计算两个地理点之间的距离。
9.2 ST_Within
-
示例: 查找位于某区域内的点。
SELECTlocation_name FROMlocations WHEREST_Within(ST_MakePoint(longitude, latitude),ST_MakePolygon(geometry));
解释:
ST_Within
检查点是否在多边形区域内。
总结
本文详细介绍了 PostgreSQL 的各种高阶函数,涵盖了递归查询、数学函数、集合操作符、字符串函数、JSON 函数、时间函数、聚合函数以及地理空间函数。每个类别下的函数都配有详细的示例代码和解释,以帮助你更好地理解和应用这些功能。通过掌握这些高阶函数,你可以更高效地处理和分析数据,满足复杂的数据处理需求。无论是处理层次结构数据、进行数学计算、操作字符串、管理 JSON 数据、处理时间和日期、进行数据汇总,还是处理地理空间数据,PostgreSQL 的高阶函数都能为你提供强大的支持。希望本文能成为你深入了解和使用 PostgreSQL 的重要参考资料。
相关文章:
PostgreSQL 高阶函数详解:全面深入的功能与实用示例
PostgreSQL 高阶函数详解 PostgreSQL 是一款功能强大的开源关系数据库管理系统,以其丰富的功能和高扩展性著称。在数据处理和分析方面,PostgreSQL 提供了一系列高阶函数,可以极大地简化和优化各种复杂操作。本文将详细介绍 PostgreSQL 的高阶…...

Redis——集合 SET
目录 1. 添加元素 SADD 2. 查看元素 SMEMBERS 3. 判断元素是否存在该集合 SISMEMBER 4. 删除元素 SREM 集合 SET 是一种无序集合;因此其与列表有以下区别: (1)列表是有序的,集合是无序的; ࿰…...

openEuler安装docker
1.下载地址 搜索docker 寻找docker-ce 复制地址 2.配置仓库 [rootlocalhost yum.repos.d]# pwd /etc/yum.repos.d [rootlocalhost yum.repos.d]# vim docker-ce.repo [docker-ce] namedocker baseurlhttps://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable/ gpgche…...
每天一个数据分析题(四百六十五)- 缺失值
某连续型变量的数据集存在缺失值,可以采用哪种方法处理? A. 插值法填补 B. EM算法填补 C. 随机森林填补 D. 以上均不对 数据分析认证考试介绍:点击进入 题目来源于CDA模拟题库 点击此处获取答案 数据分析专项练习题库 内容涵盖Pytho…...

干货 | 变频器的详细介绍
变频器简述 变频器是电机控制领域中常见的一种设备,也称变频调节器,是一种将固定频率的交流电转换为可调频率的交流电的电力电子设备,用于控制交流电机的转速和输出功率。变频器通过调节输出电源的电压和频率,从而控制电动机的转速…...

Linux线程2
线程相关函数 线程分离--pthread_detach(后面会详细讲) 函数原型:int pthread_datach(pthread_t thread); 调用该函数之后不需要 pthread_join 子线程会自动回收自己的PCB 杀死(取消)线程--pthread_cancel 取…...

乱弹篇(40)人类追求长寿
不要认为只有中国的老龄化才严重,实际上全球都面临老龄化,其中日本最为严重。 这是随着人类生活和医学水平的不断提高,寿命才会比过去数十年有了大幅度的提升。据资料显示,目前全球平均预期寿命估计为73岁。与百年之前相比&#…...

技术详解:互联网医院系统源码与医保购药APP的整合开发策略
本篇文章,小编将从系统架构、数据安全、用户体验和技术实现等方面详细探讨互联网医院系统与医保购药APP的整合开发策略。 一、系统架构 1.模块化设计 互联网医院系统与医保购药APP的整合需要采用模块化设计。 2.微服务架构 每个功能模块作为一个独立的微服务&am…...

N4 - Pytorch实现中文文本分类
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目录 任务描述步骤环境设置数据准备模型设计模型训练模型效果展示 总结与心得体会 任务描述 在上周的任务中,我们使用torchtext下载了托管的英文的…...
centos 如何安装sox音视频处理工具
要在 CentOS 系统上安装 Sox 音频处理软件,你可以遵循以下步骤。请注意,这些说明适用于 CentOS 7,对于 CentOS 8 及更高版本,某些包管理命令可能略有不同。 第一步:安装所需的依赖库 首先,你需要安装一系列…...

Java语言程序设计——篇十一(2)
🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳&…...

Linux 应急响应靶场练习 1
靶场在知攻善防实验室公众号中可以获取 前景需要:小王急匆匆地找到小张,小王说"李哥,我dev服务器被黑了",快救救我!! 挑战内容: (1)黑客的IP地址 (2࿰…...

AWS-Lambda的使用
介绍 Lambda 是一种无服务器(Serverless), 而且设计成事件驱动的计算服务器. 简单来说, 你可以将你的 code 上传, 当有事件产生(例如cronjob , 或者S3有新的文件被上传上來) , 你的code 就会在瞬间(零点几秒以內)被叫起來执行. 由于你不用管 Server如何维护, 或者自动扩展之类…...
python3.12 搭建MinerU 环境遇到的问题解决
报错: AttributeError: module pkgutil has no attribute ImpImporter. Did you mean: zipimporter? ERROR: Exception: Traceback (most recent call last):File "D:\ipa_workspace\MinerU\Lib\site-packages\pip\_internal\cli\base_command.py", …...

基于SpringBoot+Vue的流浪猫狗救助救援网站(带1w+文档)
基于SpringBootVue的流浪猫狗救助救援网站(带1w文档) 基于SpringBootVue的流浪猫狗救助救援网站(带1w文档) 该流浪猫狗救助救援网站在Windows平台下完成开发,采用java编程语言开发,将应用程序部署于Tomcat上,加之MySQL接口来实现交互式响应服…...
56_AOP
AOP使用案例 如何进行数据库和Redis中的数据同步?/ 你在项目的那些地方使用了aop?答:可以通过Aop操作来实现数据库和Redis中的数据同步。/ 通过Aop操作来实现数据库和Redis中的数据同步。可以定义一个切面类,通过对控制器下的所有…...
安装了h5py,使用报错ImportError: DLL load failed while importing _errors
使用pip 安装了h5py,但是运行代码报错; from . import _errorsImportError: DLL load failed while importing _errors: 找不到指定的程序。 原因: 可能和不正确安装h5py这个包有关系 解决: pip uninstall h5py 换成使用conda…...

BootStrap前端面试常见问题
在前端面试中,关于Bootstrap的问题通常围绕其基本概念、使用方式、特性以及实际应用等方面展开。以下是一些常见的问题及其详细解答: 1. Bootstrap是哪家公司研发的? 回答:Bootstrap是由Twitter的Mark Otto和Jacob Thornton合作…...

在linux运维中为什么第一道防线是云防火墙,而不是waf
在Linux运维和云计算环境中,第一道防线通常是云防火墙(Cloud Firewall),而不是Web应用防火墙(WAF),主要是因为云防火墙提供了更基础和广泛的网络层安全控制。以下是一些关键原因: 1…...
2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛
2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛 2024.8.2 12:00————16:00 过题数790/1500 补题数943.33/1500 AB Problem Komorebi的数学课 次佛锅 Setsuna的K数列 Wiki下象棋 黄金律法 天气预报 叠硬币 AB Problem ag…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...