-- JSON/JSONB(比 MySQL 强大很多) CREATETABLE events ( id SERIAL PRIMARY KEY, payload JSONB ); -- JSONB 支持索引和高级查询 CREATE INDEX idx_payload ON events USING GIN (payload);
-- 网络地址类型 CREATETABLE servers ( ip INET, -- IPv4/IPv6 mac MACADDR -- MAC 地址 );
-- 枚举类型 CREATE TYPE order_status AS ENUM ('pending', 'paid', 'shipped', 'completed'); CREATETABLE orders ( id SERIAL PRIMARY KEY, status order_status DEFAULT'pending' );
-- CTE(公用表表达式) WITH user_orders AS ( SELECT user_id, COUNT(*) as order_count, SUM(amount) as total FROM orders WHERE created_at >='2025-01-01' GROUPBY user_id ) SELECT u.name, uo.order_count, uo.total FROM users u JOIN user_orders uo ON u.id = uo.user_id ORDERBY uo.total DESC;
-- 递归查询(MySQL 8.0 才支持,PG 诞生就有) WITHRECURSIVE category_tree AS ( -- 根节点 SELECT id, name, parent_id, 1as level FROM categories WHERE parent_id ISNULL
UNIONALL
-- 递归子节点 SELECT c.id, c.name, c.parent_id, ct.level +1 FROM categories c JOIN category_tree ct ON c.parent_id = ct.id ) SELECT*FROM category_tree ORDERBY level, id;
-- 排名 SELECT name, department, salary, RANK() OVER (PARTITIONBY department ORDERBY salary DESC) as dept_rank, DENSE_RANK() OVER (ORDERBY salary DESC) as overall_rank FROM employees;
-- 移动平均 SELECT date, amount, AVG(amount) OVER (ORDERBYdateROWSBETWEEN6 PRECEDING ANDCURRENTROW) as moving_avg_7d FROM daily_sales;
-- 累计求和 SELECT date, amount, SUM(amount) OVER (ORDERBYdate) as cumulative FROM monthly_revenue;
全文搜索
1 2 3 4 5 6 7 8 9
-- 创建全文搜索索引 CREATE INDEX idx_articles_search ON articles USING GIN (to_tsvector('simple', title ||' '|| content));
-- 搜索 SELECT id, title, ts_rank(to_tsvector('simple', title ||' '|| content), plainto_tsquery('simple', 'postgresql 教程')) as rank FROM articles WHERE to_tsvector('simple', title ||' '|| content) @@ plainto_tsquery('simple', 'postgresql 教程') ORDERBY rank DESC;