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…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
