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…...
多语言海外AEON抢单可连单加额外单源码,java版多语言抢单系统
多语言海外AEON抢单可连单加额外单源码,java版多语言抢单系统。此套是全新开发的java版多语言抢单系统。 后端java,用的若依框架,这套代码前后端是编译后的,测试可以正常使用,语言繁体,英文,日…...
文件上传——springboot大文件分片多线程上传功能,前端显示弹出上传进度框
一、项目搭建 创建 Spring Boot 项目: 创建一个新的 Spring Boot 项目,添加 Web 依赖。 添加依赖: 在 pom.xml 文件中添加以下依赖: <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId&…...
每日学术速递8.2
1.A Scalable Quantum Non-local Neural Network for Image Classification 标题: 用于图像分类的可扩展量子非局部神经网络 作者: Sparsh Gupta, Debanjan Konar, Vaneet Aggarwal 文章链接:https://arxiv.org/abs/2407.18906 摘要&#x…...
SAP-PLM创建物料主数据接口
FUNCTION zplm_d_0001_mm01. *"---------------------------------------------------------------------- *"*"本地接口: *" EXPORTING *" VALUE(EX_TOTAL) TYPE CHAR4 *" VALUE(EX_SUCCESSFUL) TYPE CHAR4 *" …...
超声波眼镜清洗机哪个品牌好?四款高性能超声波清洗机测评剖析
对于追求高生活质量的用户来说,眼镜的清洁绝对不能马虎。如果不定期清洁眼镜,时间久了,镜片的缝隙中会积累大量的灰尘和细菌,眼镜靠近眼部,对眼部健康有很大影响。在这种情况下,超声波清洗机显得尤为重要。…...
卸载Windows软件的正确姿势,你做对了吗?
前言 今天有小伙伴突然问我:她把软件都卸载了,但是怎么软件都还在运行? 这个问题估计很多小伙伴都是遇到过的,对于电脑小白来说,卸载Windows软件真的真的真的是一件很难的事情。所以,今天咱们就来讲讲&am…...
WEB前端14-Element UI(学生查询表案例/模糊查询/分页查询)
Vue2-Element UI 1.可重用组件的开发 可重用组件 我们一般将可重复使用的组件放在components目录之下,以便父组件的灵活调用 <!--可重用组件一般与css密切相关,使用可重用组件的目的是,将相似的组件放在一起,方便使用-->…...
使用swiftui自定义圆形进度条实现loading
实现的代码如下: // // LoadingView.swift // SwiftBook // // Created by Song on 2024/8/2. //import SwiftUIstruct LoadingView: View {State var process 0.5var body: some View {VStack(spacing: 20) {ZStack {Circle().stroke(.gray.opacity(0.3), lin…...
C# 设计模式之抽象工厂模式
总目录 前言 工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码,而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性。但是在现实生活中,…...
Javascript前端面试基础(八)
window.onload和$(document).ready区别 window.onload()方法是必须等到页面内包括图片的所有元素加载完毕后才能执行$(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕 window.onload 触发时机:window.onload 事件会在整个页面…...
网站色差表/软文代写公司
晚上帮同事解决一个merge问题的时候,发现了我去年在上一家公司时候写的一篇非常不错的关于git的文章,分享出来,有助于更加高效地使用git。 (1)配置lg2 git默认的日志查看命令是“git log”,界面显示如下&am…...
网站搭建是哪个岗位做的事儿/福州百度关键词排名
关于先序遍历、中序遍历、后序遍历的定义可以参考这篇博客二叉树的遍历规则。 目前能够百度到的问题大多都是根据(先序&中序)或(中序&后序)序列构建唯一二叉树,其中贴出一些提供思路的博客:二叉树…...
wordpress编辑器不能用/日本网站源码
我在C#中编写了一个应用程序来自动登录到网页.只要Admin运行可执行文件,它就能完美运行.每当非管理员运行项目时,就好像IEDriver.exe没有启动一样.从组策略启动IEDriver.exe没有任何限制.private IWebDriver _driver;public void SetUp(){InternetExplorerOptions options new…...
做网站南宁/什么是网络营销
C语言每天提供专门的字符串类型,需要通过字符数组才能对字符串进行存储和处理。在标准C中,字符串类由C STL实现。string是一个基于字符的序列容器,具有vector向量一样的内部线性结构,字符逐一写入容器,最后以null字符结…...
做企业网站的步骤/东莞seo优化
今天晕晕沉沉的创建一个JOB,用PLSQL图形化界面没成功,SQL语句也没成果,最后发现竟然是job变量未定义,留个坑在这里…… SQL> begin 2 sys.dbms_job.submit(job > :job, 3 what > proc_export_containers;, 4…...
上海网站建设领导品牌/广东企业网站seo哪里好
不等待即关注简介硫化天然橡胶是一种非线性材料,具有低剪切模量、低弹性模量、几乎不可压缩和断裂伸长率高的特点。典型的橡胶单轴拉伸应力应变曲线如下图所示,我们可以通过宏观单元对于橡胶支座进行模拟,详情请看(【JY】基于Rmbe…...