Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

PostgreSQL 数据形态

下面是SQL 查询结果的所有常见数据形态,比“单个数据、单行数据、单列数据、多行数据”更全面,并且每一种都附带 PostgreSQL 示例 SQL,让你一目了然。

✅ SQL 查询结果的 10 种常见数据形态(含 PostgreSQL 示例)

1. 单个数据(Single Value)

通常是聚合函数或表达式返回一个值。

示例

SELECT COUNT(*) AS total FROM users;

2. 单行数据(Single Row)

返回一行,多列。

示例

SELECT id, name, email 
FROM users 
WHERE id = 1001;

3. 单列数据(Single Column, Multi-row)

一列多行,如查询所有用户名。

示例

SELECT name FROM users;

4. 多行多列(Typical Result Set)

典型表格查询。

示例

SELECT id, name, age 
FROM users 
WHERE age >= 18;

🆕 扩展的查询结果类型(更高级)

5. 多个结果集(Multiple Result Sets)

PostgreSQL 可以在 DO $$、plpgsql 或 psql 下返回多个结果集(不像 MySQL 那么常见,但支持)。

示例(PL/pgSQL)

DO $$
BEGIN
    RAISE NOTICE 'First Result:';
    PERFORM * FROM users LIMIT 1;

    RAISE NOTICE 'Second Result:';
    PERFORM * FROM orders LIMIT 1;
END $$;

6. JSON(单值 / 单行 / 多行嵌套结构)

PostgreSQL 的 JSON 非常强大,可返回 JSON 对象或数组。

单个 JSON 对象(Row -> JSON)

SELECT row_to_json(u) 
FROM (SELECT id, name, age FROM users WHERE id = 1) AS u;

JSON 数组(Rows -> JSON Array)

SELECT json_agg(u)
FROM (
    SELECT id, name, age FROM users LIMIT 10
) AS u;

7. 数组(Array Result)

PostgreSQL 原生支持数组类型。

示例

SELECT ARRAY(SELECT id FROM users WHERE age > 18);

8. 标量列表聚合(String Aggregation)

使用 string_agg 聚合成字符串。

示例

SELECT string_agg(name, ', ') AS names
FROM users;

9. 表函数结果(Set Returning Function, SRF)

查询结果来自函数,可能是多行多列。

示例:自定义函数返回表

CREATE OR REPLACE FUNCTION get_active_users()
RETURNS TABLE(id int, name text)
AS $$
BEGIN
    RETURN QUERY
    SELECT id, name FROM users WHERE active = TRUE;
END;
$$ LANGUAGE plpgsql;

SELECT * FROM get_active_users();

10. CTE(公用表达式)结果(可以构成逻辑视图)

本质也是一个结果集,但便于多步骤处理。

示例

WITH adult_users AS (
    SELECT id, name, age FROM users WHERE age >= 18
)
SELECT * FROM adult_users WHERE age < 30;

11. 透视 / 反透视(Pivot / Unpivot)

结果是动态列或透视结构。

示例(Pivot)

SELECT * FROM crosstab(
    'SELECT user_id, order_status, COUNT(*)
     FROM orders
     GROUP BY user_id, order_status'
) AS ct (user_id int, pending int, paid int, canceled int);

12. 窗口函数结果(Window Function Result)

字段中包含行间计算结果,如排名、累计和。

示例

SELECT
    id,
    amount,
    SUM(amount) OVER (ORDER BY id) AS running_total
FROM orders;

13. 复合类型(Composite Type)

返回一列,但该列是结构体(类似 struct)。

示例

SELECT (id, name) AS user_info FROM users LIMIT 1;

14. 行转列 / 列转行(Row Expanding / Column Expanding)

jsonb_each, unnest 等会变形结构。

示例(数组展开为多行)

SELECT unnest(tags) FROM articles;

📌 总结图(常见查询结果形态)

数据形态 描述 示例
单个数据 单值 SELECT COUNT(*)
单行数据 一行多列 SELECT * FROM users WHERE id=1
单列数据 一列多行 SELECT name FROM users
多行多列 表格 SELECT * FROM users
JSON JSON 对象或数组 json_agg
数组 PostgreSQL 数组 ARRAY(SELECT id…)
字符串聚合 将多行连接 string_agg
多个结果集 一个执行返回多个集合 PL/pgSQL
表函数 从函数返回表 SRF
CTE 中间结果集 WITH …
Pivot 透视表 crosstab
窗口函数 行间计算 SUM() OVER
Composite 复合类型 字段中包含多值 (id, name)
行/列展开 unnest/jsonb_each unnest()