PostgreSQL 特色功能
掌握 JSON 类型的使用
了解数组类型操作
了解全文搜索、CTE 等高级特性
核心讲解
(1)JSON/JSONB 类型
PG 原生支持 JSON 类型,尤其是 jsonb,二进制存储,支持索引,查询性能好,是 PG 的核心优势之一。
json:文本存储,写入快,查询慢
jsonb:二进制存储,写入稍慢,查询快,支持索引,推荐用
操作符:
->:获取 JSON 字段,返回 json->>:获取 JSON 字段,返回文本#>:按路径获取
(2)数组类型
PG 支持数组字段,int []、text [] 等,适合标签、多值属性。
定义:
字段名 类型[]赋值:
'{1,2,3}'或者ARRAY[1,2,3]访问:
数组[下标],下标从 1 开始操作:
&&重叠、@>包含
(3)其他特色
全文搜索:内置全文检索,不用额外装 ES
CTE 公用表表达式:
WITH子句,复杂查询分层写,清晰可读窗口函数:分组内计算排名、累计等,功能强大
PostGIS:空间地理信息扩展,GIS 领域标准
代码示例
-- ===== JSONB 示例 =====
CREATE TABLE product (
id serial PRIMARY KEY,
name varchar(100),
attrs jsonb -- 属性用JSON存
);
-- 插入JSON数据
INSERT INTO product(name, attrs) VALUES
('手机', '{"color":"黑色", "memory":"128G", "price": 3999}'),
('电脑', '{"color":"银色", "memory":"16G", "price": 5999, "cpu":"i5"}');
-- 查询JSON字段
SELECT
name,
attrs ->> 'color' AS color,
(attrs ->> 'price')::int AS price
FROM product;
-- 按JSON条件查询
SELECT * FROM product WHERE attrs ->> 'color' = '黑色';
-- 创建GIN索引加速JSON查询
CREATE INDEX idx_attrs ON product USING GIN (attrs);
-- ===== 数组示例 =====
CREATE TABLE article (
id serial PRIMARY KEY,
title varchar(200),
tags text[] -- 标签数组
);
INSERT INTO article(title, tags) VALUES
('PG入门', '{"数据库","SQL","教程"}'),
('Java开发', '{"Java","后端","编程"}');
-- 查询包含数据库标签的
SELECT * FROM article WHERE tags @> ARRAY['数据库'];
-- ===== CTE 示例 =====
WITH class_stu AS (
SELECT class_id, COUNT(*) AS num
FROM student
GROUP BY class_id
)
SELECT c.class_name, cs.num
FROM class c
JOIN class_stu cs ON c.id = cs.class_id;
常见误区
什么都存 JSON:关系型字段还是用普通字段,扩展属性、变化多的才用 JSON
JSON 和 JSONB 分不清:绝大多数场景推荐 jsonb,查询快,支持索引
数组下标从 0 开始:PG 数组下标从 1 开始,和很多语言不一样
课后练习
创建用户表,扩展信息用 jsonb 存储
按扩展信息里的城市查询用户
给文章表加标签数组字段,查询包含指定标签的文章
了解窗口函数的用法,举例说明适用场景

