PostgreSQL 数据形态
下面是SQL 查询结果的所有常见数据形态,比“单个数据、单行数据、单列数据、多行数据”更全面,并且每一种都附带 PostgreSQL 示例 SQL,让你一目了然。
通常是聚合函数或表达式返回一个值。
示例
SELECT COUNT(*) AS total FROM users;
返回一行,多列。
示例
SELECT id, name, email
FROM users
WHERE id = 1001;
一列多行,如查询所有用户名。
示例
SELECT name FROM users;
典型表格查询。
示例
SELECT id, name, age
FROM users
WHERE age >= 18;
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 $$;
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;
PostgreSQL 原生支持数组类型。
示例
SELECT ARRAY(SELECT id FROM users WHERE age > 18);
使用 string_agg 聚合成字符串。
示例
SELECT string_agg(name, ', ') AS names
FROM users;
查询结果来自函数,可能是多行多列。
示例:自定义函数返回表
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();
本质也是一个结果集,但便于多步骤处理。
示例
WITH adult_users AS (
SELECT id, name, age FROM users WHERE age >= 18
)
SELECT * FROM adult_users WHERE age < 30;
结果是动态列或透视结构。
示例(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);
字段中包含行间计算结果,如排名、累计和。
示例
SELECT
id,
amount,
SUM(amount) OVER (ORDER BY id) AS running_total
FROM orders;
返回一列,但该列是结构体(类似 struct)。
示例
SELECT (id, name) AS user_info FROM users LIMIT 1;
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() |