Glittering's blog Glittering's blog
Home
  • 学习手册

    • 《TypeScript教程》
    • 《Git》
    • 《Vite》
    • 《Vue3》
    • 《React18》
    • 《CSS》
    • 《Tailwind CSS》
  • 技术文档
  • 算法
  • 工作总结
  • 实用技巧
  • collect
About
  • Classification
  • Label
GitHub (opens new window)

Glitz Ma

前端开发工程师
Home
  • 学习手册

    • 《TypeScript教程》
    • 《Git》
    • 《Vite》
    • 《Vue3》
    • 《React18》
    • 《CSS》
    • 《Tailwind CSS》
  • 技术文档
  • 算法
  • 工作总结
  • 实用技巧
  • collect
About
  • Classification
  • Label
GitHub (opens new window)
  • 技术文档

  • 算法

  • 工作总结

    • 时区校正
    • 上传下载文件方式总结
    • web异常监控和分析
    • 前端优化指南
    • http缓存机制
    • 静态资源灰度发布
    • 浏览器原理及渲染机制
    • Chrome DevTools 渲染分析实战
    • Layout Thrashing(布局抖动)
    • Composite Layer(合成层)
    • 全局设置滚动条样式好吗?
    • 虚拟列表如何避免Layout和Paint
    • 前端安全知识
    • 安全(同源策略 / CSP / CORS)
    • 浏览器安全模型
    • 从chrome v8 讲安全
    • WebAssembly(Wasm)
    • XSS → JIT → 沙箱逃逸
    • 微前端总结
    • websocket聊天
    • Uni-app基础知识
    • react16高级特性
    • react16基础知识总结
    • vue2常见原理总结
    • vue2基础知识总结
    • webpack优化实践
    • webpack基础应用知识总结
    • Agent Skills是什么?跟MCP Workflow Command Prompt的关系。
    • 从cnn到transformer全解大模型
    • 什么是 Encoder 和 Decoder 结构
    • GPT 为什么能“看懂”问题
    • GPT 是怎么学会数学的
    • RAG 和 Agent的区别
    • context engineering 技术介绍
    • HarnessEngineering 驾驭工程的概念
    • GIS 基础三件套
    • GIS必会知识点
    • 100 万点地图怎么渲染?
    • GIS空间索引的实现
    • Cesium 从入门到精通:实战指南
    • OpenLayers 从零到精通:2025-2026实战指南
    • Mapbox GL JS 从零到精通:2025-2026实战指南
    • Cesium、OpenLayers 和 Mapbox GL JS 的关系、区别
    • 容器领域必学的黄金组合
    • 小程序笔记
    • 小程序工程模板设计
    • 地图标绘--射线法来计算点在多边形内
    • Postgres基础知识学习
      • 一、PostgreSQL 类型系统整体结构
      • 二、基础数据类型(Standard SQL Types)
        • 1 数值类型 (Numeric Types)
        • 2 自增类型
        • 3 字符串类型
        • 4 二进制类型
        • 5 日期时间类型
        • 6 Boolean 类型
      • 三、Postgres 特有类型(特色能力)
      • 1 JSON / JSONB 类型
        • jsonpath 查询
      • 2 Array 类型
      • 3 Range 类型
      • 4 Multirange
      • 5 UUID 类型
      • 6 Network 类型
      • 7 几何类型
      • 8 全文检索类型
      • 9 XML 类型
      • 10 Domain 类型
      • 11 Composite 类型
      • 四、高级查询能力
      • 1 CTE(Common Table Expression)
      • 2 递归查询(Recursive Query)
      • 3 Window Functions
      • 4 LATERAL 查询
      • 5 JSON 查询
      • 6 ARRAY 查询
      • 7 Range 查询
      • 8 Full Text Search
      • 五、Postgres 类型系统设计思想
        • 1 强类型系统
        • 2 可扩展
        • 3 多模型数据库
      • 六、总结
        • 基础类型
        • 特有类型
    • Postgres查询相关知识
  • 实用技巧

  • 收藏夹

  • 技术
  • 工作总结
mamingjuan
2026-03-16
目录

Postgres基础知识学习

# 一、PostgreSQL 类型系统整体结构

PostgreSQL 的类型系统非常丰富,并允许用户通过 CREATE TYPE 定义新的数据类型。 (PostgreSQL (opens new window))

官方类型体系大致分为:

基础类型(Standard SQL Types)
│
├─ 数值类型
├─ 字符类型
├─ 日期时间
├─ 布尔类型
│
Postgres 特有类型
│
├─ JSON / JSONB
├─ Array
├─ Range / Multirange
├─ Geometric
├─ Network Address
├─ UUID
├─ Full-Text Search
├─ XML
│
复杂类型
│
├─ Composite
├─ Domain
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

Postgres 设计目标之一是:

让数据库不仅仅是关系数据,还支持多模型数据结构。


# 二、基础数据类型(Standard SQL Types)

这些类型基本符合 SQL 标准。

# 1 数值类型 (Numeric Types)

类型 描述
smallint 2字节整数
integer 4字节整数
bigint 8字节整数
numeric(p,s) 任意精度数
real 单精度浮点
double precision 双精度浮点

示例:

CREATE TABLE products (
  id SERIAL,
  price NUMERIC(10,2),
  stock INTEGER
);
1
2
3
4
5

特点:

  • numeric 用于 金融计算
  • float 用于 科学计算

# 2 自增类型

Postgres提供:

serial
smallserial
bigserial
1
2
3

本质:

sequence + default
1

例如:

id SERIAL
1

等价:

CREATE SEQUENCE
DEFAULT nextval()
1
2

# 3 字符串类型

类型 说明
char(n) 固定长度
varchar(n) 可变长度
text 无限长度

推荐实践:

text = varchar
1

Postgres 不限制 text 性能。


# 4 二进制类型

bytea
1

用于:

  • 文件
  • 图片
  • 二进制数据

示例:

INSERT INTO files(data)
VALUES (decode('FFD8FFE0','hex'));
1
2

# 5 日期时间类型

类型 说明
date 日期
time 时间
timestamp 日期时间
timestamptz 带时区时间
interval 时间间隔

示例:

SELECT now();
1

推荐:

timestamptz
1

避免时区问题。


# 6 Boolean 类型

boolean
1

值:

true
false
null
1
2
3

示例:

SELECT TRUE;
1

# 三、Postgres 特有类型(特色能力)

这些类型是 Postgres 成为 多模型数据库 的关键。


# 1 JSON / JSONB 类型

Postgres 提供:

json
jsonb
1
2

区别:

类型 特点
json 文本存储
jsonb 二进制解析存储

jsonb:

  • 查询更快
  • 支持索引 (PostgreSQL (opens new window))

示例:

CREATE TABLE users (
  id INT,
  profile JSONB
);
1
2
3
4

插入:

INSERT INTO users VALUES
(1,'{"name":"tom","age":20}');
1
2

查询字段:

SELECT profile->>'name'
FROM users;
1
2

JSONB 操作符:

操作符 含义
-> JSON对象
->> 文本
@> 包含
? key存在

示例:

SELECT *
FROM users
WHERE profile @> '{"age":20}';
1
2
3

# jsonpath 查询

Postgres 支持 SQL/JSON Path:

SELECT jsonb_path_query(profile,'$.name')
FROM users;
1
2

支持:

wildcard
recursive search
array access
1
2
3

# 2 Array 类型

Postgres 支持数组列。

CREATE TABLE posts(
  tags TEXT[]
);
1
2
3

插入:

INSERT INTO posts VALUES
('{react,frontend}');
1
2

访问元素:

SELECT tags[1]
FROM posts;
1
2

查询数组:

SELECT *
FROM posts
WHERE 'react' = ANY(tags);
1
2
3

数组搜索:

SELECT *
FROM posts
WHERE tags @> ARRAY['react'];
1
2
3

官方提示:

数组不是集合模型。


# 3 Range 类型

Postgres 独有。

表示:

区间
1

例如:

时间段
数值范围
1
2

内置 range:

int4range
int8range
numrange
tsrange
tstzrange
daterange
1
2
3
4
5
6

示例:

CREATE TABLE booking(
  period TSRANGE
);
1
2
3

插入:

INSERT INTO booking VALUES
('[2024-01-01,2024-01-10]');
1
2

判断重叠:

SELECT *
FROM booking
WHERE period && '[2024-01-05,2024-01-07]';
1
2
3

优点:

自动处理区间逻辑
1

# 4 Multirange

一个字段表示多个区间。

{[1,5),[10,20)}
1

用于:

时间碎片
库存时间段
1
2

# 5 UUID 类型

唯一标识:

uuid
1

示例:

SELECT gen_random_uuid();
1

优点:

分布式 ID
1

# 6 Network 类型

网络地址支持:

类型
inet
cidr
macaddr

示例:

SELECT inet '192.168.0.1';
1

用途:

IP日志
网络系统
1
2

# 7 几何类型

Postgres 内置几何计算:

类型
point
line
circle
polygon
box

示例:

SELECT point '(1,2)';
1

用于:

简单 GIS
1

# 8 全文检索类型

支持搜索:

类型
tsvector
tsquery

示例:

SELECT to_tsvector('postgres is awesome');
1

查询:

SELECT *
FROM articles
WHERE to_tsvector(content)
@@ to_tsquery('postgres');
1
2
3
4

# 9 XML 类型

xml
1

示例:

SELECT xpath('/book/title', xmlcol);
1

# 10 Domain 类型

Domain 是:

带约束的类型
1

示例:

CREATE DOMAIN email AS TEXT
CHECK (VALUE LIKE '%@%');
1
2

# 11 Composite 类型

类似:

struct
1

示例:

CREATE TYPE address AS (
  city TEXT,
  zip TEXT
);
1
2
3
4

使用:

CREATE TABLE users(
  addr address
);
1
2
3

# 四、高级查询能力

Postgres 查询能力非常强。


# 1 CTE(Common Table Expression)

WITH
1

示例:

WITH recent_orders AS (
  SELECT *
  FROM orders
  WHERE created_at > now() - interval '7 days'
)
SELECT *
FROM recent_orders;
1
2
3
4
5
6
7

优点:

可读性
模块化SQL
1
2

# 2 递归查询(Recursive Query)

用于:

树
图
组织架构
1
2
3

示例:

WITH RECURSIVE tree AS (
  SELECT id,parent_id
  FROM category
  WHERE id=1

  UNION ALL

  SELECT c.id,c.parent_id
  FROM category c
  JOIN tree t ON c.parent_id=t.id
)
SELECT * FROM tree;
1
2
3
4
5
6
7
8
9
10
11
12

# 3 Window Functions

窗口函数是 Postgres 强项。

示例:

SELECT
  id,
  salary,
  rank() OVER (ORDER BY salary DESC)
FROM employees;
1
2
3
4
5

常见:

rank()
dense_rank()
row_number()
lag()
lead()
sum() OVER
1
2
3
4
5
6

# 4 LATERAL 查询

LATERAL 允许子查询引用前表。

SELECT *
FROM users
CROSS JOIN LATERAL
jsonb_each(users.profile);
1
2
3
4

常用于:

JSON拆解
数组展开
1
2

# 5 JSON 查询

Postgres JSON 查询非常强。

示例:

SELECT *
FROM orders
WHERE data->'customer'->>'name' = 'Tom';
1
2
3

数组展开:

SELECT jsonb_array_elements(items)
FROM orders;
1
2

# 6 ARRAY 查询

SELECT unnest(tags)
FROM posts;
1
2

展开数组。


# 7 Range 查询

判断包含:

SELECT *
FROM booking
WHERE period @> timestamp '2024-01-05';
1
2
3

判断重叠:

&&
1

# 8 Full Text Search

SELECT *
FROM docs
WHERE to_tsvector(content)
@@ to_tsquery('database & postgres');
1
2
3
4

# 五、Postgres 类型系统设计思想

核心思想:

# 1 强类型系统

比 MySQL 强。

例如:

range
json
array
network
geometry
1
2
3
4
5

# 2 可扩展

用户可以:

CREATE TYPE
1

扩展:

  • PostGIS
  • pgvector
  • citext

# 3 多模型数据库

支持:

relational
document
graph
search
GIS
1
2
3
4
5

# 六、总结

Postgres 类型系统 + 查询能力 = 非常强。

核心能力:

# 基础类型

numeric
string
date/time
boolean
binary
1
2
3
4
5

# 特有类型

JSONB
Array
Range
UUID
Network
Geometric
Full Text
XML
Composite
Domain
1
2
3
4
5
6
7
8
9
10
上次更新: 2026/03/16, 05:02:15
地图标绘--射线法来计算点在多边形内
Postgres查询相关知识

← 地图标绘--射线法来计算点在多边形内 Postgres查询相关知识→

Copyright © 2015-2026 Glitz Ma
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式