PostgreSQL 常用函数(手把手讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

前言

PostgreSQL 作为一款功能强大的开源关系型数据库,其丰富的内置函数是开发者高效处理数据的核心工具。无论是基础的字符串操作、数值计算,还是复杂的日期时间分析,PostgreSQL 常用函数都能显著提升开发效率。本文将从编程初学者和中级开发者的视角,系统讲解 PostgreSQL 中最常用的核心函数,并通过实际案例和代码示例,帮助读者循序渐进地掌握这些工具的使用逻辑与应用场景。


一、字符串函数:文本处理的瑞士军刀

字符串函数是 PostgreSQL 中最基础且高频使用的工具,它们能够灵活操作文本数据,例如拼接、截取、转换格式等。

1.1 字符串拼接:CONCAT 和 || 运算符

CONCAT 函数和 || 运算符可用于合并多个字符串,尤其适用于生成完整名称或地址。
示例

-- 创建测试表  
CREATE TABLE users (  
    id SERIAL PRIMARY KEY,  
    first_name TEXT,  
    last_name TEXT,  
    email TEXT  
);  

-- 插入测试数据  
INSERT INTO users (first_name, last_name, email)  
VALUES  
('Alice', 'Johnson', 'alice.j@example.com'),  
('Bob', 'Smith', 'bob.s@example.com');  

-- 使用 CONCAT 合并名字和姓氏  
SELECT CONCAT(first_name, ' ', last_name) AS full_name  
FROM users;  
-- 输出:  
-- Alice Johnson  
-- Bob Smith  

1.2 字符串截取与定位:SUBSTRING 和 POSITION

SUBSTRING 可按位置或正则表达式截取子字符串,而 POSITION 可定位字符的起始位置。
示例

-- 提取邮箱的域名部分  
SELECT  
    SUBSTRING(email FROM '@(.*)') AS domain,  -- 使用正则表达式捕获域名  
    POSITION('@' IN email) AS at_position     -- 查找 @ 符号的位置  
FROM users;  
-- 输出:  
-- domain | at_position  
-- example.com | 8  

1.3 字符串转换:UPPER、LOWER 和 LENGTH

UPPERLOWER 用于转换大小写,LENGTH 返回字符串长度。
示例

SELECT  
    email,  
    LOWER(email) AS lowercase_email,  
    LENGTH(email) AS email_length  
FROM users;  

二、数学函数:数值操作的得力助手

数学函数帮助开发者对数值进行精确计算,例如四舍五入、取整、幂运算等。

2.1 常见数学操作:ROUND、CEIL 和 FLOOR

  • ROUND:按指定小数位数四舍五入。
  • CEILFLOOR:向上或向下取整。
    示例
SELECT  
    ROUND(123.456::numeric, 2) AS rounded_value,  -- 123.46  
    CEIL(-2.3) AS ceiling_value,                  -- -2  
    FLOOR(3.9) AS floor_value                     -- 3  
FROM users LIMIT 1;  

2.2 幂运算与平方根:POWER 和 SQRT

示例:计算圆的面积(半径为 5)

SELECT  
    POWER(5, 2) * PI() AS circle_area;  
-- 输出:78.53981633974483  

三、日期与时间函数:时间管理的工具箱

日期时间函数是处理时间戳、计算时间差、提取日期部分的必备工具。

3.1 当前时间与日期:CURRENT_TIMESTAMP 和 NOW()

这两个函数返回当前的日期和时间,常用于记录操作时间。
示例

SELECT  
    CURRENT_TIMESTAMP AS current_time,  
    NOW() AS now_time;  
-- 输出:  
-- current_time | now_time  
-- 2023-10-05 14:30:00.123456+08 | 2023-10-05 14:30:00.123456+08  

3.2 时间差与日期提取:AGE 和 DATE_PART

  • AGE:计算两个日期之间的差异,常用于计算年龄。
  • DATE_PART:提取日期中的年、月、日等部分。
    示例
-- 创建成员表并插入数据  
CREATE TABLE members (  
    id SERIAL PRIMARY KEY,  
    name TEXT,  
    birthdate DATE  
);  

INSERT INTO members (name, birthdate)  
VALUES ('Charlie', '2000-05-15');  

-- 计算年龄  
SELECT  
    name,  
    AGE(birthdate) AS age,  
    DATE_PART('year', AGE(birthdate)) AS age_years  
FROM members;  
-- 输出:  
-- Charlie | 23 years 4 mons | 23  

3.3 时间间隔运算:INTERVAL

示例:计算一周后的日期

SELECT  
    CURRENT_DATE + INTERVAL '7 days' AS next_week_date;  
-- 输出:2023-10-12  

四、条件函数:智能决策的分支工具

条件函数允许根据数据值动态返回结果,例如处理缺失值或分支逻辑。

4.1 条件判断:CASE WHEN

CASE WHEN 类似编程中的 if-else 语句,用于根据条件返回不同值。
示例:根据价格分类商品

-- 创建商品表  
CREATE TABLE products (  
    id SERIAL PRIMARY KEY,  
    name TEXT,  
    price NUMERIC  
);  

INSERT INTO products (name, price)  
VALUES  
('Laptop', 1200),  
('Mouse', 25);  

-- 分类价格等级  
SELECT  
    name,  
    price,  
    CASE  
        WHEN price > 1000 THEN 'High'  
        WHEN price BETWEEN 50 AND 1000 THEN 'Medium'  
        ELSE 'Low'  
    END AS price_category  
FROM products;  
-- 输出:  
-- Laptop | 1200 | High  
-- Mouse | 25 | Low  

4.2 处理缺失值:COALESCE 和 NULLIF

  • COALESCE:返回第一个非 NULL 值。
  • NULLIF:当两值相等时返回 NULL。
    示例
-- 使用 COALESCE 处理缺失的电话号码  
SELECT  
    COALESCE(phone_number, 'N/A') AS contact_info  
FROM users;  

-- 使用 NULLIF 检查重复值  
SELECT  
    NULLIF('apple', 'apple') AS result;  -- 返回 NULL  

五、聚合函数:数据统计的汇总专家

聚合函数对多行数据进行计算并返回单个结果,常用于统计分析。

5.1 基础聚合函数:SUM、AVG、COUNT

示例:计算订单总销售额和平均价格

-- 创建订单表  
CREATE TABLE orders (  
    id SERIAL PRIMARY KEY,  
    product_id INT,  
    sales_amount NUMERIC  
);  

INSERT INTO orders (product_id, sales_amount)  
VALUES  
(1, 1200),  
(2, 200),  
(1, 800);  

-- 统计销售额  
SELECT  
    SUM(sales_amount) AS total_sales,  
    AVG(sales_amount) AS avg_sales  
FROM orders;  
-- 输出:  
-- total_sales | avg_sales  
-- 2200 | 733.333  

5.2 分组统计:GROUP BY 和 HAVING

结合 GROUP BYHAVING 可按条件分组并筛选结果。
示例:按产品分类统计销售额

SELECT  
    product_id,  
    SUM(sales_amount) AS total_sales  
FROM orders  
GROUP BY product_id  
HAVING SUM(sales_amount) > 1000;  
-- 输出:  
-- product_id | total_sales  
-- 1 | 2000  

六、NULL 处理函数:空值管理的艺术

PostgreSQL 中的 NULL 表示“未知值”,需通过特定函数处理以避免逻辑错误。

6.1 替换 NULL 值:COALESCE 的进阶用法

示例:为 NULL 的字段提供默认值

SELECT  
    name,  
    COALESCE(NULL, 'No Value', 'Default') AS result  -- 返回 'No Value'  
FROM members;  

6.2 检测 NULL 值:IS NULL 和 IS NOT NULL

示例:筛选无电话号码的用户

SELECT * FROM users WHERE phone_number IS NULL;  

七、高级函数:面向进阶场景的扩展

7.1 数组函数:ARRAY 和 ARRAY_APPEND

PostgreSQL 支持数组类型,常用函数包括 ARRAY 构建数组、ARRAY_APPEND 添加元素。
示例

SELECT  
    ARRAY[1, 2, 3] AS my_array,  
    ARRAY_APPEND(ARRAY[1, 2], 3) AS extended_array;  

7.2 JSON 函数:JSONB 操作

PostgreSQL 的 JSONB 类型支持丰富的函数,例如 JSONB_ARRAY_ELEMENTS 解析数组。
示例:解析 JSON 数组

SELECT  
    jsonb_array_elements('[{"id":1}, {"id":2}]') AS elements;  

结论

PostgreSQL 常用函数如同数据库的“工具箱”,覆盖从基础操作到复杂分析的全流程场景。通过本文的讲解,读者已掌握了字符串、数学、日期、条件判断等核心函数的使用方法,并通过实际案例理解了它们的实用价值。建议读者在实践中多尝试组合函数,例如将 CASE WHEN 与聚合函数结合,或用 DATE_PART 进行时间维度分析,逐步提升数据处理能力。掌握这些函数不仅能提高代码效率,更能为构建高性能、可维护的数据库应用奠定坚实基础。

最新发布