PostgreSQL常用函数用法

在PostgreSQL中,函数是处理和操作数据的强大工具。以下是一些常用函数的用法示例。


1. 字符串函数

字符串函数用于操作和处理文本数据,常见操作包括字符串连接、截取、替换、转换大小写等。

  • LENGTH: 返回字符串的长度。
    -- 查询语句
    SELECT LENGTH('PostgreSQL') AS string_length;
    
    -- 结果
    string_length 
    --------------
    10
    
  • CONCAT: 将多个字符串连接为一个字符串。
-- 查询语句
SELECT CONCAT('Postgre', 'SQL') AS full_string;

-- 结果
full_string 
-------------
PostgreSQL
  • SUBSTRING: 从指定字符串中提取子字符串。
-- 查询语句
SELECT SUBSTRING('PostgreSQL', 1, 6) AS short_string;

-- 结果
short_string 
--------------
Postgre
  • REPLACE: 将字符串中的子字符串替换为另一个字符串。
-- 查询语句
SELECT REPLACE('PostgreSQL', 'SQL', 'DB') AS replaced_string;

-- 结果
replaced_string 
-----------------
PostgreDB
  • UPPER: 将字符串转换为大写。

    -- 查询语句
    SELECT UPPER('postgresql') AS upper_string;
    
    -- 结果
    upper_string 
    --------------
    POSTGRESQL
    
  • LOWER: 将字符串转换为小写。

    -- 查询语句
    SELECT LOWER('PostgreSQL') AS lower_string;
    
    -- 结果
    lower_string 
    --------------
    postgresql
    
  • TRIM: 删除字符串开头和结尾的空白或指定字符。

    -- 查询语句
    SELECT TRIM(BOTH ' ' FROM '  PostgreSQL  ') AS trimmed_string;
    
    -- 结果
    trimmed_string 
    ----------------
    PostgreSQL
    
  • POSITION: 查找子字符串在另一个字符串中的位置(起始位置)。

    -- 查询语句
    SELECT POSITION('SQL' IN 'PostgreSQL') AS substring_position;
    
    -- 结果
    substring_position 
    --------------------
    8
    

2. 日期和时间函数

日期和时间函数用于处理日期、时间和时间戳数据,支持时间差计算、格式化输出、提取特定时间部分等。

  • CURRENT_DATE: 返回当前日期。

    -- 查询语句
    SELECT CURRENT_DATE AS today;
    
    -- 结果
    today
    ------------
    2024-09-03
    
  • CURRENT_TIME: 返回当前时间(不包含日期)。

    -- 查询语句
    SELECT CURRENT_TIME AS now_time;
    
    -- 结果
    now_time  
    -------------
    14:30:00
    
  • CURRENT_TIMESTAMP: 返回当前日期和时间(带有时区信息)。

    -- 查询语句
    SELECT CURRENT_TIMESTAMP AS current_datetime;
    
    -- 结果
    current_datetime
    -----------------------
    2024-09-03 14:30:00+00
    
  • DATE_TRUNC: 截断日期或时间戳,保留指定的时间单位(如年、月、日)。

    -- 查询语句
    SELECT DATE_TRUNC('month', NOW()) AS month_start;
    
    -- 结果
    month_start
    ----------------------
    2024-09-01 00:00:00
    
  • EXTRACT: 从日期或时间戳中提取特定部分(如年、月、日、小时等)。

    -- 查询语句
    SELECT EXTRACT(YEAR FROM CURRENT_DATE) AS current_year;
    
    -- 结果
    current_year 
    --------------
    2024
    
  • AGE: 计算两个时间戳之间的差值,并以年、月、日的形式显示。

    -- 查询语句
    SELECT AGE('2020-01-01') AS time_diff;
    
    -- 结果
    time_diff
    ------------------
    4 years 8 mons
    
  • TO_CHAR: 将日期或数字转换为指定格式的字符串。

    -- 查询语句
    SELECT TO_CHAR(NOW(), 'YYYY-MM-DD') AS formatted_date;
    
    -- 结果
    formatted_date
    ----------------
    2024-09-03
    
  • DATE_PART: 类似于EXTRACT,用于提取日期或时间戳的特定部分,以浮点数形式返回。

    -- 查询语句
    SELECT DATE_PART('hour', CURRENT_TIMESTAMP) AS current_hour;
    
    -- 结果
    current_hour
    --------------
    14
    

3. 数学函数

数学函数用于数值计算,包括四舍五入、取整、求平方根等操作,适用于统计分析、财务计算等场景。

  • ROUND: 对数字进行四舍五入,保留指定的小数位数。

    -- 查询语句
    SELECT ROUND(123.456, 2) AS rounded_value;
    
    -- 结果
    rounded_value 
    ---------------
    123.46
    
  • FLOOR: 返回小于或等于给定数值的最大整数。

    -- 查询语句
    SELECT FLOOR(123.456) AS floor_value;
    
    -- 结果
    floor_value 
    -------------
    123
    
  • CEIL: 返回大于或等于给定数值的最小整数。

    -- 查询语句
    SELECT CEIL(123.456) AS ceil_value;
    
    -- 结果
    ceil_value 
    ------------
    124
    
  • ABS: 返回数值的绝对值。

    -- 查询语句
    SELECT ABS(-123.456) AS absolute_value;
    
    -- 结果
    absolute_value 
    ----------------
    123.456
    
  • MOD: 返回两个数相除的余数。

    -- 查询语句
    SELECT MOD(10, 3) AS remainder;
    
    -- 结果
    remainder 
    -----------
    1
    
  • POWER: 返回指定数值的指定次幂。

    -- 查询语句
    SELECT POWER(2, 3) AS result;
    
    -- 结果
    result 
    --------
    8
    
  • SQRT: 返回数值的平方根。

    -- 查询语句
    SELECT SQRT(16) AS square_root;
    
    -- 结果
    square_root 
    -------------
    4
    
  • EXP: 返回e的指定次幂。

    -- 查询语句
    SELECT EXP(1) AS e_value;
    
    -- 结果
    e_value 
    ---------
    2.71828
    
  • LN: 返回数值的自然对数(底数为e)。

    -- 查询语句
    SELECT LN(2.71828) AS natural_log;
    
    -- 结果
    natural_log 
    -------------
    1.0000067
    
  • LOG: 返回指定基数的对数。

    -- 查询语句
    SELECT LOG(10, 100) AS log_value;
    
    -- 结果
    log_value 
    -----------
    2
    
  • SIGN: 返回数值的符号,正数返回1,负数返回-1,零返回0。

    -- 查询语句
    SELECT SIGN(-123.456) AS sign_value;
    
    -- 结果
    sign_value 
    ------------
    -1
    

4. 控制流函数

控制流函数用于处理NULL值,选择最大值或最小值等。这些函数在处理数据不确定性或条件判断时非常有用。

  • COALESCE: 返回第一个非NULL的值,如果所有值都是NULL,则返回NULL。

    -- 查询语句
    SELECT COALESCE(NULL, NULL, 'default') AS result_value;
    
    -- 结果
    result_value 
    --------------
    default
    
  • GREATEST: 返回提供的多个值中的最大值。

    -- 查询语句
    SELECT GREATEST(10, 20, 30, 15) AS max_value;
    
    -- 结果
    max_value 
    -----------
    30
    
  • LEAST: 返回提供的多个值中的最小值。

    -- 查询语句
    SELECT LEAST(10, 20, 30, 15) AS min_value;
    
    -- 结果
    min_value 
    -----------
    10
    

5. 随机数与序列函数

随机数与序列函数用于生成随机数、自动递增序列等操作,适用于数据采样、模拟测试等场景。

  • RANDOM: 生成一个0到1之间的随机浮点数。

    -- 查询语句
    SELECT RANDOM() AS random_value;
    
    -- 结果
    random_value 
    --------------
    0.345678
    
  • SERIAL: 用于生成自动递增的整数序列,通常用于主键字段。

    -- 查询语句
    CREATE TABLE test_table (
        id SERIAL PRIMARY KEY,
        name VARCHAR(100)
    );
    
    -- 插入数据
    INSERT INTO test_table (name) VALUES ('Alice'), ('Bob');
    
    -- 查询结果
    SELECT * FROM test_table;
    
    -- 结果
    id | name 
    ----+------
    1  | Alice
    2  | Bob
    
  • GENERATE_SERIES: 生成一个指定范围的整数序列。

    -- 查询语句
    SELECT * FROM GENERATE_SERIES(1, 5);
    
    -- 结果
    generate_series 
    ----------------
    1
    2
    3
    4
    5
    

继续对PostgreSQL中的常用函数进行分类讲解,以下是更多的函数类别以及对应的函数用法示例。每个示例都包含了SQL查询语句和预期的查询结果,帮助您更直观地理解这些函数的作用和用法。


6. 聚合函数

聚合函数用于对一组值执行计算并返回单一的结果,常用于统计和数据分析。例如,计算总和、平均值、计数、最大值和最小值等。这些函数在报告生成、数据汇总等场景中非常实用。

  • COUNT: 计算行数或非NULL值的数量。

    -- 查询语句:计算表中员工的总数
    SELECT COUNT(*) AS total_employees FROM employees;
    
    -- 结果
    total_employees
    ----------------
    50
    
  • SUM: 计算数值列的总和。

    -- 查询语句:计算所有员工的工资总和
    SELECT SUM(salary) AS total_salary FROM employees;
    
    -- 结果
    total_salary
    -------------
    500000
    
  • AVG: 计算数值列的平均值。

    -- 查询语句:计算员工工资的平均值
    SELECT AVG(salary) AS average_salary FROM employees;
    
    -- 结果
    average_salary
    ---------------
    10000
    
  • MAX: 返回数值列中的最大值。

    -- 查询语句:获取最高工资
    SELECT MAX(salary) AS highest_salary FROM employees;
    
    -- 结果
    highest_salary
    ---------------
    20000
    
  • MIN: 返回数值列中的最小值。

    -- 查询语句:获取最低工资
    SELECT MIN(salary) AS lowest_salary FROM employees;
    
    -- 结果
    lowest_salary
    --------------
    5000
    
  • STRING_AGG: 将字符串值连接成一个字符串,并使用指定的分隔符。

    -- 查询语句:将所有部门名称连接成一个字符串
    SELECT STRING_AGG(department_name, ', ') AS departments FROM departments;
    
    -- 结果
    departments
    -------------------------------
    Sales, Marketing, HR, IT, Finance
    
  • ARRAY_AGG: 将输入值收集到一个数组中。

    -- 查询语句:将所有员工的姓名收集到一个数组中
    SELECT ARRAY_AGG(employee_name) AS employee_names FROM employees;
    
    -- 结果
    employee_names
    --------------------------------------------
    {Alice,Bob,Charlie,David,Eva,...}
    

7. JSON函数

JSON函数用于在PostgreSQL中处理JSON数据。随着NoSQL和JSON数据格式的流行,PostgreSQL提供了丰富的函数来存储、查询和操作JSON数据,适用于处理复杂和嵌套的数据结构。

  • TO_JSON: 将任意行或数组转换为JSON格式。

    -- 查询语句:将文本转换为JSON格式
    SELECT TO_JSON('PostgreSQL') AS json_value;
    
    -- 结果
    json_value
    ------------
    "PostgreSQL"
    
  • TO_JSONB: 将任意行或数组转换为二进制JSON(JSONB)格式,具有更好的性能。

    -- 查询语句:将数组转换为JSONB格式
    SELECT TO_JSONB(ARRAY[1, 2, 3]) AS jsonb_value;
    
    -- 结果
    jsonb_value
    -------------
    [1, 2, 3]
    
  • JSON_BUILD_OBJECT: 构建一个JSON对象。

    -- 查询语句:创建一个JSON对象表示员工信息
    SELECT JSON_BUILD_OBJECT(
        'id', 1,
        'name', 'Alice',
        'department', 'HR'
    ) AS employee_json;
    
    -- 结果
    employee_json
    -------------------------------------------
    {"id": 1, "name": "Alice", "department": "HR"}
    
  • JSON_EXTRACT_PATH_TEXT: 从JSON对象中提取指定路径的文本值。

    -- 查询语句:从JSON数据中提取员工姓名
    SELECT JSON_EXTRACT_PATH_TEXT('{"id":1,"name":"Alice"}', 'name') AS employee_name;
    
    -- 结果
    employee_name
    --------------
    Alice
    
  • JSONB_AGG: 将多行数据聚合为JSONB数组。

    -- 查询语句:将所有员工信息聚合为JSONB数组
    SELECT JSONB_AGG(
        JSONB_BUILD_OBJECT(
            'id', id,
            'name', name,
            'department', department
        )
    ) AS employees_json
    FROM employees;
    
    -- 结果
    employees_json
    -----------------------------------------------------------------------
    [
      {"id": 1, "name": "Alice", "department": "HR"},
      {"id": 2, "name": "Bob", "department": "IT"},
      ...
    ]
    
  • JSONB_SET: 更新JSONB对象中的指定键值对。

    -- 查询语句:更新员工JSON对象中的部门信息
    SELECT JSONB_SET('{"id":1,"name":"Alice","department":"HR"}', '{department}', '"Finance"') AS updated_json;
    
    -- 结果
    updated_json
    -----------------------------------------------
    {"id": 1, "name": "Alice", "department": "Finance"}
    

8. 数组函数

数组函数用于创建、处理和查询数组类型的数据。在PostgreSQL中,数组是一等公民,可以直接存储和操作多值数据,适用于需要存储列表或集合的场景。

  • ARRAY: 创建一个数组。

    -- 查询语句:创建一个整数数组
    SELECT ARRAY[1, 2, 3, 4, 5] AS number_array;
    
    -- 结果
    number_array
    ----------------
    {1,2,3,4,5}
    
  • ARRAY_APPEND: 向数组末尾添加元素。

    -- 查询语句:在数组末尾添加一个元素
    SELECT ARRAY_APPEND(ARRAY[1, 2, 3], 4) AS updated_array;
    
    -- 结果
    updated_array
    ---------------
    {1,2,3,4}
    
  • ARRAY_PREPEND: 向数组开头添加元素。

    -- 查询语句:在数组开头添加一个元素
    SELECT ARRAY_PREPEND(0, ARRAY[1, 2, 3]) AS updated_array;
    
    -- 结果
    updated_array
    ---------------
    {0,1,2,3}
    
  • UNNEST: 将数组展开为多行。

    -- 查询语句:将数组元素展开为多行
    SELECT UNNEST(ARRAY['Alice', 'Bob', 'Charlie']) AS employee_name;
    
    -- 结果
    employee_name
    --------------
    Alice
    Bob
    Charlie
    
  • ARRAY_AGG: 将多行数据聚合为数组。

    -- 查询语句:将所有部门名称聚合为一个数组
    SELECT ARRAY_AGG(department_name) AS departments_array FROM departments;
    
    -- 结果
    departments_array
    -------------------------------
    {Sales,Marketing,HR,IT,Finance}
    
  • CARDINALITY: 返回数组的元素数量。

    -- 查询语句:获取数组的元素数量
    SELECT CARDINALITY(ARRAY[1, 2, 3, 4, 5]) AS array_size;
    
    -- 结果
    array_size
    -----------
    5
    
  • ARRAY_CONTAINS: 检查数组是否包含指定元素。

    -- 查询语句:检查数组是否包含元素3
    SELECT 3 = ANY(ARRAY[1, 2, 3, 4, 5]) AS contains_element;
    
    -- 结果
    contains_element
    ----------------
    t
    

9. 类型转换函数

类型转换函数用于在不同数据类型之间进行转换,确保数据在存储和处理时具有正确的类型。这些函数在数据清洗和预处理过程中非常重要。

  • CAST: 将一个值显式转换为指定类型。

    -- 查询语句:将字符串转换为整数
    SELECT CAST('123' AS INTEGER) AS integer_value;
    
    -- 结果
    integer_value
    --------------
    123
    
  • ::(类型转换运算符): 另一种类型转换的简写形式。

    -- 查询语句:将字符串转换为日期
    SELECT '2024-09-03'::DATE AS date_value;
    
    -- 结果
    date_value
    ------------
    2024-09-03
    
  • TO_CHAR: 将数字或日期转换为字符串,支持格式化。

    -- 查询语句:将数字格式化为带有千位分隔符的字符串
    SELECT TO_CHAR(1234567.89, 'FM9,999,999.00') AS formatted_number;
    
    -- 结果
    formatted_number
    -----------------
    1,234,567.89
    
  • TO_NUMBER: 将字符串转换为数字,支持解析格式化的字符串。

    -- 查询语句:将格式化字符串转换为数字
    SELECT TO_NUMBER('1,234,567.89', 'FM9,999,999.00') AS numeric_value;
    
    -- 结果
    numeric_value
    --------------
    1234567.89
    
  • TO_TIMESTAMP: 将字符串转换为时间戳,支持指定格式。

    -- 查询语句:将字符串转换为时间戳
    SELECT TO_TIMESTAMP('2024-09-03 14:30:00', 'YYYY-MM-DD HH24:MI:SS') AS timestamp_value;
    
    -- 结果
    timestamp_value
    ------------------------
    2024-09-03 14:30:00+00
    
  • TO_DATE: 将字符串转换为日期,支持指定格式。

    -- 查询语句:将字符串转换为日期
    SELECT TO_DATE('03-09-2024', 'DD-MM-YYYY') AS date_value;
    
    -- 结果
    date_value
    ------------
    2024-09-03
    

10. 条件函数

条件函数用于在SQL查询中实现条件逻辑,类似于编程语言中的if-else结构。这些函数可以根据不同的条件返回不同的结果,增强查询的灵活性和智能性。

  • CASE WHEN: 实现条件判断,根据条件返回不同的值。

    -- 查询语句:根据员工工资等级返回相应的级别描述
    SELECT
      employee_name,
      salary,
      CASE
        WHEN salary >= 15000 THEN 'High'
        WHEN salary >= 10000 THEN 'Medium'
        ELSE 'Low'
      END AS salary_level
    FROM employees;
    
    -- 结果
    employee_name | salary | salary_level
    --------------+--------+--------------
    Alice         | 16000  | High
    Bob           | 11000  | Medium
    Charlie       | 8000   | Low
    
  • NULLIF: 如果两个参数相等,返回NULL,否则返回第一个参数。

    -- 查询语句:如果销售额为0,返回NULL,否则返回销售额
    SELECT NULLIF(sales, 0) AS adjusted_sales FROM sales_data;
    
    -- 结果
    adjusted_sales
    ---------------
    NULL
    5000
    10000
    
  • COALESCE: 返回参数列表中第一个非NULL的值。

    -- 查询语句:获取员工的联系邮箱,如果没有则使用默认邮箱
    SELECT COALESCE(personal_email, work_email, 'noemail@example.com') AS contact_email FROM employees;
    
    -- 结果
    contact_email
    ----------------------
    alice@personal.com
    bob@work.com
    noemail@example.com
    
  • GREATEST: 返回参数列表中的最大值。

    -- 查询语句:获取每个员工的最高评分
    SELECT employee_name, GREATEST(score1, score2, score3) AS highest_score FROM performance_reviews;
    
    -- 结果
    employee_name | highest_score
    --------------+---------------
    Alice         | 95
    Bob           | 88
    Charlie       | 92
    
  • LEAST: 返回参数列表中的最小值。

    -- 查询语句:获取每个员工的最低评分
    SELECT employee_name, LEAST(score1, score2, score3) AS lowest_score FROM performance_reviews;
    
    -- 结果
    employee_name | lowest_score
    --------------+--------------
    Alice         | 85
    Bob           | 78
    Charlie       | 80
    

通过对这些函数讲解,你可以更好地理解PostgreSQL的丰富功能,并在不同的场景下选择合适的函数来提高查询效率和数据处理能力。

  • 33
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TechCraft

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值