PostgreSQL 函数功能深入解析及代码样例

PostgreSQL 是一个功能强大的开源对象关系数据库系统,它提供了丰富的函数功能,用于对数据库中的数据进行各种操作和处理。本文将深入解析 PostgreSQL 的函数功能,包括内置函数、聚合函数、窗口函数等,并通过代码样例展示它们的具体应用。

内置函数

PostgreSQL 的内置函数包括数学函数、字符串函数、日期时间函数等,它们用于执行基本的计算和数据处理。

数学函数

数学函数用于执行数值计算,如绝对值、平方根、对数等。

-- 绝对值  
SELECT abs(-17.4);  -- 结果: 17.4  
  
-- 平方根  
SELECT sqrt(2.0);  -- 结果: 1.4142135623731  
  
-- 立方根  
SELECT cbrt(27.0);  -- 结果: 3  
  
-- 自然对数  
SELECT ln(2.0);  -- 结果: 0.693147180559945  
  
-- 10为底的对数  
SELECT log(100.0);  -- 结果: 2  
  
-- 指定底数的对数  
SELECT log(2.0, 64.0);  -- 结果: 6

字符串函数

字符串函数用于处理文本数据,如连接、截取、转换等。

-- 字符串连接  
SELECT 'Post' || 'greSQL';  -- 结果: PostgreSQL  
  
-- 转换为小写  
SELECT lower('TOM');  -- 结果: tom  
  
-- 转换为大写  
SELECT upper('tom');  -- 结果: TOM  
  
-- 截取子字符串  
SELECT substring('Thomas' FROM 2 FOR 3);  -- 结果: hom  
  
-- 字符串长度  
SELECT length('PostgreSQL');  -- 结果: 10  
  
-- 去除字符串两端的空格  
SELECT trim('  PostgreSQL  ');  -- 结果: PostgreSQL

聚合函数

聚合函数用于对一组值执行计算,并返回单个值。常见的聚合函数包括 COUNT、MAX、MIN、AVG 和 SUM。

-- 计算行数  
SELECT COUNT(*) FROM employees;  
  
-- 查询最大薪资  
SELECT MAX(salary) FROM employees;  
  
-- 查询最小薪资  
SELECT MIN(salary) FROM employees;  
  
-- 计算平均薪资  
SELECT AVG(salary) FROM employees;  
  
-- 计算薪资总和  
SELECT SUM(salary) FROM employees;

窗口函数

窗口函数为数据集中的每一行执行计算,但不同于聚合函数,窗口函数可以保留每行的原始数据,并基于特定的窗口(一组行)计算结果。

-- 计算每个部门的平均薪资  
SELECT depname, empno, salary, AVG(salary) OVER (PARTITION BY depname) AS avg_salary  
FROM empsalary;  
  
-- 计算每个部门内薪资的排名  
SELECT depname, empno, salary, RANK() OVER (PARTITION BY depname ORDER BY salary DESC) AS rank  
FROM empsalary;  
  
-- 计算薪资的累计总和  
SELECT salary, SUM(salary) OVER (ORDER BY salary) AS cumulative_sum  
FROM empsalary;

数组函数

PostgreSQL 支持数组数据类型,并提供了丰富的数组函数来处理数组数据。

-- 创建包含数组的表  
CREATE TABLE features (id serial PRIMARY KEY, data decimal[]);  
  
-- 插入数据  
INSERT INTO features (data) VALUES ('{1, 1, 1}');  
  
-- 查询数组数据  
SELECT data FROM features WHERE id = 1;  
  
-- 更新数组数据  
UPDATE features SET data = '{2, 2, 2}' WHERE id = 1;  
  
-- 聚合数组数据  
SELECT array_agg(data) FROM features;  
  
-- 数组元素求和  
SELECT SUM((SELECT SUM(unnest) FROM unnest(data))) FROM features;

示例:计算欧氏距离

在机器学习和数据科学中,计算向量间的欧氏距离是常见的需求。PostgreSQL 可以通过扩展插件或使用内置函数来实现这一计算。

-- 假设已安装支持向量运算的扩展  
SELECT sqrt(ARRAY[1,1,1]::numeric[] <#> ARRAY[3,3,3]::numeric[]) AS distance;  
  
-- 如果没有特定扩展,可能需要使用自定义SQL实现  
-- 这里仅提供思路,实际实现可能复杂  
SELECT sqrt(SUM((a.element - b.element) * (a.element - b.element)))  
FROM unnest(ARRAY[1,1,1]) WITH ORDINALITY AS a(element, idx)  
JOIN unnest(ARRAY[3,3,3]) WITH ORDINALITY AS b(element, idx) ON a.idx = b.idx;

总结

PostgreSQL 的函数功能非常强大,从基础的数学和字符串函数到复杂的聚合和窗口函数,再到支持数组数据的函数,为数据处理和分析提供了极大的便利。通过本文的深入解析和代码样例,希望读者能够更好地理解和应用 PostgreSQL 的函数功能。